Глубокое обучение, часть 1: линейная регрессия

Python

(Кодовая часть этой статьи написана на 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 должно продвигаться в обратном направлении наклона, чтобы достичь минимального диапазона потерь.