機(jī)器學(xué)習(xí)KNN算法學(xué)習(xí)筆記

基本概念

KNN是分類算法。

數(shù)據(jù)類型:數(shù)值型和標(biāo)稱型靠胜。

工作原理

存在一個(gè)訓(xùn)練樣本集胰苏,并且訓(xùn)練樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即知道訓(xùn)練樣本集中每一條數(shù)據(jù)與所屬分類對(duì)應(yīng)關(guān)系岸更。輸入沒(méi)有標(biāo)簽的新數(shù)據(jù)后鸵膏,與訓(xùn)練樣本集中數(shù)據(jù)對(duì)應(yīng)的特征做比較,然后提取樣本集中特征最相似數(shù)據(jù)(最臨近怎炊,用距離公式谭企,距離最近)的分類標(biāo)簽廓译。一般來(lái)說(shuō),我們只取訓(xùn)練樣本集中前k個(gè)最相似的數(shù)據(jù)债查,這就是k的出處非区。通常k是不大于20的整數(shù)。

距離公式

49b476ef-7c62-4da0-8648-5a1c5715d4ab
49b476ef-7c62-4da0-8648-5a1c5715d4ab

多特征時(shí)盹廷,如(1,0,0,1)和(7, 6, 9, 4)


d3b42a96-1c5a-4eac-83cb-d4041a242464
d3b42a96-1c5a-4eac-83cb-d4041a242464

分類算法

from numpy import *
import operator
from os import listdir

def classify0(inX, dataSet, labels, k):
    # inX為待分類數(shù)據(jù)
    # dataSet為訓(xùn)練數(shù)據(jù)集
    # labels對(duì)應(yīng)dataSet每一行數(shù)據(jù)的標(biāo)簽(類型)

    # 有多少行數(shù)據(jù) shape反回一個(gè)元組征绸。(行, 列)
    dataSetSize = dataSet.shape[0] 
    
    # tile(inX, (dataSetSize,1)) 創(chuàng)建一個(gè)numpy的array,dataSetSize行俄占,每行數(shù)據(jù)是inX
    # - dataSet 矩陣減法 m*n矩陣A - m*n矩陣B
    diffMat = tile(inX, (dataSetSize,1)) - dataSet 
    
    # 矩陣的每個(gè)值平方
    sqDiffMat = diffMat**2

    # 橫向求和管怠,得到一個(gè)一維數(shù)組,每個(gè)值都是和
    sqDistances = sqDiffMat.sum(axis=1)
    
    # 數(shù)組中每個(gè)值開(kāi)根
    distances = sqDistances**0.5

    # 得到排序后的下標(biāo)數(shù)組
    sortedDistIndicies = distances.argsort()

    classCount={}
    # 只取前k個(gè)        
    for i in range(k):
        # 找到下標(biāo)對(duì)應(yīng)的標(biāo)簽
        voteIlabel = labels[sortedDistIndicies[i]]
        # 如果找到相同標(biāo)簽利用map來(lái)計(jì)數(shù)
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    # 排序加反轉(zhuǎn)
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    print sortedClassCount
    # 把計(jì)數(shù)最大的值所對(duì)應(yīng)的標(biāo)簽返回出去
    return sortedClassCount[0][0]

數(shù)據(jù)歸一化

如果某個(gè)特征值數(shù)量級(jí)特別大缸榄,比如A特征是5位數(shù)渤弛,而其他特征是個(gè)位數(shù)。那么就會(huì)發(fā)現(xiàn)A特征的值大大會(huì)影響最終結(jié)果甚带。所以需要把每個(gè)特征值都?xì)w到0-1這個(gè)范圍她肯。

數(shù)據(jù)歸一化算法

