Добавить Автора
Монтажер: Эмили
В первые три дня был продвинут метод наименьших квадратов алгоритма машинного обучения линейной регрессии.От гипотезы к принципу, подробно проанализированоРешить напрямуюиградиентный спускДва алгоритма, затем вручную напишите код на Python для реализации алгоритма линейной регрессии.
01 Предварительная обработка данных
После получения набора данных часто требуется пройти длительный процесс предварительной обработки. Не игнорируйте этот шаг, который кажется не относящимся к построению и решению модели. На самом деле это очень важный шаг для подготовки к последующей работе. . Теперь в центре внимания этого раздела не обсуждение метода предварительной обработки, поэтому процесс предварительной обработки не будет здесь подробно описываться, а ключевым примером является моделирование двух решающих методов линейной регрессии наименьших квадратов.
После получения набора данных первые 10 элементов данных, полученных после предварительной обработки, отображаются следующим образом: первый столбец — это площадь дома, второй столбец — возраст дома, а третий столбец — значение дом, который является значением метки. Эти значения были предварительно обработаны.
Площадь дома Срок службы
[[ 0,35291809, 0,16468428, 0,35774628],
[-0,55106013, -0,10981663, 0,25468008],
[-0,65439632, -0,71406955, 0,1061582 ],
[-0,19790689, 0,61536205, 0,43122894],
[-0,00171825, 0,66827656, 0,44198075],
[-0,2739687, -1,16342739, 0,01195186],
[0,11592071, -0,18320789, 0,29397728],
[-0,02707248, -0,53269863, 0,21784183],
[0,7321352, 0,27868019, 0,42643361],
[-0,76680149, -0,89838545, 0,06411818]]
Линейная регрессия решается прямым методом и методом градиентного спуска.
Сначала представим используемую библиотеку:
'импорт библиотеки numpy'
import numpy as np
'импортировать диаграмму'
import matplotlib.pyplot as plt
'модуль времени импорта'
import time
В этом моделировании первые 100 единиц данных в наборе данных используются для итеративного вычисления, то есть m = 100.
Сделайте комбинацию смещения и 2 функций, чтобы она была связана с теоретической частью, выдвинутой ранее, объединенным кодом
Следующее:
'смещение формы b=(100,1)'
b = np.array([1])
b=b.repeat(100)
'объединить смещение с формой 2 собственных значений = (100,3)'
X = np.column_stack((b,X))
02 Решите параметры напрямую
Мы знаем, что когда мы строим модель линейной регрессии, поскольку она является линейной, а член ошибки удовлетворяет распределению Гаусса, формулу расчета параметра веса можно получить напрямую с помощью оценки максимального правдоподобия.Если вы хотите увидеть теоретическую часть , пожалуйста, обратитесь кРешить напрямую:
«Это модуль для нахождения обратной матрицы»
from numpy.linalg import linalg as la
xtx = X.transpose().dot(X)
xtx = la.inv(xtx)
«Найти параметры напрямую»
theta = xtx.dot(X.transpose()).dot(y)
Это решение очень простое, примените непосредственно формулу и найдите параметры веса следующим образом:
array([0.29348374, 0.10224818, 0.19596799])
То есть смещение равно 0,29, параметр веса для первого признака равен 0,10, а параметр веса для второго признака равен 0,195.
Метод градиентного спуска используется для решения задачи ниже.Это является предметом нашего обсуждения.Эта идея согласуется с другими алгоритмами машинного обучения, такими как логистическая регрессия, поэтому ее необходимо тщательно изучить.
03 Градиентный спуск для поиска параметров
Подробное введение в градиентный спуск см.градиентный спускРешая раздел весовых параметров, ниже мы обсудим, как перейти от теории к коду.
Сначала перечислите шаги идеи градиентного спуска, примите модель линейной регрессии, найдите функцию стоимости, а затем найдите градиент, и поиск частной производной является важным шагом, а затем установите параметр итерации скорости обучения, когда функция стоимости предыдущий временной шаг совпадает с текущим.Когда разница функции стоимости меньше порога, расчет заканчивается следующим образом:
-
Модель линейной регрессии, созданная «моделью»
-
функция стоимости «стоимость»
-
формула градиента градиента
-
формула обновления параметра «тета-обновление»
-
«Стратегия остановки» итеративная стратегия остановки: функция стоимости меньше порогового метода
Конкретный код реализации вышеуказанных пяти шагов написан ниже,
'model'
def model(theta,X):
тета = np.массив (тета)
вернуть X.dot (тета)
'cost'
def cost(m,theta,X,y):
'печать (тета)'
ele = y - модель (тета, X)
элемент = элемент**2
item_sum = np.sum (предмет)
вернуть item_sum/2/м
'gradient'
def gradient(m,theta,X,y,cols):
град_тета = []
для j в диапазоне (столбцы):
град = (y-модель (тета, X)). точка (X [:, j])
grad_sum = np.sum (град)
grad_theta.append(-grad_sum/m)
вернуть np.array(grad_theta)
'theta update'
def theta_update(grad_theta,theta,sigma):
вернуть тета - сигма * град_тета
'stop stratege'
def stop_stratege(cost,cost_update,threshold):
возврат cost-cost_update
'OLS algorithm'
def OLS(X,y,threshold):
начало = время.часы()
«Количество образцов»
м=100
'Установить начальное значение параметра веса'
тета = [0,0,0]
«Количество шагов итерации»
итерс = 0;
«Запишите значение функции стоимости»
cost_record=[]
«Скорость обучения»
сигма = 0,0001
cost_val = стоимость (м, тета, X, у)
cost_record.append(cost_val)
пока верно:
град = градиент (м, тета, X, у, 3)
'обновление параметра'
тета = тета_обновление (градус, тета, сигма)
cost_update = стоимость (м, тета, X, у)
Если stop_stratege(cost_val,cost_update,threshold):
ломать
итеры=итеры+1
cost_val = cost_update
cost_record.append(cost_val)
конец = время.часы()
print("Длительность сходимости OLS: %f с" % (конец - начало))
вернуть cost_record, iters, theta
Результаты показывают, что градиентный спуск по МНК первоначально сходился по истечении следующего времени, продолжительность сходимости по МНК: 7,456927 с, и после более чем 30 000 итераций временного шага значение функции стоимости вычисляется на каждом временном шаге, как показано на следующем рисунке. :
При сведении результирующие весовые параметры:
массив ([0,29921652, 0,09754371, 0,1867609])
Видно, что весовые параметры, полученные градиентным спуском, в основном аналогичны полученным прямым методом, а ошибка заключается в отсутствии дальнейшей итерации.
04 Резюме
Выше приведена кодовая реализация двух решений метода наименьших квадратов.До сих пор мы объяснили самые основные OLS алгоритма линейной регрессии из теории, предположения и текущей реализации кода. Давайте посмотрим на море вдалеке и возвышающиеся горы и расслабимся!
Однако между двумя или более столбцами в некоторых наборах данных существует сильная корреляция.Может ли OLS по-прежнему быть компетентным при столкновении с такими наборами данных? Если нет, то в чем причина этого?
Пожалуйста, смотрите завтрашний толчок, дефекты и принципы алгоритма OLS.
Добро пожаловать, чтобы следоватьКанал алгоритма"
Обменивайтесь идеями, сосредоточьтесь на анализе и сосредоточьтесь на процессе, включая, помимо прочего, классические алгоритмы, машинное обучение, глубокое обучение, решение проблем LeetCode, бой Kaggle, английский салон и регулярно приглашайте экспертов в твиттер. С нетерпением ждем вашего приезда!