状態遷移確率行列
下の図のように、状態s1とs2は矢印にある確率にそって、時間ごとに遷移する。

この時の矢印に書いてあるのが遷移確立。文字通り、遷移するときの条件付確率。
全体でどれだけがs1にいくか、またs2に行くかをあらわす確率(定常確率)を求めたい。
時間t=nの時に状態s1にある確率をPs1、s2にある確率をPs2とすると、下のような形の式が出来る。

この式の遷移確率で出来ている行列を遷移確立行列といい、この行列のn乗を考え、nを大きくしていくと定常確率が求められる・・・・・・・・・・・らしい。
授業はここで終わりました。行列計算が出来る関数電卓を持ってなかったので、家に帰ってからちょこちょこプログラミングしました。

この時の矢印に書いてあるのが遷移確立。文字通り、遷移するときの条件付確率。
全体でどれだけがs1にいくか、またs2に行くかをあらわす確率(定常確率)を求めたい。
時間t=nの時に状態s1にある確率をPs1、s2にある確率をPs2とすると、下のような形の式が出来る。

この式の遷移確率で出来ている行列を遷移確立行列といい、この行列のn乗を考え、nを大きくしていくと定常確率が求められる・・・・・・・・・・・らしい。
授業はここで終わりました。行列計算が出来る関数電卓を持ってなかったので、家に帰ってからちょこちょこプログラミングしました。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; class Matrix { public: double m[2][2]; Matrix() { memset(m, 0, sizeof(m)); } Matrix& operator=(const Matrix& obj) { for (int i=0;i < 2;i++) for (int j=0;j < 2;j++) m[i][j] = obj.m[i][j]; return *this; } Matrix operator*(const Matrix& obj) { Matrix temp; for (int i=0;i < 2;i++) for (int j=0;j < 2;j++) for (int k=0;k < 2;k++) temp.m[i][j] += m[i][k]*obj.m[k][j]; return temp; } void print() { for (int i=0;i < 2;i++) { for (int j = 0;j < 2;j++) cout << m[i][j] << " "; cout << endl; } } }; int main() { Matrix A, X, Y; A.m[0][0] = 0.3; A.m[0][1] = 0.6; A.m[1][0] = 0.7; A.m[1][1] = 0.4; X.m[0][0] = X.m[1][1] = 1; for (int i=0;i < 20;i++) { Y = A * X; Y.print(); X = Y; getchar(); } return 0; }
2×2行列しか使えないぜッ!
ダメだぜッ!
友達に見せたら「Matrixクラス(笑)」とか言われそうorz
と り あ え ず
エンターキー押していくと、行列の掛け算していきます。
n=10くらいから上2つと下2つが同じ値になっていき、この値が定常確率になるそーですよー
足したら1になりそうだし、多分あってんでしょうよ!