簡單來說:k-近鄰演算法(knn)採用測量不同特徵值之間的距離演算法進行分類
優點:精度高、對異常值不敏感、無資料輸入假定
缺點:計算複雜度高、空間複雜度高
適用資料範圍:數值型和標稱型
工作原理:存在乙個訓練樣本集,樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似(最近鄰)的分類標籤。一般來說,只選擇樣本資料集中前k個最相似的資料。通常k是不大於20的整數。
# -- coding: utf-8 --
import numpy as np
import operator
defcreatedataset()
:# 建立資料集
group = np.array([[
1.0,
1.1],[
1.1,
1.0],[
0,0]
,[0,
0.1]])
labels =
['a'
,'a'
,'b'
,'b'
]return group, labels
defclassify0
(inx, dataset, labels, k)
:# inx為新輸入資料,array型別 1*2
# dataset為輸入的訓練樣本集(不含標籤),array型別 4*2
# labels為標籤,array型別 1*4
# k為選擇近鄰數目
# 以上資料大小僅為此資料集大小
datasetsize = dataset.shape[0]
# array.shape[0] 提取array的行數 此處datasetsize為4
diffmat = np.tile(inx,
(datasetsize,1)
)- dataset
sqdiffmat = diffmat **
2 sqdistances = sqdiffmat.
sum(axis=1)
distances = sqdistances **
0.5# 以上部分計算各點之間歐式距離
sorteddistindicies = distances.argsort(
)# argsort函式返回的是陣列值從小到大的索引值
classcount =
for i in
range
(k):
voteilabel = labels[sorteddistindicies[i]
]# 將按距離排列後的例項的標籤提取出來
classcount[voteilabel]
= classcount.get(voteilabel,0)
+1# 獲得key為voteilabel的value,進行加一操作
# sortedclasscount = sorted(classcount.iteritems(),
# key=operator.itemgetter(1), reverse=true)
# 原文**如上,在python3環境下報錯,改為如下**可執行,具體含義見下文
sortedclasscount =
sorted
(classcount.items(),
key=operator.itemgetter(1)
, reverse=
true
)# true為降序
return sortedclasscount[0]
[0]if __name__ ==
"__main__"
: group, labels = createdataset(
) a = classify0([0
,0], group, labels,3)
print
(a)
因為有的函式不是很熟悉,所以衝浪去搜了一波用法,具體解釋如下:
numpy.tile():把陣列沿各個方向複製,例如上面的**datasetsize為4,可以寫為
diffmat = np.tile(inx,(4
,1))
- dataset
將inx([0,0])沿x軸複製1次,再沿y軸複製4次,得到的結果為
[[0
0][0
0][0
0][0
0]]
最後的diffmat結果是上面的結果和dataset相減的結果,為
[[-
1.-1.1][
-1.1-1
.][0
.0.]
[0.-
0.1]
]
這就是計算歐式距離的第一步,對所有點執行(x0-x1,y0-y1)操作,之後進行平方操作
sqdiffmat = diffmat **
2
numpy.sum():以**為例
sqdistances = sqdiffmat.
sum(axis=
1)
含義是將sqdiffmat[0][j],sqdiffmat[1][j]的對應項相加,即[1,1.21,0,0]+[1.21,1,0,0.01]=[2.21,2.21,0,0.01]
得出的結果是開平方之前的結果,即每個點與**點距離的平方
之後進行開方操作得到歐氏距離
distances = sqdistances **
0.5
sorted()和operator.itemgetter():原文**
sortedclasscount =
sorted
(classcount.items(),
key=operator.itemgetter(1)
, reverse=
true
)
對classcount的每乙個items物件進行降序排序,排序的依據是物件第一域的值
classcount經過計算為[('b', 2), ('a', 1)]
,意為,距離前三近的店裡面,標籤為b的出現了兩次,為a的出現了一次,items為('b', 2)
和('a', 1)
,按照第一域排序即按照2和1進行排序。
numpy.tile():
numpy sum axis詳解:
numpy中argsort函式用法:
python 字典(dictionary) get()方法:
python中的sorted函式以及operator.itemgetter函式:
機器學習實戰筆記(一)
機器學習是通過程式設計讓計算機從資料中進行學習的科學 和藝術 機器學習是讓計算機具有學習的能力,無需進行明確程式設計。亞瑟 薩繆爾,1959 電腦程式利用經驗e學習任務t,效能是p,如果針對任務t的效能p隨著經驗e不斷增長,則稱為機器學習 湯姆 公尺切爾,1997 需要進行大量手工調整或者需要擁有長...
《機器學習實戰》學習筆記
很久沒寫過部落格了,一重開就給自己挖了這麼乙個大坑 最近一段時間看了 機器學習實戰 這本書,感覺寫得不錯,認真看了看。關於這本書的書評及購買事宜請移步豆瓣 京東 亞馬遜等 這裡不多說。不過有一點,感覺這本書有個很好的地方是給出了各個演算法的python實現 和講解,要求不高的話可以拿來用了 懶 在這...
《機器學習實戰》學習筆記
目錄 第2章 k 近鄰演算法 第3章 決策樹 第4章 基於概率論的分類方法 樸素貝葉斯 第5章 logistic回歸 第7章 利用adaboost元演算法提高分類效能 第8章 數值型資料 回歸 1.python console匯入knn.py檔案 import knn1.reload的使用方法 fr...