22

一連の 4 つのマルコフ状態 (A、B、C、D) があるとします。

X = [A, B, B, C, B, A, D, D, A, B, A, D, ....]

Python を使用してマルコフ変換行列を生成するにはどうすればよいですか? 行列は、各状態から他の 3 つの状態に移動する確率を示す 4 行 4 列でなければなりません。私はオンラインで多くの例を見てきましたが、それらのすべてで、データに基づいて計算されたのではなく、マトリックスが与えられています。hmmlearn も調べましたが、遷移行列を吐き出す方法について読んだところはありませんでした。この目的で使用できるライブラリはありますか?

これは、私がPythonでやろうとしている正確なことのRコードです: https://stats.stackexchange.com/questions/26722/calculate-transition-matrix-markov-in-r

4

3 に答える 3

1

次のコードは、マルコフ遷移行列の次数 1 に関する別のソリューションを提供します。データは、整数のリスト、文字列のリスト、または文字列にすることができます。否定的な考えは、この解決策にはおそらく時間とメモリが必要だということです。

  1. マルコフ遷移行列次数 1 (バイグラム) を作成します
  2. マルコフ遷移行列をデータセットにトレーニングするために、1000 個の整数を生成します。
  3. マルコフ遷移行列を訓練する

ここまでは、問題の解決策です。次のコードは、追加の問題を解決しようとしています。具体的には、訓練されたマルコフタスクに従ってデータを生成します。

  1. マルコフ遷移行列の確率を累積に変換 (算術コーディング)
  2. 30個のデータを生成
import pandas as pd

def transition_matrix_order1(data):
    alphabet = []
    for element in data:
        if element not in alphabet:
            alphabet.append(element)
    alphabet.sort()
    
    previous = data[0]
    matrix = pd.DataFrame(0.0, index=alphabet, columns=alphabet)
    
    for i in data[1:]:
        matrix[i][previous]    += 1.0
        previous = i
    
    total = matrix.sum()
    for element in alphabet:
        matrix[element] = matrix.div(total[element])[element]
    
    return matrix, alphabet



#create data using random integers========
import random
data = [random.randint(1,5) for i in range(1000)] #You can also put list of strings or a string as input data



#create markov transition matrix order 1 (bigram)
markov_matrix, alphabet = transition_matrix_order1(data)



#=the following code uses the probabilities in order to create new data.=



#transform probabilities of markov transition matrix to cumulative
for column in alphabet:
    for pos, index in enumerate(alphabet[1:]):
        markov_matrix[column][index] += markov_matrix[column][alphabet[pos]]




#generating 30 data
generated_data = []
feed = random.choice(alphabet)
generated_data.append(feed)
for i in range(30):
    random_value = random.uniform(0, 1)
    for i in alphabet:
        if markov_matrix[feed][i] >= random_value:
            generated_data.append(i)
            feed = i
            break



print(generated_data)
于 2021-07-06T10:11:45.160 に答える