1. 程式人生 > >機器學習 k-近鄰演算法

機器學習 k-近鄰演算法

1、使用python匯入資料

from numpy import *
def createDataSet():
    group=array([[1.1,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=['A','A','B','B']
    return group,labels

kNN分類演算法:

from numpy import *
import operator
def classify0(inX,dataSet,labels,k):
    dataSetSize=dataSet.shape[0]    #shape[0]表示dataSet的行數
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]] classCount[voteIlabel]
=classCount.get(voteIlabel,0)+1 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0]
distances是1*4的矩陣,分別表示待分類的點與所有已知點的距離;
sortedDistIndicies是distances從小到大的索引值;
voteIlabel相當於臨時變數,用來取得標籤值;
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1    如果在字典classCount中找到key=voteIlabel的value,就加1,找不到的話classCount.get(voteIlabel,0)
返回0然後加1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)  先把字典classCount變成列表,再按照第二維降序排列,返回的仍是列表

執行演算法:

import kNN
from classify_kNN import *
g,l=kNN.createDataSet()
result=classify0([0,0],g,l,3)
print(result)

輸出:

B


 

items():將字典中的項按照列表返回,無序:

get():返回字典對應key的value值,不存在key時返回第二個引數:

dic={'a':1,'b':2,'c':3}
print(dic.items())
print(dic.get('c','no'))
輸出:
dict_items([('b', 2), ('c', 3), ('a', 1)])
3

 

shape:返回矩陣的維數;

from numpy import *
c=array([[1,1],[2,3,],[5,6]])
print(c)
print(c.shape)
print(c.shape[0])
print(c.shape[1])
輸出:
[[1 1]
 [2 3]
 [5 6]]
(3, 2)
3
2

 

 operator.itemgetter():返回物件特定維的資料,結合sorted()方法使用:

import operator
students=[['剛田武',20,'gangtw'],['朱二娃',25,'zhuerw'],['咪咪two',30,'miomitwo']]
print(sorted(students,key=operator.itemgetter(1),reverse=True))
輸出:
[['咪咪two', 30, 'miomitwo'], ['朱二娃', 25, 'zhuerw'], ['剛田武', 20, 'gangtw']]

 

argsort():返回陣列值從小到大的索引值