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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表索引必须是整数或切片而不是str-HMM前向算法相关的知识,希望对你有一定的参考价值。

我正在尝试实现前向算法以计算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(最近的最后一次调用)20 else:21 in for 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

答案

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

你创建一个for循环遍历trans_prob的键。但那些键是“发烧”和“健康”,它们是字符串而不是整数。因为transition_probability是一个列表(显然,我没有在代码中看到它),你需要一个整数来访问它的元素。

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

编辑:啊,我看到另一个问题。您在迭代中使用该变量两次。一旦进入最顶层的for循环,哪个DOES返回一个int(这可能是你正在寻找的东西),然后一次在内部循环中,它返回字符串。我建议将for i in trans_prob.keys():改写为for curr_key in trans_prob.keys():

以上是关于列表索引必须是整数或切片而不是str-HMM前向算法的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:列表索引必须是整数或切片,而不是浮点数

TypeError:列表索引必须是整数或切片,而不是 str

TypeError:列表索引必须是整数或切片,而不是尝试制作二维列表时的元组

JSON / MySQL:列表索引必须是整数或切片,而不是 str

错误列表索引必须是整数或切片,而不是str

Python:无法替换列表中的项目,原因是:TypeError:列表索引必须是整数或切片,而不是 str