k-近鄰算法
k-近鄰算法一般流程
- 1收集數據:可以使用任何方法。
- 2準備數據:距離計算所需要的數值,最好是結構化的數據格式。
- 3分析數據:可以使用任何方法。
- 4訓練算法:此步驟不適用于k-近鄰算法。
- 5測試算法:計算錯誤率。
- 6使用算法:首先需要輸入樣本數據和結構化的輸入結果,然后運行k-近鄰算法判定輸入數據分別屬于那個分類,最后應用對計算出的分類執行后續的處理。
根據上圖所示,有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據。也就是說,現在, 我們不知道中間那個綠色的數據是從屬于哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。
- 如果K=3,綠色圓點的最近的3個鄰居是2個紅色小三角形和1個藍色小正方形,少數從屬于多數,基于統計的方法,判定綠色的這個待分類點屬于紅色的三角形一類。
- 如果K=5,綠色圓點的最近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬于多數,基于統計的方法,判定綠色的這個待分類點屬于藍色的正方形一類。
于此我們看到,當無法判定當前待分類點是從屬于已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特征,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是K近鄰算法的核心思想。其關鍵還在于K值的選取,所以應當謹慎。
KNN算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
KNN 算法本身簡單有效,它是一種 lazy-learning 算法,分類器不需要使用訓練集進行訓練,訓練時間復雜度為0。KNN 分類的計算復雜度和訓練集中的文檔數目成正比,也就是說,如果訓練集中文檔總數為 n,那么 KNN 的分類時間復雜度為O(n)。
python代碼實現說明
科學計算包:numpy
運算符模塊:operator
shape函數說明
shape函數是numpy.core.fromnumeric中的函數,它的功能是查看矩陣或者數組的維數
代碼:
>>> a = array([[1,2,3],[5,6,9],[9,8,9]])
>>> a.shape
(3, 3)
>>> a.shape[0]
3
numpy.tile函數說明
函數形式:tile(A,rep)
功能:重復A的各個維度
參數類型:
A: Array類的都可以
rep:A沿著各個維度重復的次數
>>> a =array([[1,2,3],[5,6,9],[9,8,9]])
>>> tile(a,3)
array([[1, 2, 3, 1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9, 9, 8, 9]])
>>> tile(a,[3,2])
array([[1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9],
[1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9],
[1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9]])
>>> tile(a,[2,2,3])
array([[[1, 2, 3, 1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9, 9, 8, 9],
[1, 2, 3, 1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9, 9, 8, 9]],
[[1, 2, 3, 1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9, 9, 8, 9],
[1, 2, 3, 1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9, 9, 8, 9]]])
reps的數字從后往前分別對應A的第N個維度的重復次數。
如:
- tile(A,3)表示A的第一個維度重復3遍。
- tile(A,(3,2))表示A的第一個維度重復2遍,然后第二個維度重復3遍。
- tile(A,(2,2,3))表示A的第一個維度重復3遍,第二個維度重復2遍,第三個維度重復2遍。
sum函數說明
函數形式:sum(axis = 0 or 1)
函數功能:沒有axis參數表示全部相加,axis=0表示按列相加,axis=1表示按照行的方向相加(取‘厲害’諧音)
>>> b = tile(a,[3,2])
>>> b
array([[1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9],
[1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9],
[1, 2, 3, 1, 2, 3],
[5, 6, 9, 5, 6, 9],
[9, 8, 9, 9, 8, 9]])
>>> c = b.sum(axis = 0)
>>> c
array([45, 48, 63, 45, 48, 63])
>>> d = b.sum(axis = 1)
>>> d
array([12, 40, 52, 12, 40, 52, 12, 40, 52])
>>> e = b.sum()
>>> e
312
>>>
argsort函數說明
函數形式:argsort(x) or x.argsort()
參數功能:argsort函數返回的是數組值從小到大的索引值
>>> x = array([3,4,2,5,1,6])
#按升序排列
>>> x.argsort()
array([4, 2, 0, 1, 3, 5])
#按升序排列
>>> argsort(-x)
array([5, 3, 1, 0, 2, 4])
>>>
sort函數、sorted函數說明
函數形式:sorted(iterable,cmp,key,reverse)
函數功能:排序
- sort對列表list進行排序,而sorted可以對list或者iterator進行排序
- sort函數對列表list進行排序時會影響列表list本身,而sorted不會
參數類型:
iterable:是可迭代類型;
cmp:用于比較的函數,比較什么由key決定;
key:用列表元素的某個屬性或函數進行作為關鍵字,有默認值,迭代集合中的一項;
reverse:排序規則. reverse = True 降序 或者 reverse = False 升序,有默認值。
返回值:是一個經過排序的可迭代類型,與iterable一樣。
>>> a = [7,3,9,4,1]
>>> sorted(a)
[1, 3, 4, 7, 9]
>>> a
[7, 3, 9, 4, 1]
>>> a.sort()
>>> a
[1, 3, 4, 7, 9]
operator.itemgetter函數
>>> a = [1,2,3]
>>> b = operator.itemgetter(1)//定義函數b,獲取對象的第1個域的值
>>> b(a)
2
>>> b = operator.itemgetter(0,1)//定義函數b,獲取對象的第1個域和第0個的值
>>> b(a)
(1, 2)