採用測量不同特徵值之間的距離方法進行分類。
knn工作原理:訓練樣本集中每個資料有乙個一一對應的所屬分類的標籤。需要分類的新資料沒有標籤,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後將樣本集中與其特徵最相似(最近鄰)的資料標籤作為新資料的標籤。
一般來說,我們選擇樣本集中前k個最相似的資料(通常k<=20)中,出現次數最多的,作為新資料的分類。
使用python匯入資料
from numpy import
* #科**算包
import operator #運算子模組
def createdataset()
: #定義了四組資料和相應的標籤
group =
array([
[1.0
,1.1],
[1.0
,1.0],
[0,0
],[0
,0.1]]
) labels =
['a'
,'a'
,'b'
,'b'
]return group,labels
#從文字檔案中解析資料
def classify0
(inx,dataset,labels,k)
: #(新資料,訓練集資料,訓練集標籤,最近鄰數)
datasetsize = dataset.shape[0]
diffmat =
tile
(inx,
(datasetsize,1)
)- dataset
sqdiffmat = diffmat**
2 #各個元素分別平方
sqdistances = sqdiffmat.
sum(axis=1)
distances = sqdistances**
0.5 #開根得到距離
sorteddistindicies = distances.
argsort()
classcount=
#初始化classcount
for i in
range
(k): #選擇歐式距離最小的k個點
voteilabel = labels[sorteddistindicies[i]
] classcount[voteilabel]
= classcount.
get(voteilabel,0)
+1 sortedclasscount =
sorted
(classcount.
items()
, key=operator.
itemgetter(1
),reverse=true)
return sortedclasscount[0][0]
(1)tile()將inx二維陣列化,變成datasetsize行1列
(2)sum()函式
sum(axis=1)表示矩陣中行之間數的求和;
sum(axis=0)表示矩陣中對列求和
(3)argsort()函式
argsort()函式的具體功能如下:
import numpy as np
x = np.
array([
1,4,
3,-1
,6,9
])y = x.
argsort()
>>>y=
array([
3,0,
2,1,
4,5]
)
發現argsort()函式是將x中的元素從小到大排列,輸出其對應的index(索引)。
例如:x[3]=-1最小,所以y[0]=3;x[5]=9最大,所以y[5]=5。
(4)classcount.get()函式
檢測並生成新元素,0只做初始化作用,計數,遇到相同的加1
for i in
range
(k): #選擇歐式距離最小的k個點
voteilabel = labels[sorteddistindicies[i]
] classcount[voteilabel]
= classcount.
get(voteilabel,0)
+1
令k=3
假設labels = [『a』,『a』,『a』,『b』,『b』,『b』]
假設sorteddistindicies = [1,3,0]
那麼-------------------------、
當k=0,
voteilabel = labels[sorteddistindicies[0]]
= labels[1] = 'a'
classcount['a'] = classcount.get('a',0) + 1
>>>classcount =
當k=1,
voteilabel = labels[sorteddistindicies[1]]
= labels[3] = 'b'
classcount['b'] = classcount.get('b',0) + 1
>>>classcount =
當k=2,
voteilabel = labels[sorteddistindicies[2]]
= labels[0] = 'a'
classcount['a'] = classcount.get('a',0) + 1
>>>classcount =
>>>classcount =
(5)sorted()函式sorted(iterable, key=none, reverse=false)
iterable為排序物件
key表示按什麼要素排序
reverse預設false表示公升序
sortedclasscount = sorted(classcount.items(),
key=operator.itemgetter(1),reverse=true)
classcount.items()返回的是dict_items,將classcount字典分解為元組列表
注意:python2的iteritems()轉為python3的items()
operator.itemgetter(1)表示對classcount的第2個域進行排序(即標籤頻次)
reverse=true表示是公升序排列
至此,分類器建成,測試結果如下
機器學習 k 近鄰演算法
一.k 近鄰演算法概述 簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。k 近鄰演算法 knn 它的工作原理是 存在乙個樣本資料集,也稱訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將資料的每個特徵與樣本集合中資...
機器學習 K近鄰演算法
用例一 from sklearn.neighbors import nearestneighbors import numpy as np x np.array 1,1 2,1 3,2 1,1 2,1 3,2 nbrs nearestneighbors n neighbors 2,algorithm...
機器學習 K近鄰演算法
工作原理 存在乙個訓練樣本資料集合,每組資料對應乙個標籤及分類 比如下邊例子為前兩個資料都為a類 輸入測試樣本後通過計算求出測試樣本與訓練樣本的歐氏距離d,取前k個最小的值,這k組資料對應的標籤分類最多的那種,就是測試樣本的標籤。訓練樣本資料 1.0,1.1 1.0,1.0 0,0 0,0.1 歐氏...