亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么馬爾可夫鏈會重演?

為什么馬爾可夫鏈會重演?

慕容森 2023-07-05 10:17:21
我正在嘗試使用 Python 中的類來模擬馬爾可夫鏈。這是我的代碼:import random...class Chain:  def __init__(self, probabilities, start):    self.probs = probabilities    self.start = start    self.names = list(self.probs.keys())  def __iter__(self):    self.pos = self.start    return self  def __next__(self):    self.random_num = random.randrange(100)    prob_l = self.probs[self.pos]    for ind, prob in enumerate(prob_l):      self.prob_sum += prob      if self.random_num < self.prob_sum:        exclude_names = self.names[:ind] + self.names[ind + 1 :]        self.prob_sum = 0        self.pos = exclude_names[ind]        return self.pos    return self.poschain = Chain({"A": [50, 25], "B": [50, 25], "C": [50, 50]}, "A")chain_iter = iter(chain)for k in range(100):    print(next(chain_iter))它按預期工作,但有時會重復字母 C。由于字典中的兩個 50,它應該有 50/50 的機會轉到 A 或 B。它不應該重復。
查看完整描述

1 回答

?
DIEA

TA貢獻1820條經驗 獲得超2個贊

您會看到重復的 C,因為當前節點的索引未正確計算。


這是帶有注釋的更新代碼:


class Chain:

  def __init__(self, probabilities, start):  # only called once

    self.probs = probabilities

    self.start = start

    self.names = list(self.probs.keys())

    

  def __iter__(self):  # only called once

    return self

    

  def __next__(self):  # each iteration

    import random

    self.pos = self.start  # next step

    self.random_num = random.randrange(100) # choice percentile must be in here

    i = self.names.index(self.pos) # get index of this node in big list

    prob_l = self.probs[self.pos]  # get probs

    self.prob_sum = 0  # start prob scan

    for ind, prob in enumerate(prob_l): # probs of going to another node

      self.prob_sum += prob  # until 100%

      if self.random_num < self.prob_sum:  # passed percentile, go to another node

        exclude_names = self.names[:i] + self.names[i + 1:]  # big list without this node

        self.start = exclude_names[ind]  # for next iteration

        break   # found percentile in probs

    return self.pos # add current pos to chain

    

chain = Chain({"A": [50, 25], "B": [50, 25], "C": [50, 50]}, "A")

chain_iter = iter(chain)

for k in range(100):

   print(next(chain_iter), end=" ")

輸出(包裝)


A B A A B B C B A B A C A B C B A C B A B C B B C 

B A B C B A C A B A A B C B B A B B A B A C B C B 

B C A B A C A C B A C A B A B A C A B B C B A B A 

C A C A C B A A C B A A B B B A A A C A A B A B B


查看完整回答
反對 回復 2023-07-05
  • 1 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號