2.2:示例,使用k鄰近演算法改進約會網站的配對效果 之一

行走在時光中發表於2016-01-21
首先是看程式,自行新增註釋:  
# 程式清單2-2 將文字記錄到轉換NumPy的解析程式.  
def file2matrix(filename):
fr = open(filename)  # 開啟文件
arrayOLines = fr.readlines()  # 讀取並返回文件中行的列表,即現在arrayOLines是一個列表.
numberOfLines = len(arrayOLines)  #讀取列表長度,即文件的行數.
returnMat = zeros((numberOfLines, 3))  #生成一個元組,元組中是一個文件行數行,3列的0矩陣.
classLabelVector = []  # 類標籤向量,初始時為空元組.
index = 0
for line in arrayOLines  #對行的列表中的每一行進行操作.
    line = line.strip()  #規範化,刪除每一行中的空白字元
    listFromLine = line.split('\t')  #繼續規範化,進行分割.
    returnMat[index, :] = listFromLine[0 : 3]  #由於特徵有三個,所以這裡放入了三個特徵到矩陣中,序號3不算在內.
classLabelVector.append(int(listFromLine[-1]))  #儲存最後一列,即樣本的類別.
    index += 1
return returnMat, classLabelVector
試著執行一下,
然而,這裡產生了一個報警:

enter image description here

 為什麼?
答案非常簡單,作者在這裡漏了一個冒號,而Python的for語句都需要加冒號,實際上Python下一行需要縮排的地方,在本行都需要加冒號.略懂的我抄著書跟著漏掉了這個冒號.
然後我查閱了英文版,這裡是有一個冒號的...
新增之後,編譯沒有報錯了.
如下執行:
>>> import kNN
>>> datingDataMat, datingLabels = kNN.file2matrix('datingTestSet.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "kNN.py", line 54, in file2matrix
    classLabelVector.append(int(listFromLine[-1]))                                                                
ValueError: invalid literal for int() with base 10: 'largeDoses'
百度之,是轉換為整數出錯,難道是類別無法轉換為整數?
開啟文件,確實是這樣,第一行對應的類別是” largeDoses”,這個字串自然無法轉換為整數.
那作者是怎麼做下去的呢?
開啟作者的程式文件,發現確實是這麼寫的,英文版書籍上也是,那麼為什麼作者能做下去,而且還能得到結果!(中文版與英文版的結果不同,中文版上是數字,而英文版是字串,如下截圖:)

& enter image description here & enter image description here

貌似都可行啊.
既然是轉換出錯,那麼,我不轉換試試?下面是結果:
>>> reload (kNN)                                                                                                                                                                                                     
<module 'kNN' from 'kNN.py'>
>>> datingDataMat, datingLabels = kNN.file2matrix('datingTestSet.txt')
>>> datingDataMat
>>> datingDataMat
array([[  4.09200000e+04,   8.32697600e+00,   9.53952000e-01],
       [  1.44880000e+04,   7.15346900e+00,   1.67390400e+00],
       [  2.60520000e+04,   1.44187100e+00,   8.05124000e-01],
       ...,
       [  2.65750000e+04,   1.06501020e+01,   8.66627000e-01],
       [  4.81110000e+04,   9.13452800e+00,   7.28045000e-01],
       [  4.37570000e+04,   7.88260100e+00,   1.33244600e+00]])
>>> datingLabels[0 : 20]
['largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike'
, 'didntLike', 'didntLike', 'smallDoses', 'largeDoses']
看來是這樣了,為什麼要int,中文版中是這麼解釋的:

& enter image description here 英文的解釋與中文版沒有區別. 問題是我得到的文件儲存的元素值確實是字串,莫非是因為文件不同?假設我需要當作字串處理,確實這個int轉換是錯誤的.

先拋開這個問題,明天繼續.

相關文章