我在进行多变量的线性回归。为了获取theta(系数),我使用了Numpy的最小二乘法工具numpy.linalg.lstsq。我的数据中有n = 143个特征和m = 13000个训练样本。我想绘制房价与面积的关系图,并展示这个特征的拟合线。
数据准备代码(Python):
import pandas as pdimport numpy as npimport matplotlib.pyplot as plt path = 'DB2.csv' data = pd.read_csv(path, header=None, delimiter=";")data.insert(0, 'Ones', 1)cols = data.shape[1]X = data.iloc[:,0:cols-1] y = data.iloc[:,cols-1:cols]
使用numpy.linalg.lstsq获取theta系数:
thetas = np.linalg.lstsq(X, y)[0]
预测部分:
allAreasData = X.iloc[:,120] #用于散点图展示所有训练数据areasTestValues = X.iloc[0:100,120] #用于绘图函数的测试数据testingExamples = X.iloc[0:100,:] #用于进行预测predictions = testingExamples.dot(thetas)
注意:上述代码中的120是数据集中面积列的索引。
可视化部分:
fig, ax = plt.subplots(figsize=(18,10)) ax.scatter(allAreasData, y, label='训练数据', color='r') ax.plot(areasTestValues, predictions, 'b', label='预测') ax.legend(loc=2) ax.set_xlabel('面积') ax.set_ylabel('价格') ax.set_title('预测价格与房屋面积')
我期望得到一条拟合数据的单一回归线,但得到的是这样一条奇怪的折线(断线)。我做错了什么?散点图是正确的,但绘图函数不是。对于绘图函数,我发送了两个参数:
1) 测试面积数据(100个面积数据样本)2) 基于包含面积数据的100个训练样本的价格预测
我期望得到一条用最小二乘法拟合所有数据的直线,但得到的是一条曲线。线性回归和numpy.linalg.lstsq工具不应该返回一条直线的拟合线而不是曲线吗?
回答:
你的结果在143维空间中是线性的。;) 由于你的X包含了不仅仅是面积的许多其他特征,预测也会(线性地)依赖于这些特征。
如果你重新进行训练,使用X = data.iloc[:,120](只考虑面积特征),你应该会在绘制结果时得到一条直线。