機器學習實戰(zhàn)——KNN實現

1忽刽、計算已知類別數據集中的點與當前點之間的距離天揖;
2、按照距離遞增次序排序跪帝;
3今膊、選取與當前點距離最小的k個點;
4伞剑、確定前k個點所在類別的出現頻率斑唬;
5、返回前k個點出現頻率最高的類別作為當前點的預測分類。

# -*- coding: utf-8 -*-

from numpy import *
import operator

'''構造數據'''
def createDataSet():
    characters=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=['A','A','B','B']
    return characters,labels

def classify(sample,dataSet,labels,k):
    dataSetSize=dataSet.shape[0] #統(tǒng)計數據集的個數:4個
    '''下面四行計算待分類的點和訓練集中的任一點的歐式距離'''
    diffMat=tile(sample,(dataSetSize,1))-dataSet #樣本與每個數據集中數據的差值構成矩陣
    sqDiffMat=diffMat**2 #差值矩陣求平方
    sqDistances=sqDiffMat.sum(axis=1) #差值矩陣中每項的兩個數字求和
    distances=sqDistances**0.5 #開方
    sortedDistIndicies=distances.argsort() #按distances中元素進行升序排序后得到的對應下標的列表
    '''選擇距離最小的k個點'''
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    '''從大到小排序'''
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

def main():
    sample=[0,0]
    k=3
    group,labels=createDataSet()
    label=classify(sample,group,labels,k)
    print("Classified Label:"+label)

if __name__=='__main__':
    main()

KNN在數字識別上的應用:
數據集點這里赖钞,準確率為98.94%。

# -*- coding: utf-8 -*-

from numpy import *
import operator
import os 

def classify(sample,dataSet,labels,k):
    dataSetSize=dataSet.shape[0] #統(tǒng)計數據集的個數:4個
    '''下面四行計算待分類的點和訓練集中的任一點的歐式距離'''
    diffMat=tile(sample,(dataSetSize,1))-dataSet #樣本與每個數據集中數據的差值構成矩陣
    sqDiffMat=diffMat**2 #差值矩陣求平方
    sqDistances=sqDiffMat.sum(axis=1) #差值矩陣中每項的兩個數字求和
    distances=sqDistances**0.5 #開方
    sortedDistIndicies=distances.argsort() #按distances中元素進行升序排序后得到的對應下標的列表
    '''選擇距離最小的k個點'''
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    '''從大到小排序'''
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

def img2vector(filename):
     row = 32
     col = 32 
     imgVector = zeros((1,row*col))
     file = open(filename)
     for r in range(row):
          lineStr = file.readline()
          for c in range(col):
               imgVector[0,c+r*32] = int(lineStr[c])
               
     return imgVector

#載入數據集
def loadDataSet():  
    ## step 1: Getting training set  
    dataSetDir = 'C:/Users/Rainey/Desktop/digits/'  
    trainingFileList = os.listdir(dataSetDir + 'trainingDigits') # load the training set  
    numSamples = len(trainingFileList)  
  
    train_x = zeros((numSamples, 1024))  
    train_y = []  
    for i in range(numSamples):  
        filename = trainingFileList[i]  
  
        # get train_x  
        train_x[i, :] = img2vector(dataSetDir + 'trainingDigits/%s' % filename)   
  
        # get label from file name such as "1_18.txt"  
        label = int(filename.split('_')[0]) # return 1  
        train_y.append(label)  
  
    ## step 2: Getting testing set    
    testingFileList = os.listdir(dataSetDir + 'testDigits') # load the testing set  
    numSamples = len(testingFileList)  
    test_x = zeros((numSamples, 1024))  
    test_y = []  
    for i in range(numSamples):  
        filename = testingFileList[i]  
  
        # get train_x  
        test_x[i, :] = img2vector(dataSetDir + 'testDigits/%s' % filename)   
  
        # get label from file name such as "1_18.txt"  
        label = int(filename.split('_')[0]) # return 1  
        test_y.append(label)  
  
    return train_x, train_y, test_x, test_y  
  
# test hand writing class  
def testHandWritingClass():  
    ## step 1: load data  
    print('loading data...')
    train_x, train_y, test_x, test_y = loadDataSet()  
  
    ## step 2: training...  
    pass  
    print('training...')
  
    ## step 3: testing 
    print('testing...')
    numTestSamples = test_x.shape[0]  
    matchCount = 0  
    for i in range(numTestSamples):  
        predict = classify(test_x[i], train_x, train_y, 3)  
        if predict == test_y[i]:  
            matchCount += 1  
    accuracy = float(matchCount) / numTestSamples  
  
    ## step 4: show the result  
    print("step 4: show the result...")  
    print('The classify accuracy is: %.2f%%' % (accuracy * 100))
testHandWritingClass()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末聘裁,一起剝皮案震驚了整個濱河市雪营,隨后出現的幾起案子,更是在濱河造成了極大的恐慌衡便,老刑警劉巖献起,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異镣陕,居然都是意外死亡谴餐,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門呆抑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岂嗓,“玉大人,你說我怎么就攤上這事鹊碍⊙嵫常” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵侈咕,是天一觀的道長公罕。 經常有香客問我,道長耀销,這世上最難降的妖魔是什么楼眷? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮熊尉,結果婚禮上罐柳,老公的妹妹穿的比我還像新娘。我一直安慰自己帽揪,他們只是感情好硝清,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著转晰,像睡著了一般芦拿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上查邢,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天蔗崎,我揣著相機與錄音,去河邊找鬼扰藕。 笑死缓苛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播未桥,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼笔刹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冬耿?” 一聲冷哼從身側響起舌菜,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亦镶,沒想到半個月后日月,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缤骨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年爱咬,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊起。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡精拟,死狀恐怖,靈堂內的尸體忽然破棺而出虱歪,到底是詐尸還是另有隱情串前,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布实蔽,位于F島的核電站荡碾,受9級特大地震影響,放射性物質發(fā)生泄漏局装。R本人自食惡果不足惜坛吁,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铐尚。 院中可真熱鬧拨脉,春花似錦、人聲如沸宣增。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爹脾。三九已至帖旨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灵妨,已是汗流浹背解阅。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泌霍,地道東北人货抄。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蟹地。 傳聞我的和親對象是個殘疾皇子积暖,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容