Numpy 的最小二乘法没有残差

Cod*_*ggo 7 python numpy least-squares empty-list statsmodels

我正在尝试计算Numpy 中的最小二乘问题(即带有简单回归的普通最小二乘法 (OLS)),以便找到相应的 R\xc2\xb2 值。然而,在某些情况下,Numpy 返回残差的空列表。以下面的超定示例(即方程多于未知数)来说明此问题:

\n\n

最小最小二乘问题

\n\n

(注:没有常数因子(即截距)(即全 1 的初始列向量),因此使用无中心平方和 (TSS)。)

\n\n
import numpy as np\n\nA = np.array([[6, 6, 3], [40, 40, 20]]).T\ny = np.array([0.5, 0.2, 0.6])\n\nmodel_parameters, residuals, rank, singular_values = np.linalg.lstsq(A, y, rcond=None)\n\n# No Intercept, therefore use Uncentered Total Sum of Squares (TSS)\nuncentered_tss = np.sum((y)**2)  \nnumpy_r2 = 1.0 - residuals / uncentered_tss\n\nprint("Numpy Model Parameter(s): " + str(model_parameters))\nprint("Numpy Sum of Squared Residuals (SSR): " + str(residuals))\nprint("Numpy R\xc2\xb2: " + str(numpy_r2))\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下产生以下输出:

\n\n
Numpy Model Parameter(s): [0.00162999 0.01086661]\nNumpy Sum of Squared Residuals (SSR): []\nNumpy R\xc2\xb2: []\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据numpy 文档

\n\n
\n

...当方程欠定或明确时,残差将为空,但当方程超定时,则返回值。

\n
\n\n

然而,这个问题显然是过度确定的(3 个方程与 2 个未知数)。我什至可以通过计算statsmodels 的 OLS 函数给出的回归结果来证明残差(以及残差平方和 (SSR))的存在:

\n\n
import statsmodels.api as sm\n\nA = np.array([[6, 6, 3], [40, 40, 20]]).T\ny = np.array([0.5, 0.2, 0.6])\n\nstatsmodel_model = sm.OLS(y, A)\nregression_results = statsmodels_model.fit()\n\ncalculated_r_squared = 1.0 - regression_results.ssr / np.sum((y)**2)\n\nprint("Parameters: " + str(regression_results.params))\nprint("Residuals: " + str(regression_results.resid))\nprint("Statsmodels R\xc2\xb2: " + str(regression_results.rsquared))\nprint("Manually Calculated R\xc2\xb2: " + str(calculated_r_squared))\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下产生以下输出:

\n\n
Parameters: [0.00162999 0.01086661]\nResiduals: [ 0.05555556 -0.24444444  0.37777778]\nStatsmodels R\xc2\xb2: 0.6837606837606838\nManually Calculated R\xc2\xb2: 0.6837606837606838\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,Statsmodels 和 Numpy 模型具有一致的参数。

\n\n

为什么 Numpy 在以下示例中返回空的 SSR 数组?这是numpy.linalg.lstsq的错误吗?如果这不是一个错误,那么为什么Statsmodels能够计算残差平方和(SSR)而 numpy 却不能?给定最佳拟合平面,我们还可以手动清楚地计算残差:

\n\n

功能平面

\n

AGN*_*zer 4

来自文档numpy.linalg.lstsq()

残差:{(), (1,), (K,)} ndarray

...如果 a 的秩是< NM <= N,则这是一个空数组。...

你的矩阵的秩是1。


注意:您认为“丢失”的残差也可以使用以下方法找到numpy(您不需要其他软件包):

residuals = y - np.dot(A, model_parameters)
Run Code Online (Sandbox Code Playgroud)

  • @DanHoynoski 请参阅http://web.gps.caltech.edu/classes/ge193.old/lectures/Lecture2.pdf,第7页 这就是你所拥有的。想想看,您有一个等于许多值的相同方程(“数量”): `3*b0+20*b1=0.25; 3*b0+20*b1=0.1;3*b0+20*b1=0.6` “多个值”(0.25, 01, 0.6)并不使其成为超定系统。使您的系统“欠定”的原因是您无法同时求解两个未知数(“b0”和“b1”),因为所有方程都是线性相关的。所以,你的解决方案还没有确定。Numpy 只是从无数的解决方案中为您提供了一种可能的解决方案。 (2认同)