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)
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近鄰演算法,即是給定...