機器學習實戰kNN中的文本轉換爲數組程序心得
- 原程序
- 出現的問題
- 解決的辦法
原程序
在機器學習實戰書中2.2.1章節中,作者在準備數據時,打算從文本文件中解析數據,其代碼爲:
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines())
returnMat = zeros((numberOfLines,3))
classLabelVector = []
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
>>>reload(kNN)
>>>datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt')
在其中文版的書中,datingLabels輸出是[3,2,1…],因爲在輸入文件datingTestSet.txt(可以去網站下載)中,他的標籤是largeDoses,smallDoses,didntLike,估計他的本意就是用1,2,3來代替標籤largeDoses,smallDoses,didntLike。
出現的問題
但是運行這個程序是有問題的,主要出現在
classLabelVector.append(int(listFromLine[-1]))
本意是將listFromLine最後一列的字符標籤轉成int類型,但是運行是不行的,會出錯。
解決辦法
* 按照英文版機器學習實戰,輸出的就是標籤字符,所以,可以改爲如下:*
classLabelVector.append(listFromLine[-1])
* 按照中文版機器學習實戰,要輸出int型數字,可以使用一個字典:*
def file2matrix(filename):
'''
:param filename: 輸入爲文件名字符串
:return: 輸出爲訓練樣本矩陣和類標籤向量
'''
fr = open(filename)
arrayOLines = fr.readlines()
numberOfLines = len(arrayOLines)
returnMat = zeros((numberOfLines, 3))
classLabelVector = []
index = 0
string2int = {'largeDoses':3, 'smallDoses':2, 'didntLike':1}# 創建一個字典
for line in arrayOLines:
line = line.strip()# 截取回車字符
listFromLine = line.split('\t')# 將整行的數據分割成一個元素列表
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(string2int.get(listFromLine[-1]))# 取字典值所對應的鍵
index += 1
return returnMat, classLabelVector