我正在玩python并想用matplotlib绘制二次线性回归。问题是,我的情节最终会成为很多相关的线/点,而不仅仅是一个函数:
通常我会认为这是行与列向量的问题。但是当我转置时似乎没有任何改变。
这是我的代码:
from sklearn import datasets, linear_model
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Load diabetes dataset JSON
dsDiabetes = datasets.load_diabetes()
# Create feature- and outcome vectors
lin_train = np.array(dsDiabetes.data[:, np.newaxis, 2])
quad_train = np.concatenate((lin_train, lin_train**2), axis=1)
outcome = np.array(dsDiabetes.target)
# Create regression objects
lin_model = linear_model.LinearRegression()
quad_model = linear_model.LinearRegression()
# lin_train model
lin_model.fit(lin_train, outcome)
quad_model.fit(quad_train, outcome)
# Plot
plt.style.use('fivethirtyeight')
plt.scatter(lin_train, outcome, color='black')
# plt.plot(lin_train, quad_model.predict(quad_train))
# plt.plot(lin_train, lin_model.predict(lin_train), color='blue', linewidth=1)
plt.plot(lin_train, quad_model.predict(quad_train), color='red', linewidth=1)
plt.show()
我错过了什么?
答案 0 :(得分:0)
从我所看到的,你的图上的x值没有按升序排序。情节会做它应该做的事情并连接点,但它们的顺序是线条跳跃"返回"和"前进"在x轴上。现在 - 你不能在线性图上看到,因为一切都在一条线上,但在二次方开始变得可见。如果您根据应该执行此操作的升序x值对行使用的点进行排序。
答案 1 :(得分:0)
您需要对值进行排序。你可以采取任何方法。就个人而言,我只会使用pandas
,但肯定会有更轻量级的解决方案。
>>> df = pd.DataFrame({'x':lin_train.reshape((lin_train.shape[0],)), 'y':quad_model.predict(quad_train)})
>>> df.sort_values(by='x', inplace=True)
>>> plt.style.use('fivethirtyeight')
>>> plt.scatter(lin_train, outcome, color='black')
<matplotlib.collections.PathCollection object at 0x7f6bf2906590>
>>> # plt.plot(lin_train, quad_model.predict(quad_train))
... # plt.plot(lin_train, lin_model.predict(lin_train), color='blue', linewidth=1)
... plt.plot(df.x, df.y, color='red', linewidth=1)
[<matplotlib.lines.Line2D object at 0x7f6bf29069d0>]