2016-03-27 51 views
8

ローカル加重回帰を新しいデータの予測に使用できるようにするにはどうすればよいですか?ローカル加重回帰(LOESS/LOWESS)を使用した新しいデータの予測

statsmodels.nonparametric.smoothers_lowess.lowessがありますが、元のデータセットの見積もりの​​みが返されます。だから私は予想通り別々ではなく、fitpredictを一緒に使っているようだ。

scikit-learnは、常にfitメソッドを持ちます。このメソッドでは、後でpredictという新しいデータでオブジェクトを使用できます。 lowessを実装していません。

+2

これは低優先度のためではありません。 Lowessはスムージングのためのものであり、予測はしていません。 –

+2

@JesseBakkerこれは確かに予測に使用できます。 https://stat.ethz.ch/R-manual/R-devel/library/stats/html/predict.loess.html。 http://stackoverflow.com/questions/12822069/loess-predict-with-new-x-valuesも参照してください。 – max

答えて

3

ローレスは、(補間と組み合わせて)予測するのに最適です!私はコードがかなり簡単だと思います。質問があれば教えてください! Matplolib Figure

import matplotlib.pyplot as plt 
%matplotlib inline 
from scipy.interpolate import interp1d 
import statsmodels.api as sm 

# introduce some floats in our x-values 
x = list(range(3, 33)) + [3.2, 6.2] 
y = [1,2,1,2,1,1,3,4,5,4,5,6,5,6,7,8,9,10,11,11,12,11,11,10,12,11,11,10,9,8,2,13] 

# lowess will return our "smoothed" data with a y value for at every x-value 
lowess = sm.nonparametric.lowess(y, x, frac=.3) 

# unpack the lowess smoothed points to their values 
lowess_x = list(zip(*lowess))[0] 
lowess_y = list(zip(*lowess))[1] 

# run scipy's interpolation. There is also extrapolation I believe 
f = interp1d(lowess_x, lowess_y, bounds_error=False) 

xnew = [i/10. for i in range(400)] 

# this this generate y values for our xvalues by our interpolator 
# it will MISS values outsite of the x window (less than 3, greater than 33) 
# There might be a better approach, but you can run a for loop 
#and if the value is out of the range, use f(min(lowess_x)) or f(max(lowess_x)) 
ynew = f(xnew) 


plt.plot(x, y, 'o') 
plt.plot(lowess_x, lowess_y, '*') 
plt.plot(xnew, ynew, '-') 
plt.show() 
+2

これは線形補間を使用します。それは不合理ではありませんが、それは "低俗を使って予測する"ことと実際に同じではありません。 Lowessは、トレーニングポイントのサブセットに対する重み付き線形回帰として定義されます。新たなポイントのための予測は、トレーニングセットの2つの近くのポイントを予測し、それらをラインで接続するのではなく、その回帰の結果に基づいていなければなりません。密集したデータセットの場合、その違いはもちろん些細なものです。 固定値ではなく、対応する近傍の重み付けLRで範囲外の点も予測する必要があります。 – max

+0

@maxこの質問にも同様の問題がありました。 sklearnはLOESSを実装していませんが、RANSACの実装は、私の訓練されていない目に似ています。これが誰かにとって有益だと思っています。http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RANSACRegressor.html –

+0

@maxそれは全く不合理ではないし、同様のアプローチを使ってメタボロミクスをスケールアップしているデータは非パラメトリックな方法でしばらくの間保持されます。範囲外の点をLOWESSカーブの最大値または最小値のいずれかにスケーリングし、他のすべてに対して線形補間を行います。適切な線形補間のために十分な点がない場合、私の考えでは、適切なLOWESS曲線のための十分な点がありません。 私は、Pythonライブラリを使ってLOWESSにRライブラリを使っています。 Pythonライブラリには、私が調整できなかったエッジ効果に関するいくつかの問題があります。 RPy2を好きになる –

2

代わりにカーネル回帰を使用することを検討してください。

statmodelsはimplementationです。

データポイントが多すぎる場合は、sk.learnのradiusNeighborRegressionを使用し、トリコウの重み関数を指定しないでください。

+0

@David_R、あなたが何を意味したかを明確にした場合(実際にあなたの実装を示した)、この答えは目立つでしょう。ちょうど提案。 – benjaminmgross

+0

@benjaminmgross、ありがとうございます。たぶん、今週末か今週末に詳述する時間があります。 –

関連する問題