2017-03-21 11 views
2

1次元のおもちゃデータ用のSVR予測モデルを構築してmatplotlibでプロットするためにscikit-learnでコードを書きました。1次元データをフィットさせて線を予測する

青い線が真のデータです。線形カーネルのモデルは素敵な線に合っていますが、次数2のカーネルの予測は私が期待するものではありません。私はオレンジ色の線が予測している値より若干青い線の値を予測するモデルを持っていたいと思います。私は、私が気にしていたことを視覚化するために黒い線を描いた。

  1. どうしてですか?データは次数2の多項式の良い候補のようです。真のデータに続く黒の傾向線は、緑の線が提供しているものよりもはるかによくフィットするはずです。プロット。そのようなモデルは、データに基づいて次数2の多項式で見つけるべきではありませんか?また、この曲線をより高い推定y値で持つ代わりに、青色線の近くのX = 0でうまく曲線化する。

  2. 私はどのようにしてモデルを作成できますか?

enter image description here

次のコードは、上記(マイナス塗装黒線)のプロットを得るためにそれを実行し、完全な自己完結型である

# some data 
y = [0, 3642, 6414, 9844,, 16072, 18868, 22275, 25551, 28949, 31680, 34412, 37290, 39858, 42557, 
    45094, 47354, 49547, 51874, 54534, 55987, 55987, 58377, 60767, 63109, 65060, 66865, 68540, 70328, 
    72035, 73905, 75791, 77873, 79791, 81775, 83726] 
X = range(0, len(y)) 
X_longer = range(0, len(y)*2) 

# train models 
from sklearn.svm import SVR 
import numpy as np 
clf_1 = SVR(kernel='poly', C=1e3, degree=1) 
clf_2 = SVR(kernel='poly', C=1e3, degree=2) 

clf_1.fit(np.array(X).reshape(-1, 1), y) 
clf_2.fit(np.array(X).reshape(-1, 1), y) 

%matplotlib inline 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

# plot real data 
plt.plot(X, y, linewidth=8.0, label='true data') 

predicted_1_y = [] 
predicted_2_y = [] 

# predict data points based on models 
for i in X_longer: 
    predicted_1_y.append(clf_1.predict(np.array([i]).reshape(-1, 1))) 
    predicted_2_y.append(clf_2.predict(np.array([i]).reshape(-1, 1))) 

# plot model predictions 
plt.plot(X_longer, predicted_1_y, linewidth=6.0, ls=":", label='model, degree 1') 
plt.plot(X_longer, predicted_2_y, linewidth=6.0, ls=":", label='model, degree 2') 

plt.legend(loc='upper left') 
plt.show() 

答えて

0

線形および二次の特徴がするので、これが起こります最終的にはいつもどおりに成長する。あなたは、あなたが望む減衰関数を拾うために、平方根またはログのような操作が必要です。

これを行う簡単な方法は、フィッティングする前に入力信号を変換することです。あなたは、あなたが本当に欲しいの傾向を知らない、またはこのような特定の変換を想定したくない、より一般的なユースケースについては、

X = np.array(X)[:,None]**2 
clf = SVR(kernel='linear').fit(X, y) 

:たとえば、平方根のトレンドを想定します可能な限り最良の変換と数学的モデルを計算するために、ユーレカのような回帰ツールを試してみるかもしれません。

+1

ちょうどそれがいつも上ったり下ったりすると、実際には何も説明されません。彼の希望するトレンドラインは、ある程度の距離が右になるまで下がらない二次トレンドになる可能性があります。 – BrenBarn

+1

@BrenBarn私はそれが彼が最終的に望んでいるものに依存すると思う。モデルがどのように外挿するか、これほど難しい制約なしにデータを超えてどこを変えるかを制御するのは難しいです。 – Inverse

+0

@BrenBarnが書いたことも私が想定したものです。上記のコードは実行されません。 '' TypeError:リストインデックスはタプルではなく整数でなければなりません。 – tkja

関連する問題