Python中法线方程的实现存在问题

时间:2018-08-31 22:47:58

标签: python

我正在Python中使用有关以下方面可用房屋的数据集:

http://www.rossmanchance.com/iscam2/data/housing.txt

并尝试实现线性回归的实现,如下所示:

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.model_selection import train_test_split 

data= np.genfromtxt("housing.txt",dtype='O',delimiter="\t",skip_header=True)
X=data[:,0].astype(np.float)
y=data[:,1].astype(np.float)
X_train, X_test, y_train, y_test = train_test_split(X, y)
lr=linear_model.LinearRegression()
X_trainrs=X_train.reshape(-1,1)
y_trainrs=y_train.reshape(-1,1)
lr.fit(X_trainrs,y_trainrs)
print "intercept ",lr.intercept_
yfit=lr.predict(X_test.reshape(-1,1))
plt.scatter(X_test,y_test)
plt.plot(X_test,yfit)

程序运行正常,我得到了该数据集的线性回归图。我的问题是当我想执行正规方程式时。我做了这样的事情:

ft=(X_trainrs.T.dot(X_trainrs))
inv=np.linalg.inv(ft)
yfit2=X_test.reshape(-1,1).dot(inv)
plt.plot(X_test,yfit2)

我的问题是绘制的值是一条平线,我在做什么错了?

谢谢

1 个答案:

答案 0 :(得分:1)

据我所知,在代码的第二部分中,您试图通过求解线性方程组来获取系数,然后将其用于测试数据以生成预测。

您要做的是求解的系数

  

X * coeff = y

where X = [x1, 1]  y = [y1]  coeff = [slope     ]
          [x2, 1]      [y2]          [intercept ]
          [x3, 1]      [y3]
          [ :  :]      [ :]
          [xn, 1]      [yn]

该方程的解析解由下式给出:

  

coeff = inv(X.T * X)* X.T * y =伪逆(X)* y

要使用此解决方案生成预测,您可以

  

y_test = X_test *系数

其中X_test的额外列中有一个。

您的代码有2个问题:

  1. 您需要将包含一列的列添加到X_trainrs中。
  2. 您用于生成预测的方程式不正确。

这可能是您想要的:

xx = np.hstack([X_trainrs, np.ones((X_trainrs.shape[0], 1))]) # append ones
coeff = np.linalg.pinv(xx).dot(y_trainrs) # computes inv(X.T * X) * X.T * y
xx_test = np.hstack([X_test.reshape(-1, 1), np.ones((X_test.shape[0], 1))])
yfit2 = xx_test.dot(coeff)
plt.plot(X_test, yfit2)

您可以避免使用coeff来手动编码np.linalg.lstsq来手动获取coeff, _, _, _ = np.linalg.lstsq(xx, y_trainrs) 的逻辑。

parse