状態遷移確率行列
下の図のように、状態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になりそうだし、多分あってんでしょうよ!