Cod*_*ggo 7 python numpy least-squares empty-list statsmodels
我正在尝试计算Numpy 中的最小二乘问题(即带有简单回归的普通最小二乘法 (OLS)),以便找到相应的 R\xc2\xb2 值。然而,在某些情况下,Numpy 返回残差的空列表。以下面的超定示例(即方程多于未知数)来说明此问题:
\n\n\n\n(注:没有常数因子(即截距)(即全 1 的初始列向量),因此将使用无中心平方和 (TSS)。)
\n\nimport 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))\nRun Code Online (Sandbox Code Playgroud)\n\n以下产生以下输出:
\n\nNumpy Model Parameter(s): [0.00162999 0.01086661]\nNumpy Sum of Squared Residuals (SSR): []\nNumpy R\xc2\xb2: []\nRun Code Online (Sandbox Code Playgroud)\n\n根据numpy 文档:
\n\n\n\n\n...当方程欠定或明确时,残差将为空,但当方程超定时,则返回值。
\n
然而,这个问题显然是过度确定的(3 个方程与 2 个未知数)。我什至可以通过计算statsmodels 的 OLS 函数给出的回归结果来证明残差(以及残差平方和 (SSR))的存在:
\n\nimport 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))\nRun Code Online (Sandbox Code Playgroud)\n\n以下产生以下输出:
\n\nParameters: [0.00162999 0.01086661]\nResiduals: [ 0.05555556 -0.24444444 0.37777778]\nStatsmodels R\xc2\xb2: 0.6837606837606838\nManually Calculated R\xc2\xb2: 0.6837606837606838\nRun Code Online (Sandbox Code Playgroud)\n\n(如您所见,Statsmodels 和 Numpy 模型具有一致的参数。)
\n\n为什么 Numpy 在以下示例中返回空的 SSR 数组?这是numpy.linalg.lstsq的错误吗?如果这不是一个错误,那么为什么Statsmodels能够计算残差平方和(SSR)而 numpy 却不能?给定最佳拟合平面,我们还可以手动清楚地计算残差:
\n\n\n来自文档numpy.linalg.lstsq():
残差:{(), (1,), (K,)} ndarray
...如果 a 的秩是
< N或M <= N,则这是一个空数组。...
你的矩阵的秩是1。
注意:您认为“丢失”的残差也可以使用以下方法找到numpy(您不需要其他软件包):
residuals = y - np.dot(A, model_parameters)
Run Code Online (Sandbox Code Playgroud)