线性回归的正规方程

时间:2018-03-18 12:28:39

标签: python numpy machine-learning linear-regression

我有以下X和y矩阵:

enter image description here

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

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(暗淡1)!= 1(暗淡0)

我做错了什么?

2 个答案:

答案 0 :(得分:3)

我认为你已经搞砸了一些尺寸。您的XT实际上是XTXIn [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]])

更新:此方法提供的值更接近您所需的值:

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

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

# config/services.yaml
services:
    # ...

    # same as before
    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests}'

    # explicitly configure the service
    App\Updates\SiteUpdateManager:
        arguments:
            $adminEmail: 'manager@example.com'

答案 1 :(得分:0)

我已经通过使用numpy.linalg.pinv()来解决了这个问题,这是一个“伪逆”而不是numpy.linalg.inv(),因为讨论会导致矩阵的反转:

  

“矩阵A的伪逆,表示为A ^ +,定义为:”   '解决'[最小二乘问题] Ax = b,“即if   \ bar {x}是解决方案,然后A ^ +是那个矩阵,使得\ bar {x} =   甲^ + 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]]

编辑:通过将正规方程式更改为:

,还有可能通过正则化去除NoN可逆性问题

theta =(XT @ X + lambda * matrix )^( - 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

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

有关正则化概念的更多信息,请参阅here