2017-07-12 9 views
0

私は今回帰で作業しており、多項式モデルを3つの異なる次数でデータに近似しようとしています。私はどこが間違っているのか分かりません。 -----多項式近似は高次のプロットではありません

11.04.2017,9.6059 
12.04.2017,9.5741 
13.04.2017,9.5976 
14.04.2017,9.5892 
17.04.2017,9.5763 
18.04.2017,9.6101 
19.04.2017,9.6107 
20.04.2017,9.6309 
21.04.2017,9.6611 
24.04.2017,9.6266 
25.04.2017,9.5858 
26.04.2017,9.5551 
27.04.2017,9.6070 
28.04.2017,9.6474 
01.05.2017,9.6438 
02.05.2017,9.6220 
03.05.2017,9.6326 
04.05.2017,9.7007 
05.05.2017,9.6669 
08.05.2017,9.6616 
09.05.2017,9.6649 
10.05.2017,9.6974 
11.05.2017,9.6489 
12.05.2017,9.6480 
15.05.2017,9.6903 
16.05.2017,9.7402 
17.05.2017,9.7432 
18.05.2017,9.7797 
19.05.2017,9.7800 
22.05.2017,9.7683 
23.05.2017,9.7363 
24.05.2017,9.7255 
25.05.2017,9.7378 
26.05.2017,9.7233 
29.05.2017,9.7138 
30.05.2017,9.7580 
31.05.2017,9.7684 
01.06.2017,9.7402 
02.06.2017,9.7256 
05.06.2017,9.7388 
06.06.2017,9.7707 
07.06.2017,9.7833 
08.06.2017,9.7685 
09.06.2017,9.7579 
12.06.2017,9.7980 
13.06.2017,9.7460 
14.06.2017,9.7634 
15.06.2017,9.7540 
16.06.2017,9.7510 
19.06.2017,9.7475 
20.06.2017,9.7789 
21.06.2017,9.7676 
22.06.2017,9.7581 
23.06.2017,9.7629 
26.06.2017,9.7537 
27.06.2017,9.7647 
28.06.2017,9.7213 
29.06.2017,9.6806 
30.06.2017,9.6309 
03.07.2017,9.6479 
04.07.2017,9.6740 
05.07.2017,9.6332 
06.07.2017,9.6457 
07.07.2017,9.6084 
10.07.2017,9.6101 
11.07.2017,9.6299 

私は日付との何かが、私は日付なしで働いてプロットを得たのでと思い

# -*- coding: utf-8 -*- 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import datetime as dt 
import time 

def main(): 
    inputfile = "statistics.txt" 
    X= np.loadtxt(inputfile, delimiter=",",dtype=np.str, usecols=[0]) 
    X= [dt.datetime.strptime(date, '%d.%m.%Y') for date in X] 
    X = mdates.date2num(X) 
    Y= np.loadtxt(inputfile, delimiter=",", usecols=[1]) 
    num_training = int(0.9*len(X)) 
    num_test = len(X) - num_training 
    X_train, Y_train = X[:num_training], Y[:num_training] 
    X_test, Y_test = X[num_training:], Y[num_training:] 
    plt.scatter(X_train, Y_train, color="blue",s=10, marker='o') 
    plt.title("Euro Swedish Krona Exchange rate") 
    plt.xlabel("Time in months from April to June in 2017") 
    plt.ylabel("Exhange rate") 
    colors = ['teal', 'yellowgreen', 'gold'] 
    for count, degree in enumerate([2, 3, 4]): 
     coeffs = np.polyfit(X_train, Y_train, degree) 
     f = np.poly1d(coeffs) 
     x_line = np.linspace(X[0], X[-1], 50) 
     x_line_plot = mdates.num2date(x_line) 
     y_line = f(x_line) 
     plt.plot(x_line_plot, y_line, color=colors[count], linewidth=2, label="degree {}".format(degree)) 
     print(coeffs) 
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b')) 
    plt.gca().xaxis.set_major_locator(mdates.MonthLocator())  
    plt.grid() 
    plt.legend(loc='upper left') 
    plt.show() 

if __name__ == '__main__': 
    main() 

----- statistics.txt:ここに私のコードとデータポイントです。私のコードには多すぎることもあります。その程度の値を変更することで、私は時々3つの曲線を取得し、時にはだけ@DavidGコメントで指摘したように1

+0

あなたはあなたが得るエラーを説明する以外にも、私達にあなたの.txtファイルを表示することができます。 – eyllanesc

+1

フィギュアを拡大すると、それは3つのすべてのプロットが表示されますが、非常に近いです。 – DavidG

答えて

2

、3つの曲線が非常に接近しているので、あなたは、ズームインしない限り、彼らは同じように見えることも奇妙な。

これは単なる問題の症状です。コードを実行したときに表示された警告に気づいたでしょう。これらは、polyfitに発生する数値問題を示しています。 Xの値は比較的大きく、非常に近い値です。明らかに、彼らはpolyfitに問題を引き起こすのに十分な大きさです。これを回避する1つの方法は、Xの値から平均値を差し引くことです。そのため、シフトされたデータを標準偏差で除算することも検討してください。ホワイトニングとして知られています。場合は、単にデータをシフトすることで十分である)

ここX値(私はあまりにも、色及びスタイルを少し微調整)のこのシフト行いフィッティング及びプロットコードのバージョンの修飾は次のとおり。

colors = ['teal', 'darkgreen', 'black'] 
markers = ['-', ':', '--'] 
alphas = [1, 1, 0.25] 
mu = X_train.mean() 
for count, degree in enumerate([2, 3, 4]): 
    coeffs = np.polyfit(X_train - mu, Y_train, degree) 
    f = np.poly1d(coeffs) 
    x_line = np.linspace(X[0], X[-1], 50) 
    x_line_plot = mdates.num2date(x_line) 
    y_line = f(x_line - mu) 
    plt.plot(x_line_plot, y_line, markers[count], color=colors[count], 
      linewidth=1+2*(count==2), alpha=alphas[count], 
      label="degree {}".format(degree)) 
    print(coeffs) 

次数3と次数4の曲線はまだ近いですが、次数2の曲線とはかなり異なります。

plot

+0

素晴らしい答えをありがとう!私はこの問題から学んだのは、色付きのマーカーを使うべきであり、エラーを避けるために便利な前処理テクニックがあるということでした!ここではフォローアップの質問です:私は線形と多項式がある回帰について学びました、そしてまた、曲線にデータにフィットするような正弦関数などの種類の関数を学びました。データを変更するためにプリプロセッサーの方法を使用する必要があることもあります(ここから学ばれます)。私が正しくnumpyのpolyfitを理解していれば、最小二乗法を推定値として使用します。 –

+0

私はnumpyで見つけることができるいくつかの他の見積もりを使用することができます(私はsklearnで私はRidge Bayasianのテクニックを使用することができます)。回帰とカーブフィッティングについて知っておくべきことがありますか? –

+0

その質問は、あまりにも広すぎて、SOに関するコメントでは答えが出ません。誰もが知っているべきことに答える資格はありません。 :)そのような質問は、https://stats.stackexchange.com/には適切かもしれません。 –

関連する問題