#linear-regression #linear-algebra #svd #coefficients #singular
#линейная регрессия #линейная алгебра #svd #коэффициенты #сингулярная
Вопрос:
У меня есть проблема регрессии для оценки наклона y = a*x b
, и я попробовал два разных метода a
. Метод 1 оценивает среднее значение двух кластеров данных как две точки, на основе которых a
вычисляется. В методе 2 используется стандартное уравнение регрессии.
import numpy as np
import statistics
# find the slope a of y = a*x b
x = "28.693756 28.850006 28.662506 28.693756 28.756256 28.662506 28.787506
28.818756 28.818756 28.787506 28.787506 28.787506 28.693756 28.787506
28.818756 28.725006 28.725006 28.850006 28.756256 28.725006 28.881256
28.818756 28.756256 28.693756 28.756256 28.787506 28.693756 28.662506
28.662506 28.787506 28.850006 28.756256 28.725006 28.818756 28.600006
28.725006 28.725006 28.850006 28.881256 28.881256 28.818756 28.756256
28.756256 28.787506 28.787506 28.787506 28.756256 28.787506 28.725006
28.725006 28.725006 28.756256 28.818756 28.756256 28.693756 28.818756
28.756256 28.756256 28.693756 28.850006 28.631256 28.693756 28.693756
28.850006 28.756256 28.725006 28.693756 28.756256 28.850006 28.787506
28.600006 28.631256"
x = [float(t) for t in x.split()]
y = [33.8]*36 [38.7]*36
print(" ")
print("Method 1 ")
x1, x2 = statistics.mean(x[:36]), statistics.mean(x[36:])
y1, y2 = statistics.mean(y[:36]), statistics.mean(y[36:])
slope = (y1-y2)/(x1-x2)
print(f"a = {slope}")
print(" ")
print('Method 2')
x = np.array(x)
y = np.array(y)
X = np.c_[np.ones(x.shape), x]
XXinv = np.linalg.inv(X.transpose().dot(X)).dot(X.transpose())
_beta = XXinv.dot(y)
iv = np.linalg.inv(X.transpose().dot(X)).tolist()
print(f"a = {_beta[1]}")
xx = X.transpose().dot(X)
svd = np.linalg.svd(xx)[1]
print(f"SVD(XX) = {svd}")
Результаты кода:
Method 1
a = 1128.9599999997959
Method 2
a = 1.2136744782028899
SVD(XX) = [5.96125150e 04 3.80959618e-04]
Из графиков данных линия должна быть близка к вертикально линейной, и результат метода 1 имеет больше смысла, чем метод 2. Кроме того, даже линия с наименьшим наклоном по данным (показанная на рисунке) имеет наклон 17,5. Для обычных случаев метод 2 работает хорошо. Однако в этом случае это дает такой небольшой наклон 1,21, который не имеет смысла.
Единственная причина, к которой я могу относиться, — это близкая особенность, как показано в значениях SVD. Но почему? или какое-либо исправление?
Ответ №1:
Ваша система линейных уравнений переопределена (уравнений больше, чем неизвестных), поэтому точных решений нет. Решение метода 2 является «наилучшим», которое минимизирует квадраты ошибок между прогнозами и фактическими значениями.
Линия, полученная с помощью решения 1, визуально выглядит лучше, но, с математической точки зрения, не сводит к минимуму квадраты ошибок. Причина в том, что некоторые точки (например, 28.600006, 38.7) находятся очень далеко от прогнозируемой линии, и эта ошибка при возведении в квадрат существенно повлияет на сумму квадратов ошибок (SSE), которую регрессия пытается минимизировать.
И наоборот, подгоняя линию «посередине» с наклоном 1.21367, регрессия позволяет избежать очень больших ошибок и создает ошибки «среднего размера», которые при возведении в квадрат минимизируют SSE. Однако с визуальной точки зрения результирующая строка, похоже, не соответствует точкам данных, а также решению 1.
Комментарии:
1. Спасибо за ваш ответ. Ваша точка зрения на SSE, основанная на dy, решает мои путаницы. Я забыл, что регрессия минимизировала SSE dy. Теперь я также знаю решение моей проблемы, чтобы использовать расстояние до строки как ошибку вместо использования dy. Это может быть хорошим вариантом для всех задач линейной регрессии, чтобы обрабатывать сингулярные или почти сингулярные случаи.
2. Да, в этом случае ортогональная дистанционная регрессия даст вам лучшие результаты.