Python错误不支持的操作数类型

Python错误不支持的操作数类型,python,machine-learning,Python,Machine Learning,我正在尝试编写朴素贝叶斯分类器,但我一直遇到以下错误: 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.

我正在尝试编写朴素贝叶斯分类器,但我一直遇到以下错误:

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'

有人知道如何解决这个问题吗

self.less_cat_probs.get(查询[4])
的计算结果显然是
None
-您需要检查并避免它,或者修复产生它的代码

错误消息很好地解释了这一点——它抛出了一个不受支持的类型错误,并告诉您不能在给定行上向
NoneType
添加
float
。正如我们可以看到的那样,
less50Kcp
是一个浮点数,另一项必须是
None
,因此出现错误,因为
None
不是一个数字

一个可能的修复方法是假定
self.less_cat_probs
是dict,将提供默认值
0
,这样在找不到密钥时,加法仍然有效。例如:

less50Kcp=less50Kcp+self.less\u cat\u probs.get(查询[4],0)

然而,有一个问题是,这是否是所需的功能-您可能需要确保在dict中有所需的条目,并且可能希望在结果中重复此修复


请注意,您给我们的代码是复制/粘贴编码的一个非常糟糕的例子-这会导致更多的bug、更难的维护、更多的bug和更多的键入。我强烈建议正确地执行此操作,减少使用循环和数据结构的重复代码,这将更容易发现错误。

self.less_cat_probs.get(query[4])
显然计算为
None
-您需要检查并避免它,或者修复产生它的代码

错误消息很好地解释了这一点——它抛出了一个不受支持的类型错误,并告诉您不能在给定行上向
NoneType
添加
float
。正如我们可以看到的那样,
less50Kcp
是一个浮点数,另一项必须是
None
,因此出现错误,因为
None
不是一个数字

一个可能的修复方法是假定
self.less_cat_probs
是dict,将提供默认值
0
,这样在找不到密钥时,加法仍然有效。例如:

less50Kcp=less50Kcp+self.less\u cat\u probs.get(查询[4],0)

然而,有一个问题是,这是否是所需的功能-您可能需要确保在dict中有所需的条目,并且可能希望在结果中重复此修复

请注意,您给我们的代码是复制/粘贴编码的一个非常糟糕的例子-这会导致更多的bug、更难的维护、更多的bug和更多的键入。我强烈建议正确地执行此操作,减少使用循环和数据结构的重复代码,这将更容易发现错误

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()