2016-09-18 81 views
0

我在玩python,想用matplotlib绘制二次线性回归。问题是,我的阴谋最终被很多连接线/点,而不是仅仅的一个功能:用matplotlib绘制二次函数/模型

Plot

Zoomed plot

通常我会觉得这是与行的问题VS的列向量。但是,当我转置时,似乎没有任何改变。

这里是我的代码:

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

您需要对数值进行排序。你可以采取任何方法。就个人而言,我只会使用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>] 

enter image description here

+0

当然!谢谢juanpa。 一个简单的问题:你为什么要重塑?我测试过了,这是必需的。 (442L,1L)和 (442L,)之间的直观区别是什么? – mfvas

+0

@mfvas不客气!如果这对您有帮助,您可以提出答案,如果您选择接受,请使用复选标记。 –

0

从我所看到的情况来看,您地块上的x值不会按升序排序。情节做它应该和连接点,但他们是在这样一个顺序,该行跳转“回”和“前进”的X轴。现在 - 你不能在线性图上看到所有东西都在一条线上,但是在二次曲线上开始变得可见。如果您根据应该做的升序x值对行的点进行排序。