2012-08-07 11 views
8

私は、同様の期間のデータセットをいくつか持っています。その日の人々のプレゼンテーションです。期間は約1年です。データは定期的に収集されていませんが、5年ごとに毎年15-30件のエントリがかなりランダムです。前の日付から予測する:値データ

各年のデータから作成されたグラフは、おおよそ次のようになります。 graph グラフはmatplotlibで作成しました。 私はdatetime.datetime, int形式のデータを持っています。

将来どのように物事が起こるかをどのような賢明な方法で予測することは可能でしょうか?私の元の考えは、以前のすべての出来事の平均を数え、それがこれとなることを予測することでした。しかし、現在の年のデータは考慮されていません(平均よりも高い場合は、おそらくわずかに高いはずです)。

データセットと統計情報が限られているため、すべての洞察が役立ちます。

私の目標は、私のデータが十分なものであれば試してみることです。検証の後、より洗練されたアプローチを試みます。

編集:残念ながら、私は受け取った回答を試す機会がありませんでした!この種のデータで十分だろうと私はまだ不思議ですが、チャンスを取ればこれを念頭に置いていきます。すべての答えをありがとう。

+2

本当にコードについては、この質問イマイチ、数学の詳細、どのようにあなたは、この意味での予測を定義していますか?このタイプの曲線/グラフ上の数学的方法は何ですか?私はこれがこの質問の正しい場所だとは思わない。 –

+1

@Inbar私はこれがコードセクションに完全に適合していないことを知っていますが、これが私が近づいている唯一の角度です。私は、ここの人々が私に解決策の方向性を与えるのに十分な専門知識を持っていると確信しています。 – schme

+0

この質問は、http://stats.stackexchange.com/によく合います。 –

答えて

4

予測は困難です。 polynomial extrapolationを試してみるとよいかもしれませんが、「既知の」領域から離れるほど、推定値が大幅に増加します。

もう1つの解決策はアルゴリズムmachine learningを使用しようとしていますが、多くのデータを収集する必要があります。

データからフィーチャを抽出します(フィーチャは、たとえば1日のエントリ数です)。アルゴリズムを訓練する。 (過去のデータにはフィーチャを、過去には予測フィールドとして表示)。

pythonについてはわかりませんが、Javaでは - wekaというオープンソースライブラリがあり、機械学習に使用されるほとんどの機能とアルゴリズムが実装されています。

cross validationを使用して、この方法の正確さを評価することができます。それと


言った - この問題は通常、トレンド検出と呼ばれ、現在研究中で熱い分野であるので、there is no silver bulletされます。

+0

機械学習には本当に多くのデータが必要ですか? – darkphoenix

+0

@darkphoenix:個人的な経験からすれば、データが多いほど、アルゴリズムが得られる結果はより良いものになります。つまり、線形回帰のようなものについては、そうではないかもしれません。また、それが実際に動作することを証明するために、統計的なテストを行います。これらは通常、数百または数千の分類されたインスタンスを必要とします。 – amit

+2

pythonの場合、scikits.learnがあります。オレンジも使用できると思います。どちらもnumpyに依存します。 – darkphoenix

12

あなたの場合、データは急速に変化しており、新しいデータを直ちに観察することができます。素早い予測は、Holt-winter指数平滑化を使用して実施することができる。

更新式:

enter image description here

m_tは、あなたが持っているデータ、例えば、毎回tでいる人の数です。 v_tは、一次導関数、すなわち、トレンドがmである。 alphaおよびbetaは、2つの減衰パラメータです。上のtildeの変数は予測値を示します。ウィキペディアのページでアルゴリズムの詳細を確認してください。

pythonを使用しているため、データを手助けするためのサンプルコードを表示できます。ところで、私は以下のように、いくつかの合成データを使用:data_t以上

data_t = range(15) 
data_y = [5,6,15,20,21,22,26,42,45,60,55,58,55,50,49] 

時間0から始まる連続したデータ点のシーケンスです。 data_yは、各プレゼンテーションで観察される人数のシーケンスです。

データは以下のようになります(データに近づけようとしました)。

enter image description here

アルゴリズムのためのコードは簡単です。

def holt_alg(h, y_last, y_pred, T_pred, alpha, beta): 
    pred_y_new = alpha * y_last + (1-alpha) * (y_pred + T_pred * h) 
    pred_T_new = beta * (pred_y_new - y_pred)/h + (1-beta)*T_pred 
    return (pred_y_new, pred_T_new) 

def smoothing(t, y, alpha, beta): 
    # initialization using the first two observations 
    pred_y = y[1] 
    pred_T = (y[1] - y[0])/(t[1]-t[0]) 
    y_hat = [y[0], y[1]] 
    # next unit time point 
    t.append(t[-1]+1) 
    for i in range(2, len(t)): 
     h = t[i] - t[i-1] 
     pred_y, pred_T = holt_alg(h, y[i-1], pred_y, pred_T, alpha, beta) 
     y_hat.append(pred_y) 
    return y_hat 

[OK]を、今、私たちの予測因子を呼び出し、観測に対する予測結果をプロットしてみましょう:

import matplotlib.pyplot as plt 
plt.plot(data_t, data_y, 'x-') 
plt.hold(True) 

pred_y = smoothing(data_t, data_y, alpha=.8, beta=.5) 
plt.plot(data_t[:len(pred_y)], pred_y, 'rx-') 
plt.show() 

赤は、各時点での予測結果を示しています。 alphaを0.8に設定し、最新の観測結果が次の予測に多く影響するようにします。履歴データの重みを増やしたい場合は、パラメータalphabetaで再生してください。また、赤線の最も右のデータ点はt=15であり、まだ観測がない最後の予測です。

BTW、thisは完璧な予測とはほど遠いです。すぐに始めることができます。このアプローチの欠点の1つは、観測を得ることができなければならないということです。そうでなければ、予測はますますオフになります(おそらく、これはすべてのリアルタイム予測に当てはまります)。それが役に立てば幸い。

enter image description here

関連する問題