(Кодовая часть этой статьи написана на numpy)
В прогнозировании линейной регрессии самым простым является решение в закрытой форме, также известное как аналитическое решение.
Некоторые строгие формулы по любой независимой переменной могут найти ее зависимую переменную, то есть решение задачи, например простейшее одномерное линейное уравнение в нашей средней школе:
у = шх + б
Однако в реальном прогнозе часто бывают некоторые отклонения.Мы добавим параметр ошибки e, и формула станет такой:
y = wx + b + e
Однако на практике мы знаем только некоторые прошлые входы x и соответствующие выходы y, Затем позвольте вам предсказать результат входящего ввода, как в следующем атласе:
Тогда возникает вопрос, откуда мы знаем значения w и b?
Чтобы ответить на этот вопрос, мы можем построить функцию потерь loss
loss = ∑(wx + b - y)
Чем меньше потеря, тем точнее предсказание функции, Когда потеря наименьшая, ее w и b - это то, что нам нужно.
Мы должны знать, что наклон функции всегда указывает на точку максимума функции, как показано на рисунке:
Тогда мы можем построить формулу w.b:
w = ∑(w - lr * dloss/dw)
b = ∑(b - lr * dloss/db)
Где lr — размер шага, повышающий точность w и b.
Процесс нахождения минимального значения потерь является итерационным процессом, когда наклоны w и b положительны, w и b будут уменьшаться, и наоборот.
Стоит отметить, что не будет самого точного значения, и убыток будет колебаться только вокруг небольшого значения.
код показывает, как показано ниже:
import numpy as np
#更新wbdef step_gradient(data, w, b, learn_rate):
data_length = len(data)
w_gradient, b_gradient = 0,0
for i in range(data_length):
x = data[i, 0]
y = data[i, 1]
#求w b偏导
w_gradient += (2 / data_length) * (w*x + b - y) * x
b_gradient += (2 / data_length) * (w*x + b - y)
new_w = w - (w_gradient * learn_rate)
new_b = b - (b_gradient * learn_rate)
return new_w,new_b
#迭代次数
def gradient_descent_runner(data, w, b, learn_rate, num_iteration = 0):
data_length = len(data)
total_loss = 0
for i in range(num_iteration):
w, b = step_gradient(data, w, b,learn_rate)
return w, b
#计算损失
def compute_error_for_line_given_points(data, w, b, learn_rate):
data_length = len(data)
total_loss = 0
for i in range(data_length):
w,b = step_gradient(data, w, b, learn_rate)
x = data[i, 0]
y = data[i, 1]
total_loss += ((x*w + b) - y) ** 2
return total_loss /data_lengthdef run():
data = np.genfromtxt("H:\机器学习\linear_regression_data\data.csv",delimiter=",")
learning_rate = 0.0001
inital_b = 0
init_w = 0
print("the number_itertation is : 0, the loss is {0},the w and b is {1},{2}".format(compute_error_for_line_given_points(data, init_w, inital_b, learning_rate), 0, 0))
w,b = gradient_descent_runner(data, init_w, inital_b, learning_rate, 1000)
print("the number_itertation is : 1000, the loss is {0},the w and b is {1},{2}".format(compute_error_for_line_given_points(data, w, b, learning_rate), w, b))
if __name__ == '__main__':
run()
Суммировать:
Задача линейной регрессии в основном состоит в том, чтобы решить параметры w, b, и решение w, b должно продвигаться в обратном направлении наклона, чтобы достичь минимального диапазона потерь.