使用sklearn线性回归绘图时拟合线未正常绘制的原因是什么?
问题原因
你的代码核心问题是输入数据的形状不符合scikit-learn的拟合要求:
- 你生成的X是
(1, 样本数)的二维数组,会被模型识别为「1个样本,n个特征」,完全不符合单特征回归的输入规则 - 你生成的LEFT_Y是
(1, 样本数)的二维数组,会被模型识别为「1个样本对应n个标签」,拟合逻辑完全错误 - 形状不对导致predict输出结果的维度也不符合绘图要求,因此拟合线无法正常显示
修复方案
只需要调整X和标签数组的形状即可,修改后完整代码如下:
import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt def main(): # 加载文件 arr = np.genfromtxt("data.csv", dtype=float, delimiter=";", names=True) # 电压 调整为 (样本数, 1) 的二维数组,符合单特征输入要求 X = np.array([i[0] for i in arr]).reshape(-1, 1) print("Voltage") print(X) # 左轮转速 调整为 (样本数,) 的一维数组 LEFT_Y = np.array([i[1] for i in arr]) print("Left wheel") print(LEFT_Y) # 右轮转速 RIGHT_Y = np.array([i[2] for i in arr]) print("Right wheel") print(RIGHT_Y) model = LinearRegression() model.fit(X, LEFT_Y) plt.scatter(X, LEFT_Y, color='blue') # 可选:如果X是乱序的,先排序再绘图保证线条平滑 # X_sorted = np.sort(X, axis=0) # plt.plot(X_sorted, model.predict(X_sorted), color='red') plt.plot(X, model.predict(X), color='red') plt.show() if __name__ == "__main__": main()
补充说明
如果你的原始数据中电压列不是按升序排列的,直接用原始X绘图会出现拟合线来回弯折的情况,取消代码中排序相关的注释即可解决。
内容的提问来源于stack exchange,提问作者CuriousPan
相关产品推荐
相关产品推荐

