2016-07-17 10 views
-1

私はMachine Learning in Actionの本を読んでいます。分類のためのPython文字列

第2章の1つの例は、分類を使用するためにstringをintに変換します。たとえば、'student' = 1, 'teacher' = 2, engineer = 3です。エラーが立ち上がっている間、私はそれを実行しながら、

はライン12に以下のコードを参照してください:int型のため

無効なリテラル()ベース10と:「largeDose」が

どこに問題があります。

def file2matrix(filename): 
    fr = open(filename) 
    numberOfLines = len(fr.readlines())   #get the number of lines in the file 
    returnMat = zeros((numberOfLines,3))  #prepare matrix to return 
    classLabelVector = []      #prepare labels return 
    fr = open(filename) 
    index = 0 
    for line in fr.readlines(): 
     line = line.strip() 
     listFromLine = line.split('\t') 
     returnMat[index,:] = listFromLine[0:3] 
     classLabelVector.append(int(listFromLine[-1])) 
     index += 1 
    return returnMat,classLabelVector 

発信者コード:

from numpy import * 
import kNN 
datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt') 
import matplotlib 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.add_subplot(111) 
#ax.scatter(datingDataMat[:,1], datingDataMat[:,2]) 
ax.scatter(datingDataMat[:,1], datingDataMat[:,2], array(datingLabels),  array(datingLabels)) 
plt.show() 

トレースバックとエラー:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile 
    execfile(filename, namespace) 
    File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 
    File "C:/Users/Zhiming Zhang/Documents/Machine Learning/kNN/execute.py", line 10, in <module> 
    datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt') 
    File "kNN.py", line 48, in file2matrix 
    classLabelVector.append(int(listFromLine[-1])) 

とValueError:int型のための無効なリテラル()ベース10との 'largeDoses'

+0

ありません。ちょうど編集されました。ありがとう – user6601116

+0

これはエラーです:基数10のint()の無効なリテラル: 'largeDose' – user6601116

+0

エラーと発信者コード –

答えて

0

あなたがしよう変換関数int()を使用して、 "largeDose"のような文字列をintに変換します。しかし、これはどのように動作するのではありません。関数int()は、整数番号(例えば、"123")のように見える文字列のみを整数に変換する。

場合によっては、if - elif - elseカスケードまたは辞書のいずれかを使用できます。

カスケード:

if listFromLine[-1] == 'largeDose': 
    result = 1 
elif listFromLine[-1] == 'teacher': 
    result = 2 
elif … 
    … 
else: 
    result = 0 # or raise an exception or whatever 

辞書:それはないです

conversion = { 
    'largeDose': 1, 
    'teacher': 2, 
    … } 
# ... 
# later, in the loop: 
classLabelVector.append(conversion[listFromLine[-1]]) 
+0

これは涼しいです。やってみます。どうもありがとうございました! – user6601116

+0

ようこそStackOverflowへ!この答えが役に立つと分かっている場合は、それをupvoteしてください(それ以外の上三角をクリックしてください)。実際に問題を解決する場合は、それを受け入れてください(それ以外のチェックマークをクリックしてください)。そして、幸せなハッキング;-) – Alfe

+0

私はあなたが答えをupvoteしようとしたが失敗しました。あなたの答えをどう受け入れることができますか?どうも! – user6601116

関連する問題