Нет остатков с наименьшими квадратами Numpy
Я пытаюсь вычислить проблему наименьших квадратов в Numpy (т.е. обычные наименьшие квадраты (OLS) с простой регрессией), чтобы найти соответствующее значение R². Однако в некоторых случаях Numpy возвращает пустой список для остатков. Возьмите следующий переопределенный пример (т.е. больше уравнений, чем неизвестных), который иллюстрирует эту проблему:
(Примечание. Постоянный коэффициент (т. Е. Перехват) отсутствует (т. Е. Начальный вектор столбца всех 1), поэтому будет использоваться нецентрированная общая сумма квадратов (TSS).)
import numpy as np
A = np.array([[6, 6, 3], [40, 40, 20]]).T
y = np.array([0.5, 0.2, 0.6])
model_parameters, residuals, rank, singular_values = np.linalg.lstsq(A, y, rcond=None)
# No Intercept, therefore use Uncentered Total Sum of Squares (TSS)
uncentered_tss = np.sum((y)**2)
numpy_r2 = 1.0 - residuals / uncentered_tss
print("Numpy Model Parameter(s): " + str(model_parameters))
print("Numpy Sum of Squared Residuals (SSR): " + str(residuals))
print("Numpy R²: " + str(numpy_r2))
Следующее производит следующий вывод:
Numpy Model Parameter(s): [0.00162999 0.01086661]
Numpy Sum of Squared Residuals (SSR): []
Numpy R²: []
Согласно наглой документации:
... остатки будут пустыми, если уравнения будут недоопределенными или хорошо определенными, но возвращают значения, если они переопределены.
Однако эта проблема явно переоценена (3 уравнения против 2 неизвестных). Я даже могу показать, что невязки (и, следовательно, сумма квадратов невязок (SSR)) существуют путем вычисления результатов регрессии, данных функцией OLS statsmodels:
import statsmodels.api as sm
A = np.array([[6, 6, 3], [40, 40, 20]]).T
y = np.array([0.5, 0.2, 0.6])
statsmodel_model = sm.OLS(y, A)
regression_results = statsmodels_model.fit()
calculated_r_squared = 1.0 - regression_results.ssr / np.sum((y)**2)
print("Parameters: " + str(regression_results.params))
print("Residuals: " + str(regression_results.resid))
print("Statsmodels R²: " + str(regression_results.rsquared))
print("Manually Calculated R²: " + str(calculated_r_squared))
Следующее производит следующий вывод:
Parameters: [0.00162999 0.01086661]
Residuals: [ 0.05555556 -0.24444444 0.37777778]
Statsmodels R²: 0.6837606837606838
Manually Calculated R²: 0.6837606837606838
(Как видите, модели Statsmodels и Numpy имеют согласованные параметры.)
Почему Numpy возвращает пустой массив SSR в следующем примере? Это ошибка с numpy.linalg.lstsq? Если это не ошибка, то почему Statsmodels может вычислить сумму квадратов невязок (SSR), а numpy - нет? Можно также четко вычислить остатки вручную, учитывая плоскость наилучшего соответствия:
1 ответ
Из документации numpy.linalg.lstsq()
:
остатки: {(), (1,), (K,)} ndarray
... если ранг
< N
или жеM <= N
это пустой массив....
Ранг вашей матрицы 1.
ПРИМЕЧАНИЕ. То, что вы считаете "отсутствующими" остатками, можно найти с помощью numpy
а также (вам не нужны другие пакеты):
residuals = y - np.dot(A, model_parameters)