В настоящее время я сижу над проблемой, связанной с марковскими цепями, когда вход задается в виде списка строк. Этот вход должен быть преобразован в цепь Маркова. Сижу над этой проблемой уже пару часов.
Моя идея: Как вы можете видеть ниже, я попытался использовать счетчик из коллекций для подсчета всех переходов, и это сработало. Теперь я пытаюсь подсчитать все кортежи, где A и B являются первыми элементами. Это дает мне все возможные переходы для A.
Затем я буду считать переходы типа (A, B). Затем я хочу использовать их для создания матрицы со всеми вероятностями.
def markov(seq):
states = Counter(seq).keys()
liste = []
print(states)
a = zip(seq[:-1], seq[1:])
print(list(a))
print(markov(["A","A","B","B","A","B","A","A","A"]))
Пока я не могу заставить работать подсчет кортежей. Любая помощь или новые идеи о том, как решить эту проблему, приветствуются.
Для подсчета кортежа можно создать еще один счетчик.
b = Counter()
for word_pair in a:
b[word_pair] += 1
b
будет вести счет пары.
Чтобы создать матрицу, вы можете использовать numpy.
c = np.array([[b[(i,j)] for j in states] for i in states], dtype = float)
Я оставлю задачу нормализации каждой суммы строки до 1 в качестве упражнения.
Я не получил именно то, что вы хотели, но вот что я думаю, что это:
from collections import Counter
def count_occurence(seq):
counted_states = []
transition_dict = {}
for tup in seq:
if tup not in counted_states:
transition_dict[tup] = seq.count(tup)
counted_states.append(tup)
print(transition_dict)
#{('A', 'A'): 3, ('A', 'B'): 2, ('B', 'B'): 1, ('B', 'A'): 2}
def markov(seq):
states = Counter(seq).keys()
print(states)
#dict_keys(['A', 'B'])
a = list(zip(seq[:-1], seq[1:]))
print(a)
#[('A', 'A'), ('A', 'B'), ('B', 'B'), ('B', 'A'), ('A', 'B'), ('B',
#'A'), ('A', 'A'), ('A', 'A')]
return a
seq = markov(["A","A","B","B","A","B","A","A","A"])
count_occurence(seq)