《機(jī)器學(xué)習(xí)實戰(zhàn)》kNN

k-鄰近算法

基本樣例

# 引入基本模塊
from numpy import *
import operator
# 定義數(shù)據(jù)
def createDataSet():
    group = array([[1.,1.1],[1.,1.],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels
# 創(chuàng)建分類器
def classify0(inX, dataset, labels, k):
    dataSetSize = dataset.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataset
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    
    distance = sqDistances**0.5
#     print '距離\n',sqDistances
    sortedDistIndicies = distance.argsort()
#     print '距離排序\n', sortedDistIndicies
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
#     print '各類別數(shù)量\n', classCount.items()

    sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
#     print '各類別數(shù)量排序\n', sortedClassCount
    
    return sortedClassCount[0][0]
# 測試
group, labels = createDataSet()
finalClass = classify0([1,0.8], group, labels, 3)
print 'final class:\n', finalClass
final class:
A

約會網(wǎng)站示例

# 定義讀取文件函數(shù)
def file2matrix(filename):
    f = open(filename)
    arrayLines = f.readlines()
    numberOfLines = len(arrayLines)

    returnMat = zeros((numberOfLines,3))
    classLabelVector = []
    index = 0
    for line in arrayLines:
        line = line.strip()
        listLine = line.split('\t')
        returnMat[index,:] = listLine[:3]
        classLabelVector.append(int(listLine[-1]))
        index += 1
        
    f.close()
    return returnMat, classLabelVector
    
dateDataMat, dateLabels = file2matrix('datingTestSet2.txt')
# 繪制散點圖
import matplotlib.pyplot as plt
# 游戲時間與飛行里程關(guān)系
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.scatter(dateDataMat[:,0],dateDataMat[:,1],15*array(dateLabels),15*array(dateLabels))
ax1.set_title('scatter1')
plt.xlabel('fly miles')
plt.ylabel('game time percent')
# 游戲時間與冰淇淋消耗公升數(shù)
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.scatter(dateDataMat[:,1],dateDataMat[:,2],15*array(dateLabels),15*array(dateLabels))
ax2.set_title('scatter2')
plt.xlabel('game time percent')
plt.ylabel('ice cream')
# 飛行里程數(shù)與冰淇淋消耗公升數(shù)
fig3 = plt.figure()
ax3 = fig3.add_subplot(111)
ax3.scatter(dateDataMat[:,0],dateDataMat[:,2],15*array(dateLabels),15*array(dateLabels))
ax3.set_title('scatter3')
plt.xlabel('fly miles')
plt.ylabel('ice cream')
plt.show()
output_8_0.png
output_8_1.png
output_8_2.png
# 歸一化
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    l = dataSet.shape[0]
    normDataSet = (dataSet - tile(minVals, (l,1)))/tile(ranges, (l,1))
    return normDataSet
print autoNorm(dateDataMat)
[[ 0.44832535  0.39805139  0.56233353]
 [ 0.15873259  0.34195467  0.98724416]
 [ 0.28542943  0.06892523  0.47449629]
 ..., 
 [ 0.29115949  0.50910294  0.51079493]
 [ 0.52711097  0.43665451  0.4290048 ]
 [ 0.47940793  0.3768091   0.78571804]]
# 進(jìn)行測試
def dateTest():
    ratio = 0.1
    dateDataMat, dataLabels = file2matrix('datingTestSet2.txt')
    normMat = autoNorm(dateDataMat)
    rows = normMat.shape[0]
    numTest = int(rows*ratio)
    errorCount = 0
    for i in range(numTest):
        classifierResult = classify0(normMat[i,:], normMat[numTest:,:], dataLabels[numTest:],3)
        print "分類器返回值:%d, 真實分類:%d"%(classifierResult, dataLabels[i])
        if classifierResult != dateLabels[i]: errorCount +=1
    print '錯誤率: ', errorCount / float(numTest)
dateTest()
分類器返回值:3, 真實分類:3
分類器返回值:2, 真實分類:2
分類器返回值:1, 真實分類:1
分類器返回值:1, 真實分類:1
分類器返回值:1, 真實分類:1
分類器返回值:1, 真實分類:1
分類器返回值:3, 真實分類:3
分類器返回值:3, 真實分類:3
      (...略)
分類器返回值:3, 真實分類:3
分類器返回值:2, 真實分類:2
分類器返回值:1, 真實分類:1
分類器返回值:3, 真實分類:1
錯誤率:  0.05

手寫識別系統(tǒng)

# 讀入文件并轉(zhuǎn)化為1×1024的數(shù)組
def img2vector(filename):
    returnVec = zeros((1,1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVec[0,32*i+j] = int(lineStr[j])
            
    return returnVec
    
import os
# 讀取文件集奴饮,返回輸入和label
def getFileSet(filePath):
    labels = []
    fileList = os.listdir(filePath)
    fileListLen = len(fileList)
    fileSet = zeros((fileListLen,1024))
    for i in range(fileListLen):
        f = fileList[i]
        fileStr = f.split('.')[0]
        labels.append(int(fileStr.split('_')[0]))
        fileSet[i,:] = img2vector(filePath +'/'+f)
        
    return fileSet, labels, fileList



# 測試
def handwritingTest():
    filePath = 'digits/testDigits'
    testSet, testLabels, testFileList = getFileSet(filePath)
    trainSet, trainLabels,trainFileList =  getFileSet('digits/trainingDigits')
    testSetLen = testSet.shape[0]
    errorCount = 0
    for i in range(testSetLen):
        classifierResult = classify0(testSet[i,:], trainSet, trainLabels, 3)
        print '%s:分類器分類結(jié)果:%d, 真實分類:%d'%(testFileList[i], classifierResult, testLabels[i])
        if classifierResult != testLabels[i] : errorCount +=1
    print '錯誤率:%f'%(errorCount /float(testSetLen))
handwritingTest()
0_0.txt:分類器分類結(jié)果:0, 真實分類:0
0_1.txt:分類器分類結(jié)果:0, 真實分類:0
0_10.txt:分類器分類結(jié)果:0, 真實分類:0
       (...略)
0_81.txt:分類器分類結(jié)果:0, 真實分類:0
0_82.txt:分類器分類結(jié)果:0, 真實分類:0
0_83.txt:分類器分類結(jié)果:0, 真實分類:0
0_84.txt:分類器分類結(jié)果:0, 真實分類:0
0_85.txt:分類器分類結(jié)果:0, 真實分類:0
0_86.txt:分類器分類結(jié)果:0, 真實分類:0
0_9.txt:分類器分類結(jié)果:0, 真實分類:0
1_0.txt:分類器分類結(jié)果:1, 真實分類:1
1_1.txt:分類器分類結(jié)果:1, 真實分類:1
1_10.txt:分類器分類結(jié)果:1, 真實分類:1
1_11.txt:分類器分類結(jié)果:1, 真實分類:1
1_12.txt:分類器分類結(jié)果:1, 真實分類:1
       (...略)
1_90.txt:分類器分類結(jié)果:1, 真實分類:1
1_91.txt:分類器分類結(jié)果:1, 真實分類:1
1_92.txt:分類器分類結(jié)果:1, 真實分類:1
1_93.txt:分類器分類結(jié)果:1, 真實分類:1
1_94.txt:分類器分類結(jié)果:1, 真實分類:1
1_95.txt:分類器分類結(jié)果:1, 真實分類:1
1_96.txt:分類器分類結(jié)果:1, 真實分類:1
2_0.txt:分類器分類結(jié)果:2, 真實分類:2
2_1.txt:分類器分類結(jié)果:2, 真實分類:2
2_10.txt:分類器分類結(jié)果:2, 真實分類:2
2_11.txt:分類器分類結(jié)果:2, 真實分類:2
2_12.txt:分類器分類結(jié)果:2, 真實分類:2
2_13.txt:分類器分類結(jié)果:2, 真實分類:2
          (...略)
2_85.txt:分類器分類結(jié)果:2, 真實分類:2
2_86.txt:分類器分類結(jié)果:2, 真實分類:2
2_87.txt:分類器分類結(jié)果:2, 真實分類:2
2_88.txt:分類器分類結(jié)果:2, 真實分類:2
2_89.txt:分類器分類結(jié)果:2, 真實分類:2
2_9.txt:分類器分類結(jié)果:2, 真實分類:2
2_90.txt:分類器分類結(jié)果:2, 真實分類:2
2_91.txt:分類器分類結(jié)果:2, 真實分類:2
3_0.txt:分類器分類結(jié)果:3, 真實分類:3
3_1.txt:分類器分類結(jié)果:3, 真實分類:3
3_10.txt:分類器分類結(jié)果:3, 真實分類:3
3_11.txt:分類器分類結(jié)果:9, 真實分類:3
3_12.txt:分類器分類結(jié)果:3, 真實分類:3
3_13.txt:分類器分類結(jié)果:3, 真實分類:3
3_14.txt:分類器分類結(jié)果:3, 真實分類:3
        (...略)
3_82.txt:分類器分類結(jié)果:3, 真實分類:3
3_83.txt:分類器分類結(jié)果:3, 真實分類:3
3_84.txt:分類器分類結(jié)果:3, 真實分類:3
3_9.txt:分類器分類結(jié)果:3, 真實分類:3
4_0.txt:分類器分類結(jié)果:4, 真實分類:4
4_1.txt:分類器分類結(jié)果:4, 真實分類:4
4_10.txt:分類器分類結(jié)果:4, 真實分類:4
4_100.txt:分類器分類結(jié)果:4, 真實分類:4
4_101.txt:分類器分類結(jié)果:4, 真實分類:4
4_102.txt:分類器分類結(jié)果:4, 真實分類:4
4_103.txt:分類器分類結(jié)果:4, 真實分類:4
4_104.txt:分類器分類結(jié)果:4, 真實分類:4
        (...略)
4_95.txt:分類器分類結(jié)果:4, 真實分類:4
4_96.txt:分類器分類結(jié)果:4, 真實分類:4
4_97.txt:分類器分類結(jié)果:4, 真實分類:4
4_98.txt:分類器分類結(jié)果:4, 真實分類:4
4_99.txt:分類器分類結(jié)果:4, 真實分類:4
5_0.txt:分類器分類結(jié)果:5, 真實分類:5
5_1.txt:分類器分類結(jié)果:5, 真實分類:5
5_10.txt:分類器分類結(jié)果:5, 真實分類:5
5_100.txt:分類器分類結(jié)果:5, 真實分類:5
5_101.txt:分類器分類結(jié)果:5, 真實分類:5
      (...略)
5_92.txt:分類器分類結(jié)果:5, 真實分類:5
5_93.txt:分類器分類結(jié)果:5, 真實分類:5
5_94.txt:分類器分類結(jié)果:5, 真實分類:5
5_95.txt:分類器分類結(jié)果:5, 真實分類:5
5_96.txt:分類器分類結(jié)果:5, 真實分類:5
5_97.txt:分類器分類結(jié)果:5, 真實分類:5
5_98.txt:分類器分類結(jié)果:5, 真實分類:5
5_99.txt:分類器分類結(jié)果:5, 真實分類:5
6_0.txt:分類器分類結(jié)果:6, 真實分類:6
6_1.txt:分類器分類結(jié)果:6, 真實分類:6
6_10.txt:分類器分類結(jié)果:6, 真實分類:6
6_11.txt:分類器分類結(jié)果:6, 真實分類:6
6_12.txt:分類器分類結(jié)果:6, 真實分類:6
6_13.txt:分類器分類結(jié)果:6, 真實分類:6
       (...略)
6_82.txt:分類器分類結(jié)果:6, 真實分類:6
6_83.txt:分類器分類結(jié)果:6, 真實分類:6
6_84.txt:分類器分類結(jié)果:6, 真實分類:6
6_85.txt:分類器分類結(jié)果:6, 真實分類:6
6_86.txt:分類器分類結(jié)果:6, 真實分類:6
6_9.txt:分類器分類結(jié)果:6, 真實分類:6
7_0.txt:分類器分類結(jié)果:7, 真實分類:7
7_1.txt:分類器分類結(jié)果:7, 真實分類:7
7_10.txt:分類器分類結(jié)果:7, 真實分類:7
7_11.txt:分類器分類結(jié)果:7, 真實分類:7
7_12.txt:分類器分類結(jié)果:7, 真實分類:7
7_13.txt:分類器分類結(jié)果:7, 真實分類:7
7_14.txt:分類器分類結(jié)果:7, 真實分類:7
        (...略)
7_91.txt:分類器分類結(jié)果:7, 真實分類:7
7_92.txt:分類器分類結(jié)果:7, 真實分類:7
7_93.txt:分類器分類結(jié)果:7, 真實分類:7
7_94.txt:分類器分類結(jié)果:7, 真實分類:7
7_95.txt:分類器分類結(jié)果:7, 真實分類:7
8_0.txt:分類器分類結(jié)果:8, 真實分類:8
8_1.txt:分類器分類結(jié)果:8, 真實分類:8
8_10.txt:分類器分類結(jié)果:8, 真實分類:8
8_11.txt:分類器分類結(jié)果:6, 真實分類:8
8_12.txt:分類器分類結(jié)果:8, 真實分類:8
8_13.txt:分類器分類結(jié)果:8, 真實分類:8
8_14.txt:分類器分類結(jié)果:8, 真實分類:8
         (...略)
8_83.txt:分類器分類結(jié)果:8, 真實分類:8
8_84.txt:分類器分類結(jié)果:8, 真實分類:8
8_85.txt:分類器分類結(jié)果:8, 真實分類:8
8_86.txt:分類器分類結(jié)果:8, 真實分類:8
8_87.txt:分類器分類結(jié)果:8, 真實分類:8
8_88.txt:分類器分類結(jié)果:8, 真實分類:8
8_89.txt:分類器分類結(jié)果:8, 真實分類:8
8_9.txt:分類器分類結(jié)果:8, 真實分類:8
8_90.txt:分類器分類結(jié)果:8, 真實分類:8
9_0.txt:分類器分類結(jié)果:9, 真實分類:9
9_1.txt:分類器分類結(jié)果:9, 真實分類:9
9_10.txt:分類器分類結(jié)果:9, 真實分類:9
9_11.txt:分類器分類結(jié)果:9, 真實分類:9
9_12.txt:分類器分類結(jié)果:9, 真實分類:9
9_13.txt:分類器分類結(jié)果:9, 真實分類:9
9_14.txt:分類器分類結(jié)果:1, 真實分類:9
        (...略)
9_83.txt:分類器分類結(jié)果:9, 真實分類:9
9_84.txt:分類器分類結(jié)果:9, 真實分類:9
9_85.txt:分類器分類結(jié)果:9, 真實分類:9
9_86.txt:分類器分類結(jié)果:9, 真實分類:9
9_87.txt:分類器分類結(jié)果:9, 真實分類:9
9_88.txt:分類器分類結(jié)果:9, 真實分類:9
9_9.txt:分類器分類結(jié)果:9, 真實分類:9
錯誤率:0.011628
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逃糟,一起剝皮案震驚了整個濱河市杆兵,隨后出現(xiàn)的幾起案子雷厂,更是在濱河造成了極大的恐慌融痛,老刑警劉巖铛嘱,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艰争,死亡現(xiàn)場離奇詭異抚官,居然都是意外死亡上陕,警方通過查閱死者的電腦和手機(jī)桩砰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來释簿,“玉大人亚隅,你說我怎么就攤上這事∈埽” “怎么了煮纵?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵懂鸵,是天一觀的道長。 經(jīng)常有香客問我行疏,道長匆光,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任酿联,我火速辦了婚禮殴穴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘货葬。我一直安慰自己采幌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布震桶。 她就那樣靜靜地躺著休傍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹲姐。 梳的紋絲不亂的頭發(fā)上磨取,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音柴墩,去河邊找鬼忙厌。 笑死,一個胖子當(dāng)著我的面吹牛江咳,可吹牛的內(nèi)容都是我干的逢净。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼歼指,長吁一口氣:“原來是場噩夢啊……” “哼爹土!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起踩身,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤胀茵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挟阻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琼娘,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年附鸽,在試婚紗的時候發(fā)現(xiàn)自己被綠了脱拼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡拒炎,死狀恐怖挪拟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情击你,我是刑警寧澤谎柄,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站惯雳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劈猿。R本人自食惡果不足惜揪荣,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挨决。 院中可真熱鬧订歪,春花似錦脖祈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掏秩,卻和暖如春或舞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒙幻。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留胆筒,地道東北人邮破。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像仆救,于是被迫代替她去往敵國和親抒和。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容