機器學習之三 Knn

2021-08-17 03:58:40 字數 3321 閱讀 8688

1、原理

給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。

2、步驟

(1).計算新例項和訓練樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離,曼哈頓距離等);

(2)對上面所有的距離值進行排序;

(3)選前k個最小距離的樣本;

(4)根據這k個樣本的標籤進行投票,得到最後的分類類別;

如何選擇乙個最佳的k值,這取決於資料。一般情況下,在分類時較大的k值能夠減小雜訊的影響。但會使類別之間的界限變得模糊。乙個較好的k值可通過各種啟發式技術來獲取,比如,交叉驗證。另外雜訊和非相關性特徵向量的存在會使k近鄰演算法的準確性減小。

3、公式描述

輸入:訓練資料集t=

其中,xi

⊂rn 為例項的特徵向量,yi

⊂ 為例項的類別,i=1,2,3..,n

輸出:例項x所屬的類y

(1)根據給定的距離度量,在訓練集t中找出與x最臨近的k個點,涵蓋這k個點的x的鄰域記做nk

(x)

(2)在nk

(x) 中根據分類決策規則(如多數表決)決定x的類別y: y=

argm

ax∑x

i⊂nk

(x)i

(yi=

cj),

i=1,

2,3...,n

,j=1

,2,3...,n

其中i 為指示函式,即當yi

=cj時

i 為1,否則

i為0。

knn演算法的優點:

1. 思想簡單,理論成熟,既可以用來做分類也可以用來做回歸;

2. 可用於非線性分類;

3. 訓練時間複雜度為o(n);

4. 準確度高,對資料沒有假設,對outlier不敏感;

缺點:

1. 計算量大;

2. 樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);

3. 需要大量的記憶體;

4、**實現

(1)手動編寫knn分類器

import numpy as np

# 建立資料集,包含四個例項和兩個分類

defcreatedataset

():

group = np.array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])

labels = ['a', 'a', 'b', 'b']

return group, labels

# 用knn進行分類

defknnclassify

(newinput, dataset, labels, k):

numsamples = dataset.shape[0] # shape[0]代表行數,這裡為樣本點個數

## step 1: 計算歐式距離

# >行數=原來*numsamples,列數=原來*1

# >然後每個特徵點和樣本的點進行相減,返回乙個矩陣

diff = np.tile(newinput, (numsamples, 1)) - dataset

squareddiff = diff ** 2

# axis=0 按列求和,1為按行求和,行向量分別相加,從而得到新的乙個行向量

squareddist = np.sum(squareddiff, axis = 1) # 每一列分別求和,得到行向量

distance = squareddist ** 0.5

## step 2: 對距離按大小逆序排序

sorteddistindices =np.argsort(distance) #返回的是陣列元素值從小到大的索引值

classcount = {} # 定義乙個元組,用於存距離最近的k個點中,點所屬的每個類出現的次數

for i in xrange(k):

## step 3: 在距離中選擇最小k個距離

votelabel = labels[sorteddistindices[i]]

# step 4: 計算標籤發生的概率

# get()函式返回指定鍵的值,如果值不在字典中返回預設值0。

classcount[votelabel] = classcount.get(votelabel, 0) + 1

## step 5: 最大的類將會被返回

maxcount = 0

for key, value in classcount.items():

if value > maxcount:

maxcount = value

maxindex = key

return maxindex

if __name__ == '__main__':

dataset, labels = createdataset()

testx = np.array([1.2, 1.0])

k = 3

outputlabel = knnclassify(testx, dataset, labels, 3)

print

"your input is:", testx, "and classified to class: ", outputlabel

testx = np.array([0.1, 0.3])

outputlabel = knnclassify(testx, dataset, labels, 3)

print

"your input is:", testx, "and classified to class: ", outputlabel

(2)呼叫框架中的工具實現knn分類器

import numpy as np

from sklearn.neighbors import kneighborsclassifier

group = np.array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])

labels = ['a', 'a', 'b', 'b']

knn = kneighborsclassifier(n_neighbors=3) # k值設定為3

knn.fit(group, labels)

print(knn.predict([[0.1, 0.3]])) # **值

機器學習 KNN

posted on 2015 05 21 20 34 in ml 0 comment views 3195 原始碼 決策樹和基於規則的分類器都是積極學習方法 eager learner 的例子,因為一旦訓練資料可用,他們就開始學習從輸入屬性到類標號的對映模型。乙個相反的策略是推遲對訓練資料的建模,直...

機器學習 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...