Нет остатков с наименьшими квадратами Numpy - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь вычислить проблему наименьших квадратов в Numpy (то есть Обыкновенные наименьшие квадраты (OLS) с простой регрессией), чтобы найти соответствующее значение R².Однако , в некоторых случаях , Numpy возвращает пустой список для остатков.Возьмите следующий переопределенный пример ( т.е. больше уравнений, чем неизвестных ), который иллюстрирует эту проблему:

OLS problem

(Примечание: существует нет постоянного фактора (т. Е. Перехвата) (т. Е. Начальный вектор столбца всех 1), поэтому Uncentered TotalСумма квадратов (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²: []

Согласно документация numpy :

... остатки будут пустыми, если уравнения недоопределены или точно определены, но возвращают значения, если они переопределены.

Однако , эта проблема явно переоценена (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 нет?Можно также четко рассчитать остатки вручную, учитывая плоскость наилучшего соответствия:

function plane

1 Ответ

0 голосов
/ 05 июня 2018

Из документации numpy.linalg.lstsq():

остатки: {(), (1,), (K,)} ndarray

... Если ранг a < N или M <= N, это пустой массив....

Ранг вашей матрицы равен 1.


ПРИМЕЧАНИЕ: То, что вы считаете "отсутствующими" остатками, можно найти с помощью numpy (другие пакеты не нужны):

residuals = y - np.dot(A, model_parameters)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...