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

工作原理:存在一個樣本數(shù)據(jù)集合,也稱作訓練樣本集耙饰,樣本集中每個數(shù)據(jù)都存在標簽摩瞎,即已知樣本集中每一數(shù)據(jù)與其所屬分類的對應(yīng)關(guān)系拴签。當輸入沒有標簽的新數(shù)據(jù)孝常, 將新數(shù)據(jù)的每個特征與樣本集中數(shù)據(jù)對應(yīng)的特征進行比較旗们,提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的k個分類標簽(K-近鄰),最后選擇k個最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類构灸,作為新數(shù)據(jù)的分類上渴。
python代碼(python3版本):

from numpy import *
import operator
def createDataset():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels
# K-近鄰算法
def classify0(inX, dataSet, labels, k):
    dataSetSize=dataSet.shape[0]
    diffMat=tile(inX, (dataSetSize,1))-dataSet
    sqDiffMat=diffMat**2
    # 每行元素相加
    sqDistances=sqDiffMat.sum(axis=1)
    distances=sqDistances**0.5
    # 排序輸出其下標值
    sortedDistIndicies=distances.argsort()  
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        # 返回key為voteIlabel的value,如果沒有這個元素則返回0喜颁,有就加1
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    # operator.itemgetter(1)表示對第二個域進行排序稠氮,reverse=True表示倒序排序
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]
# 將文本記錄轉(zhuǎn)換為numpy
def file2matrix(filename):
    fr=open(filename)
    arrayOLines=fr.readlines()
    numberOfLines=len(arrayOLines)
    # 用0填充二維數(shù)組,numberOfLines行3列
    returnMat=zeros((numberOfLines,3))
    classLabelVector=[]
    index=0
    for line in arrayOLines:
        line=line.strip()
        listFromLine=line.split('\t')
        returnMat[index,:]=listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))
        index+=1
    return returnMat,classLabelVector
# 歸一化特征值
def autoNorm(dataSet):
    minVals=dataSet.min(0)
    maxVals=dataSet.max(0)
    ranges=maxVals-minVals
    normDataSet=zeros(shape(dataSet))
    m=dataSet.shape[0]
    normDataSet=dataSet-tile(minVals,(m,1))
    normDataSet=normDataSet/tile(ranges,(m,1))
    return normDataSet,ranges,minVals
# 針對約會網(wǎng)站的測試
def datingClassTest():
    hoRatio=0.10
    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    m=normMat.shape[0]
    # 選出10%的數(shù)據(jù)進行測試
    numTestVecs=int(m*hoRatio)
    errorCount=0.0
    for i in range(numTestVecs):
        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]))
        if(classifierResult!=datingLabels[i]):
            errorCount+=1.0
    print('the total error rate is: %.2f%%' % (errorCount/float(numTestVecs)*100))
# 預(yù)測函數(shù)
def classifyPerson():
    resultList=['not at all','in small doses','in large doses']
    percentTats=float(input('percentage of time spent playing video games?'))
    ffMiles=float(input('frequent flier miles earned per year?'))
    iceCream=float(input('liters of ice cream consumed per year?'))
    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    inArr=array([ffMiles,percentTats,iceCream])
    classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
    print('you will probably like this person: ',resultList[classifierResult-1])

以上內(nèi)容均來自《機器學習實戰(zhàn)》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末半开,一起剝皮案震驚了整個濱河市隔披,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寂拆,老刑警劉巖奢米,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纠永,居然都是意外死亡鬓长,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門尝江,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涉波,“玉大人,你說我怎么就攤上這事炭序∑「玻” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵惭聂,是天一觀的道長窗声。 經(jīng)常有香客問我,道長彼妻,這世上最難降的妖魔是什么嫌佑? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮侨歉,結(jié)果婚禮上屋摇,老公的妹妹穿的比我還像新娘。我一直安慰自己幽邓,他們只是感情好炮温,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牵舵,像睡著了一般柒啤。 火紅的嫁衣襯著肌膚如雪倦挂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天担巩,我揣著相機與錄音方援,去河邊找鬼。 笑死涛癌,一個胖子當著我的面吹牛犯戏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拳话,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼先匪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弃衍?” 一聲冷哼從身側(cè)響起呀非,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镜盯,沒想到半個月后岸裙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡形耗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年哥桥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片激涤。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拟糕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倦踢,到底是詐尸還是另有隱情送滞,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布辱挥,位于F島的核電站犁嗅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晤碘。R本人自食惡果不足惜褂微,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望园爷。 院中可真熱鬧宠蚂,春花似錦、人聲如沸童社。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呀癣,卻和暖如春美浦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背项栏。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工浦辨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忘嫉。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓荤牍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庆冕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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

  • KNN (k-近鄰算法) 其工作原理是: 存在一個樣本數(shù)據(jù)集合劈榨,也稱作訓練樣本集访递,并且樣本集中每個數(shù)據(jù)都有存在標簽...
    z3r0me閱讀 187評論 0 0
  • 一.樸素貝葉斯 1.分類理論 樸素貝葉斯是一種基于貝葉斯定理和特征條件獨立性假設(shè)的多分類的機器學習方法,所...
    wlj1107閱讀 3,078評論 0 5
  • 注:題中所指的『機器學習』不包括『深度學習』同辣。本篇文章以理論推導為主拷姿,不涉及代碼實現(xiàn)。 前些日子定下了未來三年左右...
    我偏笑_NSNirvana閱讀 39,939評論 12 145
  • 機器學習實戰(zhàn)之K-近鄰算法(二) 2-1 K-近鄰算法概述 簡單的說旱函,K-近鄰算法采用測量不同特征值之間的距離方法...
    凌岸_ing閱讀 1,688評論 0 6
  • 許多年前响巢,法國巴黎的街頭出現(xiàn)了一種新型的散步者。他們總是緩步踏入游廊棒妨,被稱為“漫步者”踪古。他們喜歡帶上一只小烏龜,讓...
    paya閱讀 683評論 0 1