在 python 中计算回归系数的最简单方法是什么?
What's the easiest way to calculate regression coefficient in python?
我有一个 100 x 1 的响应变量 Y 和一个 100 x 3 的预测矩阵 X。我想计算回归系数 (X'X)^{-1}X'Y。
目前我是这样操作的:
invXpX=inv(np.dot(np.transpose(X),X))
XpY=np.dot(np.transpose(X),Y)
betahat=np.dot(invXpX,XpY)
这看起来很麻烦,而在 MATLAB 中我们可以像原来的数学公式一样完成它:inv(X'*X)*X'*Y。在python中有没有更简单的方法来计算这个回归系数?
谢谢!
是的,它可以写得更紧凑,但请注意,这并不总是会提高您的代码或可读性。
可以使用点 T (.T
) 找到 numpy 数组的转置。如果你使用 numpy 矩阵而不是 numpy 数组,你也可以使用 .I
作为逆,但我建议你使用 ndarray。对于点积,您可以使用 @
。因此 np.dot(X,Y) = X.dot(Y)
当 X
和 Y
是 numpy 数组时。
import numpy as np
# Simulate data using a quadratic equation with coefficients y=ax^2+bx+c
a, b, c = 1, 2, 3
x = np.arange(100)
# Add random component to y values for estimation
y = a*x**2 + b*x + c + np.random.randn(100)
# Get X matrix [100x3]
X = np.vstack([x**2, x, np.ones(x.shape)]).T
# Estimate coefficients a, b, c
x_hat = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
>>> array([0.99998334, 2.00246583, 2.95697339])
x_hat = np.linalg.inv(X.T@(X))@(X.T)@(y)
>>> array([0.99998334, 2.00246583, 2.95697339])
# Use matrix:
X_mat = np.matrix(X)
x_hat = (X_mat.T@X_mat).I@X_mat.T@y
>>> matrix([[0.99998334, 2.00246583, 2.95697339]])
# without noise:
y = a*x**2 + b*x + c
x_hat = (X_mat.T@X_mat).I@X_mat.T@y
>>> matrix([[1., 2., 3.]])
你可以试试这个:
np.invert(X.T @ X) @ (X.T @ Y)
我有一个 100 x 1 的响应变量 Y 和一个 100 x 3 的预测矩阵 X。我想计算回归系数 (X'X)^{-1}X'Y。
目前我是这样操作的:
invXpX=inv(np.dot(np.transpose(X),X))
XpY=np.dot(np.transpose(X),Y)
betahat=np.dot(invXpX,XpY)
这看起来很麻烦,而在 MATLAB 中我们可以像原来的数学公式一样完成它:inv(X'*X)*X'*Y。在python中有没有更简单的方法来计算这个回归系数? 谢谢!
是的,它可以写得更紧凑,但请注意,这并不总是会提高您的代码或可读性。
可以使用点 T (.T
) 找到 numpy 数组的转置。如果你使用 numpy 矩阵而不是 numpy 数组,你也可以使用 .I
作为逆,但我建议你使用 ndarray。对于点积,您可以使用 @
。因此 np.dot(X,Y) = X.dot(Y)
当 X
和 Y
是 numpy 数组时。
import numpy as np
# Simulate data using a quadratic equation with coefficients y=ax^2+bx+c
a, b, c = 1, 2, 3
x = np.arange(100)
# Add random component to y values for estimation
y = a*x**2 + b*x + c + np.random.randn(100)
# Get X matrix [100x3]
X = np.vstack([x**2, x, np.ones(x.shape)]).T
# Estimate coefficients a, b, c
x_hat = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
>>> array([0.99998334, 2.00246583, 2.95697339])
x_hat = np.linalg.inv(X.T@(X))@(X.T)@(y)
>>> array([0.99998334, 2.00246583, 2.95697339])
# Use matrix:
X_mat = np.matrix(X)
x_hat = (X_mat.T@X_mat).I@X_mat.T@y
>>> matrix([[0.99998334, 2.00246583, 2.95697339]])
# without noise:
y = a*x**2 + b*x + c
x_hat = (X_mat.T@X_mat).I@X_mat.T@y
>>> matrix([[1., 2., 3.]])
你可以试试这个:
np.invert(X.T @ X) @ (X.T @ Y)