我正在尝试编写朴素贝叶斯分类器,但我总是收到这个错误:
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
import naive_assignment
File "C:\Python27\naive_assignment.py", line 655, in <module>
main()
File "C:\Python27\naive_assignment.py", line 650, in main
pans.append(p.classify(row))
File "C:\Python27\naive_assignment.py", line 597, in classify
less50Kcp = less50Kcp + self.less_cat_probs.get(query[4])
TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'我确定如何修复它,因为大多数修复程序都说返回一些东西,但已经在代码中了。
def classify(self, query):
less50Knp = 0.0
less50Kcp = 0.0
great50Knp = 0.0
great50Kcp = 0.0
less50Knp = less50Knp +self.less_num_prob_dist(float(query[1])/100)
less50Knp = less50Knp + self.less_num_prob_dist(float(query[3])/100)
less50Knp = less50Knp + self.less_num_prob_dist(float(query[5])/100)
less50Knp = less50Knp + self.less_num_prob_dist(float(query[11])/100)
less50Knp = less50Knp + self.less_num_prob_dist(float(query[12])/100)
less50Knp = less50Knp + self.less_num_prob_dist(float(query[13])/100)
less50Kcp = less50Kcp + self.less_cat_probs.get(query[2])
less50Kcp = less50Kcp + self.less_cat_probs.get(query[4])
less50Kcp = less50Kcp + self.less_cat_probs.get(query[6])
less50Kcp = less50Kcp + self.less_cat_probs.get(query[7])
less50Kcp = less50Kcp + self.less_cat_probs.get(query[8])
less50Kcp = less50Kcp + self.less_cat_probs.get(query[9])
less50Kcp = less50Kcp + self.less_cat_probs.get(query[10])
less50Kcp = less50Kcp + self.less_cat_probs.get(query[14])
less50K_prob = less50Kcp * less50Knp
great50Knp = great50Knp + self.great_num_prob_dist(float(query[1])/100)
great50Knp = great50Knp + self.great_num_prob_dist(float(query[3])/100)
great50Knp = great50Knp + self.great_num_prob_dist(float(query[5])/100)
great50Knp = great50Knp + self.great_num_prob_dist(float(query[11])/100)
great50Knp = great50Knp + self.great_num_prob_dist(float(query[12])/100)
great50Knp = great50Knp + self.great_num_prob_dist(float(query[13])/100)
great50Kcp = great50Kcp + self.great_cat_probs.get(query[2])
great50Kcp = great50Kcp + self.great_cat_probs.get(query[4])
great50Kcp = great50Kcp + self.great_cat_probs.get(query[6])
great50Kcp = great50Kcp + self.great_cat_probs.get(query[7])
great50Kcp = great50Kcp + self.great_cat_probs.get(query[8])
great50Kcp = great50Kcp + self.great_cat_probs.get(query[9])
great50Kcp = great50Kcp + self.great_cat_probs.get(query[10])
great50Kcp = great50Kcp + self.great_cat_probs.get(query[14])
great50K_prob = great50Kcp * great50Knp
if less50K_prob > great50K_prob:
return ' <=50K'
elif less50K_prob < great50K_prob:
return ' >50K'
else:
return 'unknown'我知道这不是最好的编码方式。调用此函数的主要函数是:
def main():
data = getInputData('./trainingset.txt')
test = getInputData('./queries.txt')
p = nbayes(data)
p.train()
pans = []
for row in test:
pans.append(p.classify(row))
print("n-bayes")
print(pans)
main()有谁知道怎么解决这个问题吗?
发布于 2012-04-17 03:45:09
self.less_cat_probs.get(query[4])的计算结果显然是None -您需要检查并避免它,或者修复生成它的代码。
错误消息很好地解释了这一点-它抛出了一个不受支持的类型错误,并告诉您无法向给定行上的NoneType添加float。正如我们所看到的,less50Kcp是一个浮点数,另一项必须是None,因此出现了错误,因为None不是一个数字。
一种可能的修复-假设self.less_cat_probs是一个字典,将为get()提供默认值0,这样当找不到密钥时,添加仍然有效。例如:
less50Kcp = less50Kcp + self.less_cat_probs.get(query[4], 0)
然而,有一个问题是,这是否是所需的功能-相反,您可能希望确保在字典中需要的地方有条目,并且可能希望在结果中重复此修复。
请注意,您给我们的代码是一个非常糟糕的复制/粘贴编码示例-这会导致更多的错误,更难的维护,更多的错误和更多的输入。我强烈建议正确地这样做,减少使用循环和数据结构的重复代码,这将更容易发现错误。
https://stackoverflow.com/questions/10180515
复制相似问题