我正在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)
我的问题是绘制的值是一条平线,我在做什么错了?
谢谢
答案 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个问题:
这可能是您想要的:
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