предисловие
Недавно я начал обобщать материал, связанный с регрессией обучения, В отличие от целевой переменной классификации, которая является номинальным типом, регрессия — это предсказание непрерывных данных. Конечно, мы по-прежнему начинаем с простейшей линейной регрессии, Эта статья в основном знакомит с теоретическими основами несмещенной стандартной линейной регрессии и смещенной частично взвешенной линейной регрессии, а также с соответствующей реализацией Python.
Стандартная линейная регрессия
Теоретические знания о стандартной линейной регрессии очень просты: мы можем записать ее скалярное выражение или матричную форму, а матричную форму также можно получить с помощью проекционной матрицы. В этом разделе кратко выводится выражение стандартной линейной регрессии.
Учитывая набор данных, включая матрицу признаков X, вектор целевой переменной y:
Первый столбец X — это член пересечения Мы выполняем линейную регрессию, чтобы получить оптимальный вектор коэффициентов регрессии w, чтобы, когда мы задаем x, мы могли предсказать значение y через y = xw. в
Метод наименьших квадратов для получения коэффициентов регрессии
Итак, какой тип w оптимален? В стандартной линейной регрессии нам нужно найти w с наименьшей ошибкой, то есть разницей между предсказанным значением y и реальным значением y. Чтобы избежать положительных и отрицательных различий, вызванных простым накоплением, квадрат ошибки равен используется здесь:
Для приведенной выше формулы F(W) оптимальное решение может быть получено с помощью такого метода, как градиент или тому подобное. Но использование матрицы указывает на то, что решение и программа проще:
Дифференцирование f(w) по w дает:
Сделайте его равным 0, чтобы получить:
Получить коэффициенты регрессии по матрице проекций
Помимо вывода выражения w методом наименьших квадратов, мы можем также получить его с помощью проекционной матрицы (Projection Matrix).
Мы знаем, что если мы сможем найти aw такое, что Xw=y, безусловно, будет лучшим, но на практике y вообще не находится в пространстве столбцов матрицы X, то есть это уравнение не имеет решения, поэтому мы надеемся, что, проецируя вектор y to Проекционная матрица p получается в пространстве столбцов X, а затем Xw=p решается для получения ближайшего решения. Проекционная матрица матрицы X имеет вид
Тогда проекция y в пространстве столбца X получается как
В это время уравнение Xw=p имеет решение, и наиболее близким к Xw=y решением является:
Реализация Python стандартной линейной регрессии
Через матричную форму мы можем легко выполнять матричные операции через интерфейс Numpy, чтобы получить вектор коэффициентов линейной регрессии ŵ, который реализован следующим образом:
def std_linreg(X, Y):
xTx = X.T*X
if np.linalg.det(xTx) == 0:
print('xTx is a singular matrix')
return
return xTx.I*X.T*Y
Следующий рисунок получается путем выполнения стандартной линейной регрессии на существующих данных и рисования линии регрессии (полный код и данные см.GitHub.com/pgirllab/ml БО…)
w = [3.00774324, 1.69532264]
Расчет коэффициента корреляции
Как судить о предсказательной способности полученной модели? Нам нужно рассчитать степень соответствия между вектором значений yy, рассчитанным моделью, и фактическим вектором значений yy, то есть вычислить коэффициент корреляции Коэффициент корреляции.
Формула расчета коэффициента корреляции:
Другими словами, ковариация двух рядов данных делится на их соответствующие стандартные отклонения, что по существу является специальной ковариацией после исключения размерного влияния двух переменных и стандартизации.
Ковариация — это метод измерения сходства тренда двух переменных, изменения одного и того же направления (одновременное увеличение или уменьшение) или обратного изменения (один становится больше, а другой уменьшается), степени изменения. то же направление или противоположное направление Как, формула расчета выглядит следующим образом:
Из формулы видно, что если для каждого x и y в векторе оба больше или меньше их соответствующих ожидаемых значений, ковариация положительна, в противном случае она отрицательна. Видно, что чем больше ковариация, тем выше сходство, а чем меньше ковариация, тем меньше сходство. Также видно, что если X, Y одинаковы, то ковариация является дисперсией, то есть дисперсия является ковариацией в частном случае.
Популярное объяснение ковариации и коэффициента корреляции см. в ответе на Zhihu:Как доступно объяснить понятия «ковариация» и «коэффициент корреляции»?
Хотя у Numpy есть интерфейс для расчета ковариацииnumpy.corrcoef
, заключается в сравнении двух векторов и вычислении ковариации для получения ковариационной матрицы. Ради практики я немного сам посчитал ковариацию и просто вычислил коэффициент корреляции между двумя разными столбцами данных:
def get_corrcoef(X, Y):
# X Y 的协方差
cov = np.mean(X*Y) - np.mean(X)*np.mean(Y)
return cov/(np.var(X)*np.var(Y))**0.5
Вычисляя коэффициент корреляции между прогнозируемым значением, полученным с помощью модели линейной регрессии, полученной выше, и фактическим значением, коэффициент корреляции может быть получен как
Correlation coeffient: 0.9864735622335125
Локальная взвешенная линейная регрессия
Приведенные выше точки данных представляют собой данные, сгенерированные путем добавления шума к формуле y=3+1,7x+0,1sin(30x), в то время как стандартная линейная регрессия представляет собой несмещенную оценку, которая вычисляет все точки с несмещенной ошибкой вычисления и оптимизирует ошибку с помощью оптимизации. Если ошибку можно скорректировать для разных точек, можно в определенной степени избежать явления недостаточной подгонки, вызванного стандартной линейной регрессией.
То есть ввести смещение, чтобы уменьшить среднеквадратичную ошибку прогноза.В этом разделе обобщается метод локально взвешенной линейной регрессии. Когда мы получим предсказанное значение некоторого xx, нам нужно вычислить коэффициент регрессии w, но для данных в выборке, чем ближе расстояние к x, мы будем давать больший вес, и если расстояние дальше, мы дадим небольшой вес , что сделает прогнозируемое значение ypredict для x более подходящим для данных выборки.
Когда нам нужно предсказать целевое значение, соответствующее точке данных xx, нам нужно присвоить значение веса wi каждой точке в выборке (чтобы отличить вес от коэффициента регрессии, здесь мы используем θ для представления коэффициента регрессии , и w для представления веса), то выражение для квадрата ошибки становится:
Это может быть представлено матрицей как:
Производная f(θ) по θ равна 0, чтобы получить:
С помощью приведенной выше формулы можно рассчитать соответствующий коэффициент регрессии θθ для любых заданных неизвестных данных и получить соответствующее прогнозируемое значение y, где W — диагональная матрица, а элемент wii на диагонали соответствует весу выборки. значение точки xi.
Используйте ядро Гаусса для назначения весов
Итак, каково выражение веса? Нам нужен более высокий вес точки выборки из заданного x. LWRL использует ядро, чтобы придать более высокий вес соседним точкам. Наиболее часто используется функция ядра Гаусса, которая соответствует к выражению следующим образом:
Из формулы видно, что если расстояние между xi и xx меньше, то wii будет больше, а параметр k определяет размер веса. Чем больше k, тем меньше разница между весами Чем меньше k, тем больше разница между весами В расчете коэффициента регрессии участвуют только локальные точки, а остальные веса с более дальними расстояниями стремятся к нулю . Если k стремится к бесконечности, все веса близки к 1, W примерно равно единичной матрице, а локальная взвешенная линейная регрессия становится стандартной несмещенной линейной регрессией, что приведет к недообучению; когда k мало, выборка указывает, что находятся далеко, не могут участвовать в расчете параметров регрессии, что вызовет явление переобучения.
Python-реализация LWLR
Эта часть реализует локальную взвешенную линейную регрессию в Python и получает соответствующие коэффициенты регрессии для заданных данных:
def lwlr(x, X, Y, k):
''' 局部加权线性回归,给定一个点,获取相应权重矩阵并返回回归系数
'''
m = X.shape[0]
# 创建针对x的权重矩阵
W = np.matrix(np.zeros((m, m)))
for i in range(m):
xi = np.array(X[i][0])
x = np.array(x)
W[i, i] = exp((np.linalg.norm(x - xi))/(-2*k**2))
# 获取此点相应的回归系数
xWx = X.T*W*X
if np.linalg.det(xWx) == 0:
print('xWx is a singular matrix')
return
w = xWx.I*X.T*W*Y
return w
Мы регрессируем данные, использованные в предыдущей части, и рисуем кривую регрессии:
Когда k = 0,5, в основном несмещенная стандартная линейная регрессия
Correlation coefficient: 0.9869292425124014
Когда k = 0,1, он может лучше отражать основные законы данных.
Correlation coefficient: 0.997890402610583
Когда k = 0,03, подобранная кривая учитывает явление переобучения, вызванное шумовыми данными.
Correlation coefficient: 0.9995975498285312
Суммировать
В этой статье обобщены основы стандартной линейной регрессии и линейной регрессии с локальным взвешиванием, а также представлены реализации Python для двух методов регрессии. Можно видеть, что локальная взвешенная линейная регрессия может лучше раскрыть внутренний потенциал данных при получении соответствующего k. Однако недостатком локальной взвешенной линейной регрессии является то, что, как и kNN, каждое вычисление прогнозируемого значения a точка должна использовать все выборки данных для расчета. , если объем данных велик, объем вычислений будет проблемой.
Ссылаться на
- «Машинное обучение в действии»
- Как доступно объяснить понятия «ковариация» и «коэффициент корреляции»?
1 лайксобиратьКомментарийВознаграждайте и поддерживайте меня, чтобы я писал больше хороших статей, спасибо!
Наградить автора