posted on 2015-05-21 20:34
| in ml
| 0 comment
| views : 3195
原始碼:決策樹和基於規則的分類器都是積極學習方法(eager learner)的例子,因為一旦訓練資料可用,他們就開始學習從輸入屬性到類標號的對映模型。乙個相反的策略是推遲對訓練資料的建模,直到需要分類測試樣例時再進行。採用這種策略的技術被稱為消極學習法(lazy learner)。最近鄰分類器就是這樣的一種方法。
首先給出一張圖,根據這張圖來理解最近鄰分類器,如下:
根據上圖所示,有兩類不同的樣本資料,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的資料則是待分類的資料。也就是說,現在, 我們不知道中間那個綠色的資料是從屬於哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。
我們常說,物以類聚,人以群分,判別乙個人是乙個什麼樣品質特徵的人,常常可以從他or她身邊的朋友入手,所謂觀其友,而識其人。我們不是要判別上圖中那個綠色的圓是屬於哪一類資料麼,好說,從它的鄰居下手。但一次性看多少個鄰居呢?從上圖中,你還能看到:
於此我們看到,當無法判定當前待分類點是從屬於已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特徵,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是k近鄰演算法的核心思想。
knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。
knn 演算法本身簡單有效,它是一種 lazy-learning 演算法,分類器不需要使用訓練集進行訓練,訓練時間複雜度為0。knn 分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為 n,那麼 knn 的分類時間複雜度為o(n)。
前面的例子中強調了選擇合適的k值的重要性。如果太小,則最近鄰分類器容易受到訓練資料的雜訊而產生的過分擬合的影響;相反,如果k太大,最近分類器可能會誤會分類測試樣例,因為最近鄰列表中可能包含遠離其近鄰的資料點。(如下圖所示)
k較大時的最近鄰分類
可見,k值的選取還是非常關鍵。
演算法步驟如下所示:
對每個測試樣例z=(
x′,y
′)z=(x′,y′)
,演算法計算它和所有訓練樣例(x,
y)屬於
d(x,y)屬於d
之間的距離(或相似度),以確定其最近鄰列表dzdz
。如果訓練樣例的數目很大,那麼這種計算的開銷就會很大。不過,可以使索引技術降低為測試樣例找最近鄰是的計算量。
一旦得到最近鄰列表,測試樣例就可以根據最近鄰的多數類進行分類,使用多數表決方法。
knn.py
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
32
#coding=utf-8執行:在python shell 中可以執行knn.pyfromnumpyimport*
importoperator
classknn:
defcreatedataset(self):
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['a','a','b','b']
returngroup, 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
print"difference ==", difference
difference = difference ** 2
# take pow(difference,2)
print"difference ==", difference
distance = difference.sum(1) # take the sum of difference from all dimensions
print'distance ==', distance
distance = distance ** 0.5
sortdiffidx = distance.argsort() #argsort
函式返回的是陣列值從小到大的索引值
print"sortdiffidx ==", sortdiffidx
# find the k nearest neighbours
vote = {} # create the dictionary
foriinrange(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=lambdax: x[1], reverse=true) #
降序# 'key = lambda x: x[1]' can be substituted by operator.itemgetter(1)
returnsortedvote[0][0]
k = knn() # create knn object
group, labels = k.createdataset()
cls = k.knnclassify([0, 0], group, labels, 3)
printcls
123
>>>import os輸出:b>>>os.chdir("/home/liudiwei/code/data_miningknn/")
>>>execfile("knn.py")
(b表示類別)
2.或者terminal中直接執行
1
$ python knn.py3.也可以不在knn.py中寫輸出,而選擇在shell中獲得結果,i.e.,
12
>>>import knnintroduction to data mining 資料探勘導論>>> knn.k.knnclassify([0,0],knn.group,knn.labels,3)
rachel zhang-k近鄰分類演算法實現 in python
**:
機器學習 KNN
定義事件ejl j 0,1.k e j epsilon 0,1.k ejl j 0,1.k 為對於標籤 l,k個鄰居中包換j個這個標籤,則 e為乙個 k n 的矩陣,每一行為距離該例項的樣本中每個標籤的數量,則 c l 向量是e矩陣的最後一行,表示距離為k時的各個標籤數量。則我們需要的是在已知e矩陣...
機器學習 kNN
0.載入相關模組 import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns from sklearn.model selection import train test s...
機器學習 KNN
1 import numpy as np 2from sklearn.neighbors import kneighborsclassifier 3from sklearn.model selection import train test split 4from sklearn.preproces...