機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之K近鄰

手撕代碼,已經(jīng)全部調(diào)試正確,可以直接copy使用的哦;;;;誒,這個簡書復(fù)制代碼好像不咋好用(注意縮進(jìn))

#!/usr/bin/python

#-*- coding:UTF-8-*- from numpy import * #科學(xué)計數(shù)包

import operator #運(yùn)算符模塊

from os import listdir #從os模塊中導(dǎo)入listdir,他可以列出給定目錄的文件名

#creat DataSet

def creatDataSet():

????group = array([[1. ,1.1],[1. ,1.],[0. ,0.],[0.,0.1]])

????labels = ['A', 'A', 'B', 'B']

????return group ,labels

#classify these datasets

def classify0(inX, dataSet, labels, k):

????dataSetSize = dataSet.shape[0]

????#shape[0]返回行數(shù),shape[1]返回列數(shù),行數(shù)就是樣本數(shù)量,此處為4

????diffMat = tile(inX, (dataSetSize, 1)) - dataSet #要分類的新數(shù)據(jù)和原始數(shù)據(jù)做差

????#about tile():

#1.tile()是numpy下的一個函數(shù)

#2.tile(A, reps)返回一個shape =reps的矩陣,矩陣的每個元素是A(reps的數(shù)字從后往前分布對應(yīng)A的第N個維度的重復(fù)次數(shù))

#3.可以理解為行方向重復(fù)多少次,列方向重復(fù)多少次

????sqDiffMat = diffMat ** 2 #對差求平方

????sqDistances = sqDiffMat.sum(axis = 1) #這樣就求出每個新數(shù)據(jù)點(diǎn)和原始數(shù)據(jù)點(diǎn)的距離的平方

????distances = sqDistances ** 0.5 #這里求得才是距離

????sortedDisIndicies = distances.argsort()#距離升序排序

#about argsort():

#argsort()函數(shù)返回的是數(shù)組值從小到大排序的索引值,也就是原數(shù)組的下標(biāo)(remember下表從0開始算) #存放分類結(jié)果以及投票次數(shù)

????classCount = {} #建立空字典 {key, value},key是label, value 是label的次數(shù)

????for i in range(k):

????????voteLabel = labels[sortedDisIndicies[i]]

????????classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

#voteLabel 不在classCount中時返回0.若在就讀取當(dāng)前的value值+1

? ? ? sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True) #sorted(iterable, cmp=None, key=None, reverse=False)

#return new sorted list返回列表 #cmp:用于比較的函數(shù),比較什么由key決定 #key:用列表的某個屬性或者函數(shù)進(jìn)行作為關(guān)鍵字,迭代集合中的一項(xiàng) 、

#operator.itemgetter(1)表示獲得對象的第一個域的值,這里是指value #reverse:排序規(guī)則,True降序,F(xiàn)alse 升序

? ? ? ?return sortedClassCount[0][0]

if __name__ == "__main__":

????dataSet,labels =creatDataSet()

????inX = [0.1, 0.1]

????className = classify0(inX, dataSet,labels,3)

????print "the class of test sample is %s" %className

#-*- coding:UTF-8-*-

from numpyimport *#科學(xué)計數(shù)包

import operator#運(yùn)算符模塊

from osimport listdir#從os模塊中導(dǎo)入listdir,他可以列出給定目錄的文件名

#creat DataSet

def creatDataSet():

group = array([[1. ,1.1],[1. ,1.],[0. ,0.],[0.,0.1]])

labels = ['A','A','B','B']

return group ,labels

#classify these datasets

def classify0(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0]#shape[0]返回行數(shù),shape[1]返回列數(shù),行數(shù)就是樣本數(shù)量,此處為4

? ? diffMat = tile(inX, (dataSetSize,1)) - dataSet#要分類的新數(shù)據(jù)和原始數(shù)據(jù)做差

? ? # about tile():

? ? #1.tile()是numpy下的一個函數(shù)

? ? #2.tile(A, reps)返回一個shape =reps的矩陣,矩陣的每個元素是A(reps的數(shù)字從后往前分布對應(yīng)A的第N個維度的重復(fù)次數(shù))

? ? #3.可以理解為行方向重復(fù)多少次,列方向重復(fù)多少次

? ? sqDiffMat = diffMat **2? ? ? #對差求平方

? ? sqDistances = sqDiffMat.sum(axis =1)#這樣就求出每個新數(shù)據(jù)點(diǎn)和原始數(shù)據(jù)點(diǎn)的距離的平方

? ? distances = sqDistances **0.5? ? ? ? ? #這里求得才是距離

? ? sortedDisIndicies = distances.argsort()#距離升序排序

? ? #about argsort():

? ? #argsort()函數(shù)返回的是數(shù)組值從小到大排序的索引值,也就是原數(shù)組的下標(biāo)(remember下表從0開始算)

? ? #存放分類結(jié)果以及投票次數(shù)

? ? classCount = {}#建立空字典? {key, value},key是label, value 是label的次數(shù)

? ? for iin range(k):

voteLabel = labels[sortedDisIndicies[i]]

classCount[voteLabel] = classCount.get(voteLabel,0) +1

? ? ? ? #voteLabel 不在classCount中時返回0.若在就讀取當(dāng)前的value值+1

? ? sortedClassCount =sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse =True)

#sorted(iterable, cmp=None, key=None, reverse=False)

? ? #return new sorted list返回列表

? ? #cmp:用于比較的函數(shù),比較什么由key決定

? ? #key:用列表的某個屬性或者函數(shù)進(jìn)行作為關(guān)鍵字,迭代集合中的一項(xiàng)

? ? #? operator.itemgetter(1)表示獲得對象的第一個域的值,這里是指value

? ? #reverse:排序規(guī)則,True降序,F(xiàn)alse 升序

? ? return sortedClassCount[0][0]

if __name__ =="__main__":

dataSet,labels =creatDataSet()

inX = [0.1,0.1]

className = classify0(inX, dataSet,labels,3)

print "the class of test sample is %s" %className

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容