状態遷移確率行列 | spin on the RITZ

状態遷移確率行列

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




この時の矢印に書いてあるのが遷移確立。文字通り、遷移するときの条件付確率。
全体でどれだけが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になりそうだし、多分あってんでしょうよ!