首页 文章

列表索引必须是整数或切片而不是str-HMM前向算法

提问于
浏览
0

我正在尝试实现前向算法以计算HMM . 我正在一步一步地调试每一步但我得到一个错误 . 任何人都可以告诉我错误是什么?

我的代码是:

states = ('Fever','Healthy')
end = 'F'
observation =('3','1','1','2','2','3','1','3')
start = {'Fever': 0.5, 'Healthy': 0.5}
trans_prob = {
   'Fever' : {'Fever': 0.8, 'Healthy': 0.1, 'F': 0.1},
   'Healthy' : {'Fever': 0.1, 'Healthy': 0.8, 'F': 0.1},
   }
em_prob = {
   'Fever' : {'1': 0.1, '2': 0.2, '3': 0.7},
   'Healthy' : {'1': 0.7, '2': 0.2, '3': 0.1},
   }
#lent = len(observation)
prev = []
for i, obs_i in enumerate(observation):
    curr = []
    for st in states:
        if i==0:
            prev_sum =start[st]*em_prob[st][obs_i]
        else:
            for i in trans_prob.keys():
                prev_sum = sum(prev[k]*transition_probability[i][st] for k in states)
                print (prev_sum)

它给了我这个错误:

TypeError Traceback(最近一次调用last)in()20 else:21 for i in trans_prob.keys():---> 22 prev_sum = sum(prev [k] * transition_probability [i] [st] for k in states )23打印(prev_sum)in(.0)20 else:21 for i in trans_prob.keys():---> 22 prev_sum = sum(prev [k] * transition_probability [i] [st] for k in states) 23 print(prev_sum)TypeError:list indices必须是整数或切片,而不是str

1 回答

  • 0

    问题是 iprev_sum = sum(prev[k]*transition_probability[i][st] for k in states) 中不是整数的字符串 .

    你创建一个for循环,迭代 trans_prob 的键 . 但是这些键是"Fever"和"Healthy",它们是字符串而不是整数 . 因为 transition_probability 是一个列表(显然,我没有在代码中看到它),你需要一个整数来访问它的元素 .

    你可能会在两个方面感到困惑 . 您认为 transition_probability 是字典,或者您认为 trans_prob.keys() 返回整数,而不是字符串 . 您正在寻找的值可能是 trans_prob.values() ,但即便如此,使用您当前的dict结构,它将返回字符串"Fever","Healthy","F" .

    EDIT: 啊,我看到了另一个问题 . 您在迭代中使用该变量两次 . 一旦进入最顶层的循环,哪个DOES返回一个int(这可能是你're looking for), and then once in the very inner loop, which returns strings. I'建议重写 for i in trans_prob.keys():for curr_key in trans_prob.keys():

相关问题