>>> import kNN>>> group, labels = kNN.createDataSet()>>> kNN.classify0([18, 90], group, labels, 3)'love'
我們看到預(yù)測結(jié)果為愛情片。這是一個簡單的分類器,當(dāng)然,我們應(yīng)該通過大量的測試,看預(yù)測結(jié)果與預(yù)期結(jié)果是否相同,進(jìn)而得出錯誤率,完美的分類器錯誤率為0,最差的錯誤率為1,上邊電影分類的例子已經(jīng)可以使用了,但是貌似沒有太大的作用,下邊我們來看一個生活中的實例,使用k-近鄰算法改進(jìn)約會網(wǎng)站的效果,然后使用k-近鄰算法改進(jìn)手寫識別系統(tǒng)。
改進(jìn)約會網(wǎng)站的配對效果
有個姑娘,一直在使用某交友網(wǎng)站,但是推薦來的人總是不盡人意,她總結(jié)了一番,曾交往過3中類型的人:
- 不喜歡的人
- 魅力一般的人
- 極具魅力的人
她覺得自己可以在周一~周五約會那些魅力一般的人,周末與那些極具魅力的人約會,因為她希望我們可以更好的幫助她將匹配的對象劃分到確切的分類中,她還收集了一些約會網(wǎng)站未曾記錄過的數(shù)據(jù)信息,她認(rèn)為這些數(shù)據(jù)信息會有幫助。這些數(shù)據(jù)存放在代碼文件夾下datingTestSet2.txt
中,總共有1000行數(shù)據(jù)(妹的約了1000個人),主要包含以下特征:
- 每年獲得的飛行??屠锍虜?shù)
- 玩視頻游戲所消耗的時間百分比
- 每周消費的冰激凌公升數(shù)
我們看到,統(tǒng)計的東西都比較奇葩,我們先從文件中把這些數(shù)值解析出來,輸出訓(xùn)練樣本矩陣和分類標(biāo)簽向量。在kNN.py中繼續(xù)書寫代碼:
- 從文本中讀入數(shù)據(jù)
def file2matrix(filename) : fr = open(filename) arrayOfLines = fr.readlines() numberOfLines = len(arrayOfLines) # 得到文件行數(shù) returnMat = zeros((numberOfLines, 3)) # 創(chuàng)建用0填充的矩陣,這里為了簡化處理,我們將矩陣的另一個緯度設(shè)置為3,可以按照自己的需求增加數(shù)量。 classLabelVector = [] index = 0 # 解析文件 for line in arrayOfLines : line = line.strip() # 截取掉所有的回車字符 listFromLine = line.split('\t') returnMat[index, :] = listFromLine[0: 3] # range classLabelVector.append(int(listFromLine[-1])) index += 1 return returnMat, classLabelVector
>>> import kNN>>> mat, vector = kNN.file2matrix('datingTestSet2.txt')>>> mat, vector = kNN.file2matrix('datingTestSet2.txt')>>> matarray([[ 4.09200000e+04, 8.32697600e+00, 9.53952000e-01], [ 1.44880000e+04, 7.15346900e+00