0

単純ベイズ分類器を書き込もうとしていますが、次のエラーが発生し続けます。

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

誰かがこれを修正する方法を知っていますか?

4

1 に答える 1

4

self.less_cat_probs.get(query[4])どうやら評価しNoneます-これをチェックして回避するか、それを生成するコードを修正する必要があります。

floatエラーメッセージはこれを非常によく説明しています-サポートされていないタイプのエラーをスローし、指定された行のにを追加できないことを通知しますNoneTypeless50Kcpフロートであることがわかるように、他のアイテムは、数値ではないNoneので、エラーである必要がありますNone

考えられる修正-推定self.less_cat_probsはdictでありget()、デフォルト値のを提供することです0。これにより、キーが見つからない場合でも加算が機能します。例えば:

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

ただし、これが目的の機能であるかどうかという疑問があります。代わりに、必要に応じてdictにエントリがあることを確認し、結果全体でこの修正を繰り返したいと思うかもしれません。

あなたが私たちに与えたコードは、コピー/貼り付けコーディングの本当に悪い例であることに注意してください-これは、より多くのバグ、より困難なメンテナンス、より多くのバグ、そしてより多くのタイピングにつながります。これを適切に実行し、ループとデータ構造を使用して繰り返しコードを減らすことを強くお勧めします。これにより、バグを見つけやすくなります。

于 2012-04-16T19:45:09.240 に答える