使用Numpy的线性回归(无截距)R方

093gszye  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(160)

对于具有1个变量和一个截距的线性回归,我可以将R方计算为-

R^2 = (np.sum(((x - np.mean(x)) / np.std(x, ddof=1)) * ((y - np.mean(y)) / np.std(y, ddof=1))) / (len(x) - 1)) ** 2

字符串
如何计算线性回归的R平方,其中有1个变量,没有截距,并且不必处理statsmodels.api OLS或linregress或任何第三方软件包。np.mean(y) = 0表示无截距的线性回归的理解是否正确?
在numpy中获得1个变量且无截距的线性回归的R方的最快方法是什么?

z8dt9xmd

z8dt9xmd1#

在一个变量没有截距的情况下,你可以很容易地做到:

sum(x*y)**2/sum(x*x)/sum(y*y)

字符串
在矩阵符号中,这可以写成

(y @ x)**2/(x @ x * y @ y)


举例来说:

import statsmodels.api as sm
x, y = sm.datasets.get_rdataset('iris').data.iloc[:,:2].values.T
print(sm.OLS(y,x).fit().rsquared)
0.9565098243072627

print((y @ x)**2/(x @ x * y @ y))
0.9565098243072627


注意,两者是等价的
您可以扩展上述内容以包含多个变量:

import statsmodels.api as sm, numpy as np

dat = sm.datasets.get_rdataset('iris').data
x = dat.iloc[:,1:4].values
y = dat.iloc[:,0].values

print(sm.OLS(y, x).fit().rsquared)
0.9961972754365206

print(y @ x @ np.linalg.solve(x.T @ x, x.T @ y)  / (y @ y))
0.9961972754365208

xvw2m8pv

xvw2m8pv2#

对于普通最小二乘(OLS),我们可以使用标准形式公式简明地求解一元线性回归,


的数据
我们可以在NumPy中使用X和y的列向量来实现这一点:

import numpy as np
X = np.array([[0, 1, 2, 3, 4, 5]]).T
y = np.array([[1, 0, 3, 2, 5, 4]]).T

w = np.linalg.inv(X.T @ X) @ X.T @ y

y_hat = X @ w

字符串
上面,我使用@运算符进行矩阵乘法。y_hat存储每个X坐标的线性回归的y坐标。然后可以使用平方和公式计算R²:

SS_tot = (y - np.mean(y)).T @ (y - np.mean(y))
SS_reg = (y - y_hat).T @ (y - y_hat)
r_squared = 1 - (SS_reg / SS_tot)


上面,我使用向量内积来更简洁地写出平方和,因为对向量v的平方求和与转置v并将其乘以自身是相同的。
这将计算回归的R²(存储在1x1NumPy矩阵中),其斜率存储在w中(表示为1x1NumPy矩阵)。

plicqrtu

plicqrtu3#

你可以计算r平方而不需要截距

R2 = 1 - np.sum((y - (slope * x))**2) / np.sum((y - np.mean(y))**2)

字符串

相关问题