2017-06-13 91 views
1

多項式迴歸曲線我是新來sklearn和我有一個適當的簡單的任務:給定的15點的散點圖,我需要故障配件在sklearn

  1. 把他們的11作爲我的訓練樣本',
  2. 通過這11個點擬合3次多項式曲線;
  3. 在15個點上畫出得到的多項式曲線。

但是我陷入了第二步。

這是數據圖:

%matplotlib notebook 

import numpy as np from sklearn.model_selection 
import train_test_split from sklearn.linear_model 
import LinearRegression from sklearn.preprocessing import PolynomialFeatures 

np.random.seed(0) 
n = 15 
x = np.linspace(0,10,n) + np.random.randn(n)/5 
y = np.sin(x)+x/6 + np.random.randn(n)/10 

X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=0) 

plt.figure() plt.scatter(X_train, y_train, label='training data') 
plt.scatter(X_test, y_test, label='test data') 
plt.legend(loc=4); 

我再取11分X_train和度數3的聚特點如下改造他們:

degrees = 3 
poly = PolynomialFeatures(degree=degree) 

X_train_poly = poly.fit_transform(X_train) 

然後我儘量合身通過變換點的線(注意:X_train_poly.size = 364)。

linreg = LinearRegression().fit(X_train_poly, y_train) 

,我得到以下錯誤:

ValueError: Found input variables with inconsistent numbers of samples: [1, 11] 

我已閱讀,解決類似的和更爲複雜的問題(例如Multivariate (polynomial) best fit curve in python?)的各種問題,但我不能提取它們的解決方案。

+0

可能重複:https://stackoverflow.com/questions/32097392/sklearn-issue-found-arrays-with-inconsistent-numbers -of次採樣時,這樣做,REGR – Moritz

回答

2

的問題是在X_train和y_train尺寸。它是一個單維數組,因此它將每個X記錄視爲一個單獨的變量。

使用.reshape命令如下應該做的伎倆:

# reshape data to have 11 records rather than 11 columns 
X_trainT  = X_train.reshape(11,1) 
y_trainT  = y_train.reshape(11,1) 

# create polynomial features on the single va 
poly   = PolynomialFeatures(degree=3) 
X_train_poly = poly.fit_transform(X_trainT) 

print (X_train_poly.shape) 
# 

linreg  = LinearRegression().fit(X_train_poly, y_trainT) 
0

錯誤基本上意味着你X_train_polyy_train不匹配,你的X_train_poly只有1套X和您的y_train有11個值。我不太清楚你想要什麼,但我想多項式特徵不是以你想要的方式生成的。你的代碼目前所做的是爲單個11維點生成3次多項式特徵。

我想你想要爲11點的每個點(實際上每個x)生成3次多項式特徵。您可以使用一個循環或列表理解來做到這一點:

X_train_poly = poly.fit_transform([[i] for i in X_train]) 
X_train_poly.shape 
# (11, 4) 

現在你可以看到你的X_train_poly得到11分,其中每個點是4維的,而不是單一的364維點。這種新的X_train_polyy_train形狀相匹配和迴歸可能會給你想要的東西:

linreg = LinearRegression().fit(X_train_poly, y_train) 
linreg.coef_ 
# array([ 0.  , -0.79802899, 0.2120088 , -0.01285893])