2016-09-18 273 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值對行的點進行排序。