2012-04-16 7 views
0

私は、単純ベイズ分類器を記述しようとしていますし、私はこのエラーを取得しておいてください。Pythonのエラーサポートされていないオペランドのタイプ(複数可)

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' 

そこの修正のほとんどが何かを返すと言うので、私はそれを修正する方法がわからamentすでにコードに入っています。

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

self.less_cat_probs.get(query[4])は明らかにNoneと評価されます。これを確認して回避するか、それを生成するコードを修正する必要があります。

このエラーメッセージでは、サポートされていないタイプのエラーが表示され、指定された行のNoneTypefloatを追加できないことを伝えています。 less50Kcpは浮動小数点であることがわかりますから、他の項目はNoneである必要があります。したがって、エラーはNoneは数字ではありません。

可能性のある修正 - self.less_cat_probsと仮定すると、デフォルト値の0get()に設定すると、キーが見つからない場合でも加算が実行されます。例:

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

の質問は、これは望ましい機能であるかどうかの、しかし、があります - あなたの代わりにあなたが必要な辞書のエントリを持っていることを確認したい場合があります、そしておそらくあなたはこの修正を繰り返したいでしょう結果全体で

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

関連する問題