9061c50-3104-11e7-8aca-e882fa09a8a8
9061c50-3104-11e7-8aca-e882fa09a8a8
def autoNorm(dataSet):
    # 每一列最小值
    minVals = dataSet.min(0)
    # 每一列最大值
    maxVals = dataSet.max(0)
    # 每一列的差
    ranges = maxVals - minVals
    # 復(fù)制矩陣 dataSet的行,列鹰贵。值都是0
    normDataSet = zeros(shape(dataSet))
    # 得到多少行
    m = dataSet.shape[0]

    # tile(minVals, (m,1)) 創(chuàng)建datSet的行列的矩陣晴氨,每一個(gè)值都是minVals。
    # dataSet - 矩陣相減
    normDataSet = dataSet - tile(minVals, (m,1)) 

    # tile(ranges, (m,1)) 創(chuàng)建datSet的行列的矩陣砾莱,每一個(gè)值都是ranges瑞筐。
    # 并非矩陣除法凄鼻,而是對(duì)應(yīng)位置的值相除
    normDataSet = normDataSet / tile(ranges, (m,1))
    return normDataSet, ranges, minVals

實(shí)際使用

def datingClassTest():
    # 預(yù)留出10%來(lái)做測(cè)試數(shù)據(jù)驗(yàn)證準(zhǔn)確率
    hoRatio = 0.10
    # 讀取數(shù)據(jù)和標(biāo)簽
    datingDataMat,datingLabels = file2matrix('Ch02/datingTestSet.txt')       #load data setfrom file
    # 把數(shù)據(jù)歸一化處理
    normMat, ranges, minVals = autoNorm(datingDataMat)
    # 取到數(shù)據(jù)有多少行
    m = normMat.shape[0]
    # 取出測(cè)試數(shù)據(jù)的長(zhǎng)度
    numTestVecs = int(m*hoRatio)
    # 錯(cuò)誤計(jì)數(shù)
    errorCount = 0.0

    for i in range(numTestVecs):
        # normMat[i,:] 取出第i行的 所有數(shù)據(jù)
        # normMat[numTestVecs:m,:] 取出numTestVecs之后到m的每行數(shù)據(jù)
        # datingLabels[numTestVecs:m] 取出numTestVecs之后到m的每行的標(biāo)簽
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
        # 如果結(jié)果不一致腊瑟,則錯(cuò)誤+1
        if (classifierResult != datingLabels[i]): errorCount += 1.0
    # 最后打印出錯(cuò)誤率和錯(cuò)誤數(shù)
    print "the total error rate is: %f" % (errorCount/float(numTestVecs))
    print errorCount

優(yōu)點(diǎn)

  • 分類算法中最簡(jiǎn)單最有效的算法

缺點(diǎn)

  • 必須保存全部訓(xùn)練集,如果訓(xùn)練集樣本很大會(huì)使用大量存儲(chǔ)空間
  • 計(jì)算距離時(shí)可能非常耗時(shí)
  • 無(wú)法給出任何數(shù)據(jù)的基礎(chǔ)結(jié)構(gòu)信息块蚌,無(wú)法得知平均實(shí)例樣本和典型實(shí)例樣本具有什么特征
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闰非,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峭范,更是在濱河造成了極大的恐慌财松,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纱控,死亡現(xiàn)場(chǎng)離奇詭異辆毡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)甜害,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門舶掖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尔店,你說(shuō)我怎么就攤上這事眨攘≈魑浚” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鲫售,是天一觀的道長(zhǎng)共螺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)情竹,這世上最難降的妖魔是什么藐不? 我笑而不...
    開(kāi)封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮鲤妥,結(jié)果婚禮上佳吞,老公的妹妹穿的比我還像新娘。我一直安慰自己棉安,他們只是感情好底扳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贡耽,像睡著了一般衷模。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒲赂,一...
    開(kāi)封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天阱冶,我揣著相機(jī)與錄音,去河邊找鬼滥嘴。 笑死木蹬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的若皱。 我是一名探鬼主播镊叁,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼走触!你這毒婦竟也來(lái)了晦譬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤互广,失蹤者是張志新(化名)和其女友劉穎敛腌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惫皱,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡像樊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旅敷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片生棍。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扫皱,靈堂內(nèi)的尸體忽然破棺而出足绅,到底是詐尸還是另有隱情捷绑,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布氢妈,位于F島的核電站粹污,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏首量。R本人自食惡果不足惜壮吩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望加缘。 院中可真熱鬧鸭叙,春花似錦、人聲如沸拣宏。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勋乾。三九已至宋下,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辑莫,已是汗流浹背学歧。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留各吨,地道東北人枝笨。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像揭蜒,于是被迫代替她去往敵國(guó)和親横浑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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