Python 线性回归的正态方程

Python 线性回归的正态方程,python,numpy,machine-learning,linear-regression,Python,Numpy,Machine Learning,Linear Regression,我有以下X和y矩阵: 对于这一点,我想使用正态方程方法计算线性回归方程的θ的最佳值: θ=inv(X^T*X)*X^T*y θ的结果应为:[188.400,0.3866,-56.128,-92.967,-3.737] 我通过以下方式实施这些步骤: X=np.matrix([[1,1,1,1],[2104,1416,1534,852],[5,3,3,2],[1,2,2,1],[45,41,30,36]]) y=np.matrix([460,232,315,178]) XT=np.transpo

我有以下X和y矩阵:

对于这一点,我想使用正态方程方法计算线性回归方程的θ的最佳值:

θ=inv(X^T*X)*X^T*y

θ的结果应为:[188.400,0.3866,-56.128,-92.967,-3.737]

我通过以下方式实施这些步骤:

X=np.matrix([[1,1,1,1],[2104,1416,1534,852],[5,3,3,2],[1,2,2,1],[45,41,30,36]])
y=np.matrix([460,232,315,178])

XT=np.transpose(X)

XTX=XT.dot(X)

inv=np.linalg.inv(XTX)

inv_XT=inv.dot(XT)

theta=inv_XT.dot(y)

print(theta)
但是我没有得到想要的结果。相反,它会抛出一个错误:

回溯(最近一次调用last):文件“C:/”,第19行,在 θ=反向点(y)值错误:形状(4,5)和(1,4)未对齐:5(尺寸1)!=1(尺寸0)


我做错了什么?

我想你把尺寸弄乱了一点。你的
X
实际上是
XT
XT
X

试试这个:

In [163]: X=np.matrix([[1,1,1,1],[2104,1416,1534,852],[5,3,3,2],[1,2,2,1],[45,41,30,36]]).T

In [164]: y=np.matrix([460,232,315,178])

In [165]: X
Out[165]:
matrix([[   1, 2104,    5,    1,   45],
        [   1, 1416,    3,    2,   41],
        [   1, 1534,    3,    2,   30],
        [   1,  852,    2,    1,   36]])

In [166]: XT = X.T

In [167]: np.linalg.inv(XT @ X) @ XT @ y.T
Out[167]:
matrix([[243.4453125 ],
        [ -0.47787476],
        [268.609375  ],
        [  3.1328125 ],
        [ -5.83056641]])
更新:此方法提供的值更接近您所需的值:

In [197]: (np.linalg.inv(X @ X.T) @ X).T @ y.T
Out[197]:
matrix([[182.27200269],
        [  0.34497234],
        [-38.43393186],
        [-82.90625955],
        [ -3.84484213]])
更新2:如何最初创建正确的矩阵:

In [217]: np.array([[1, 2104, 5, 1, 45],
     ...:  [1, 1416, 3, 2, 41],
     ...:  [1, 1534, 3, 2, 30],
     ...:  [1, 852, 2, 1, 36]])
     ...:
Out[217]:
array([[   1, 2104,    5,    1,   45],
       [   1, 1416,    3,    2,   41],
       [   1, 1534,    3,    2,   30],
       [   1,  852,    2,    1,   36]])

我已经通过使用“伪逆”而不是numpy.linalg.inv()来解决了这个问题,因为ducumentation sai:

矩阵a的伪逆,表示为a^+,定义为: “解决”[最小二乘问题]Ax=b“的矩阵,即如果 \bar{x}是所说的解,那么A^+就是这样的矩阵\bar{x}= A^+b。”

在线性回归的背景下,解决最小二乘问题正是我想要实现的

因此,该守则是:

X=np.matrix([[1,2104,5,1,45],[1,1416,3,2,40],[1,1534,3,2,30],[1,852,2,1,36]])
y=np.matrix([[460],[232],[315],[178]])

XT=X.T
XTX=XT@X

inv=np.linalg.pinv(XTX)

theta=(inv@XT)@y
print(theta)

[[188.40031946]
 [  0.3866255 ]
 [-56.13824955]
 [-92.9672536 ]
 [ -3.73781915]]
编辑:还可以通过将法向方程更改为:

θ=(XT@X+λ*矩阵)^(-1)@XT@y其中,lambda是实数,称为正则化参数,矩阵是形状的(n+1 x n+1)维矩阵:

 0 0 0 0 ... 0 0 
 0 1 0 0 ... 0 0 
 0 0 1 0 ... 0 0
 0 0 0 1 ... 0 0
 .
 .
 .
 0 0 0 0 0 0 0 1
这是一个元素[0,0]设置为0的矩阵


更多关于正则化的概念可以阅读

我能不能直接将X设置为正确的形状,这样我就可以将X设置为XT=X.t,并且X的形状正确?@2Obe,我不明白。。。您在问题中创建的
X
矩阵是图片中的转置矩阵。我在图片上看到的那个看起来像一个正确的“未转置”的。因此,如果您以转置格式输入(创建)
X
,则必须对其进行转置才能得到正确的矩阵。@2Obe,如果您询问如何最初创建正确的矩阵-请参阅更新2,我有一个建议:您通过计算获得了所需的结果:(np.linalg.inv(X@X.T)@X.T@y.T也就是说,您对术语进行了转置(np.linalg.inv(X@X.T)@X)在用y“点”它之前。但是在正常方程中没有指定这种转置。通过简单地正确设置矩阵X和y,然后简单地应用:θ=inv(X^T*X),难道没有办法达到预期的结果吗*X^T*我建议不要使用np.inv,因为它显式地计算矩阵的逆。这比简单地求解线性系统并直接计算(X'X)^{-1}X'在数值上更不稳定。要做到这一点,请编写np.linalg.solve(XTX,X)(在确保XTX实际上是X'X,而不是MaxU提到的计算的XX'之后)。