スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

直線近似 - 直線の相関を求める

近似について触れてみたいと思います。

FXなどで、トレンド線などがあります。
これもひとつの近似式で、多項式近似となります。
(提供会社によって手法は様々だと思います)

今回、近似式について触れる機会がありましたので、
簡単に線形近似と回帰式について紹介しようと思います。

まず、線形近似とは、2次元の複数の点をサンプルした際、
サンプルの集合がどの直線に近似しているかを表します。

そこで、サンプル点を(X,Y)とすると直線は、

Y = aX + b

と表されます。
a = 傾き , b=切片
その、aとbを求める事で、サンプル点の集合がどの直線に
近似しているかを表すことができます。
a,bは以下のような式で表すことができます。

a_b










ここで、簡単なコードを書きます。

double[] y;            // サンプルした値。xは、配列番号とする。
double   sumXk;     // xの合計
double   sumYk;     // yの合計
double   sumXkYk;  // x * y の合計
double   sumXk2;    // xの二乗の合計
double   n;             // カウント値(=y.length() と同等)
double   a;            // a (傾き)
double   b;            // b (切片)

// ∑部分を求める
for(int i = 0 ; i < y.length() ; i++){
   sumXk += i;
   sumYk += y[i];
   sumXkYk += i*y[i];
   sumXk2 += Pow(i,2);
   n++;
}

a = (n * sumXkYk - sumXk * sumYk) / (n * sumXk2 - Pow(sumXk, 2));

b= (sumXk2 * sumYk - sumXkYk * sumXk) / (n * sumXk2 - Pow(sumXk, 2));


となります。 
複数のデータの直線の類似性を計算したいときは、a,bを2次元プロットすると、算出されます。

ここで、x-yのデータがa,b直線に必ず乗っていればいいのですが、
実際のデータは、殆どの場合そのようにはいきません。
ですので、x-yのデータがa,b直線にどれくらい近似しているかを算出します。 
これを相関係数Rで表します。
今回は、ピアソンの積率相関係数で表します。
Rの値は、
-1 <= R <= 1
の値をとり、1に近い方が、よく近似しています。
ここでRは、以下の式になります。

r





ここで出てくる
ykは、実測値です。
yk fore は、先程出したa,bで算出したyの値です。
yk meanは、実測値の平均値です。
k=xです。

以下にコードを書きます。
double R = 0d;                                // 決定係数
double sum_pow2_realMfore = 0d;      // 実測値 - 予測値
double sum_pow2_realMmean = 0d;    // 実測値 - 平均値
double mean = sumYk / n;                 // 平均値 
foreach (Point pt in lpt) {
   double forecast = a * (double)pt.X + b;
   sum_pow2_realMfore += Math.Pow((double)pt.Y - forecast, 2);
   sum_pow2_realMmean += Math.Pow((double)pt.Y - mean, 2);
}

R = 1 - sum_pow2_realMfore / sum_pow2_realMmean;

となります。

終わり。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

ss_9

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。