次のコードは、マルコフ遷移行列の次数 1 に関する別のソリューションを提供します。データは、整数のリスト、文字列のリスト、または文字列にすることができます。否定的な考えは、この解決策にはおそらく時間とメモリが必要だということです。
- マルコフ遷移行列次数 1 (バイグラム) を作成します
- マルコフ遷移行列をデータセットにトレーニングするために、1000 個の整数を生成します。
- マルコフ遷移行列を訓練する
ここまでは、問題の解決策です。次のコードは、追加の問題を解決しようとしています。具体的には、訓練されたマルコフタスクに従ってデータを生成します。
- マルコフ遷移行列の確率を累積に変換 (算術コーディング)
- 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)