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

我在尝试编写朴素贝叶斯分类器时,一直遇到这个错误:

Traceback (most recent call last):File "<pyshell#30>", line 1, in <module>import naive_assignmentFile "C:\Python27\naive_assignment.py", line 655, in <module>main()File "C:\Python27\naive_assignment.py", line 650, in mainpans.append(p.classify(row))File "C:\Python27\naive_assignment.py", line 597, in classifyless50Kcp = 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()

有谁知道如何修复这个问题吗?


回答:

self.less_cat_probs.get(query[4]) 显然返回了 None – 你需要检查并避免这种情况,或者修复产生它的代码。

错误消息已经很好地解释了这一点 – 它抛出了一个不支持的类型错误,并告诉你不能在给定行上将 floatNoneType 相加。正如我们所见,less50Kcp 是一个浮点数,因此另一个项目必须是 None,因此出现了错误,因为 None 不是一个数字。

一个可能的修复方法 – 假设 self.less_cat_probs 是一个字典,可以为 get() 提供一个默认值 0,这样当找不到键时,加法仍然可以工作。例如:

less50Kcp = less50Kcp + self.less_cat_probs.get(query[4], 0)

然而,这里有一个问题,就是这是否是你想要的功能 – 你可能更希望确保字典中需要的地方有条目,并且你可能希望在你的结果中重复这个修复。

请注意,你提供给我们的代码是一个非常糟糕的复制粘贴编程的例子 – 这会导致更多的错误,更难维护,更多的错误,以及更多的输入。我强烈建议你正确地做这件事,使用循环和数据结构来减少重复的代码,这将使你更容易发现错误。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注