機器學習實戰kNN中的文本轉換爲數組程序心得

機器學習實戰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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章