【问题标题】:Normal Equation for linear regression线性回归的正态方程
【发布时间】:2018-08-27 02:56:26
【问题描述】:

我有以下 X 和 y 矩阵:

我想使用正规方程方法计算线性回归方程的最佳值:

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

theta 的结果应该是:[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)

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

Traceback(最近一次调用最后一次):文件“C:/”,第 19 行,in theta=inv_XT.dot(y) ValueError: 形状 (4,5) 和 (1,4) 未对齐: 5 (dim 1) != 1 (dim 0)

我做错了什么?

【问题讨论】:

  • 我建议不要使用 np.inv ,因为它会显式计算矩阵的逆。这比简单地求解线性系统和直接计算 (X'X)^{-1}X' 在数值上更不稳定。为此,请编写 np.linalg.solve(XTX, X) (在确保 XTX 实际上是 X'X 而不是 XX' 就像 MaxU 提到的你计算的那样)。

标签: python numpy machine-learning linear-regression


【解决方案1】:

我认为你有点搞砸了维度。你的X 实际上是XTXTX

试试这个:

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]])

UPDATE2:最初如何创建正确的矩阵:

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]])

【讨论】:

  • 我不能直接将 X 设置为正确的形状,以便 XT=X.T 并且 X 的形状正确吗?
  • @2Obe,我不明白...您在问题中创建的X 矩阵是您图片中的转置矩阵。我在图片上看到的那个看起来像一个正确的“未转置”的。因此,如果您以转置格式输入(创建)X,则必须对其进行转置才能得到正确的矩阵。
  • @2Obe,如果您询问如何最初创建正确的矩阵 - 请参阅 UPDATE2
  • 我有一个建议:你通过计算得到了想要的结果: (np.linalg.inv(X @ XT) @ X).T @ yT 也就是你把术语 (np.linalg .inv(X @ XT) @ X) 在用 y “点”它之前。但是这个转置没有在正规方程中指定。有没有办法通过简单地正确设置矩阵 X 和 y 然后简单地应用来实现所需的结果:theta = inv(X^T * X) * X^T * y
【解决方案2】:

我已经通过使用 numpy.linalg.pinv() 解决了这个问题,这是“伪逆”而不是 numpy.linalg.inv() 用于矩阵的反转,因为文档是 sais:

“矩阵 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]]

编辑:也有可能通过将正规方程更改为:

theta = (XT@X + lambda*matrix)^(-1)@XT@y 其中 lambda 是一个实数,称为 正则化参数ma​​trix 是形状的 (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

这是一个eye() 矩阵,其中元素 [0,0] 设置为 0

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

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 2016-03-13
    • 2017-03-24
    • 2016-05-10
    • 2018-01-06
    • 2017-05-20
    • 2015-05-08
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多