K近鄰分類演算法實現 in Python

2021-07-10 14:23:14 字數 2470 閱讀 4256

k近鄰(knn):分類演算法

* knn是non-parametric分類器(不做分布形式的假設,直接從資料估計概率密度),是memory-based learning.

* knn不適用於高維資料(curse of dimension)

* machine learning的python庫很多,比如mlpy(更多packages),這裡實現只是為了掌握方法

* matlab 中的呼叫,見《matlab分類器大全(svm,knn,隨機森林等)》

* knn演算法複雜度高(可用kd樹優化,c中可以用libkdtree或者ann)

* k越小越容易過擬合,但是k很大會降分類精度(設想極限情況:k=1和k=n(樣本數))

本文不介紹理論了,注釋見**。

knn.py

[python]view plain

copy

from

numpy 

import

*  import

operator  

class

knn:  

defcreatedataset(

self

):  

group = array([[1.0

,1.1

],[1.0

,1.0

],[0,0

],[0

,0.1

]])  

labels = ['a'

,'a'

,'b'

,'b'

]  return

group,labels  

defknnclassify(

self

,testx,trainx,labels,k):  

[n,m]=trainx.shape  

#calculate the distance between testx and other training samples

difference = tile(testx,(n,1

)) - trainx 

# tile for array and repeat for matrix in python, == repmat in matlab

difference = difference ** 2

# take pow(difference,2)

distance = difference.sum(1

) # take the sum of difference from all dimensions

distance = distance ** 0.5

sortdiffidx = distance.argsort()  

# find the k nearest neighbours

vote = {} #create the dictionary

fori 

inrange(k):  

ith_label = labels[sortdiffidx[i]];  

vote[ith_label] = vote.get(ith_label,0)+1

#get(ith_label,0) : if dictionary 'vote' exist key 'ith_label', return vote[ith_label]; else return 0

sortedvote = sorted(vote.iteritems(),key = lambda

x:x[

1], reverse = 

true

)  # 'key = lambda x: x[1]' can be substituted by operator.itemgetter(1)

return

sortedvote[0][

0]  

k = knn() #create knn object

group,labels = k.createdataset()  

cls= k.knnclassify([0,

0],group,labels,

3)  

print

cls

-------------------

執行:

1. 在python shell 中可以執行knn.py

>>>importos

>>>os.chdir("/users/mba/documents/study/machine_learning/python/knn")

>>>execfile("knn.py")

輸出b(b表示類別)

2. 或者terminal中直接執行

$ python knn.py

3. 也可以不在knn.py中寫輸出,而選擇在shell中獲得結果,i.e.,

>>>import knn

>>> knn.k.knnclassify([0,0],knn.group,knn.labels,3)

K近鄰分類演算法實現 in Python

k近鄰 knn 分類演算法 knn是non parametric分類器 不做分布形式的假設,直接從資料估計概率密度 是memory based learning.knn不適用於高維資料 curse of dimension machine learning的python庫很多,比如mlpy 更多pa...

K近鄰分類演算法實現 in Python

k近鄰 knn 分類演算法 knn是non parametric分類器 不做分布形式的假設,直接從資料估計概率密度 是memory based learning.knn不適用於高維資料 curse of dimension machine learning的python庫很多,比如mlpy 更多pa...

分類演算法 k近鄰演算法

k最近鄰 k nearest neighbor,knn 分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。用官方的話來說,所謂k近鄰演算法,即是給定...