機器學習——最鄰近規則分類(K Nearest Neighbor)KNN演算法

loveliuzz發表於2017-09-12

1、簡介

(1)Cover和Hart在1968年提出最初的臨近演算法

(2)鄰近演算法屬於分類(classification)演算法

(3)輸入基於例項的學習(instance-based learing),懶惰學習(lazy learing)——處理訓練集時並沒有建造任何的模型,當對一個未知的例項進行歸類時才進行歸類

2、舉例

如何將電影的例子模擬成一個廣泛的模型?

對於每一個電影模擬成一個例項點,每個點的特徵向量(在這裡是二維的),可以是N維的,即:每個點都可以抽象成空間中具有多維的空間向量

每個點所對應的標籤分類的值是我們的目標。如下圖:



3、演算法詳述

(1)步驟:

為了判斷未知例項的類別,以所有已知類別的例項作為參照

選擇引數K(對任意一個未知例項選取最近的K個已知例項進行歸類,通常K的值不會太大,選取1,3,5,7等等的奇數,因為奇數更容易分辨勝負更容易分類,根據實驗對引數進行優化)

計算未知例項與所有已知例項的距離

選擇最近鄰K個已知例項選擇最近鄰K個距離的例項

根據少數服從多數的投票法則(majority-voting),讓未知例項歸類為K個最近鄰樣本中最多數的類別

(2)細節

關於距離的衡量方法

歐氏距離Euclidean Distance(最常用)定義:對應點的每個維度求差後的平方求和再開平方。x=(x1,x2,...,xn) y=(y1,y2,...,yn)


其他的距離均衡:餘弦值(cos)、相關度(correlation)、曼哈頓距離(Manhattan Diatance):得名於紐約曼哈頓街道,求點的距離看其走過多少多少街區。

(3)舉例:要求出G點到每一個點的歐氏距離

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#求歐氏距離

import math
def ComputeEuclideanDistance(x1,y1,x2,y2):
    d = math.sqrt(math.pow((x1-x2),2)+math.pow((y1-y2),2))
    return d
d_ag = ComputeEuclideanDistance(3,104,18,90)
d_bg = ComputeEuclideanDistance(2,100,18,90)
d_cg = ComputeEuclideanDistance(1,81,18,90)
d_dg = ComputeEuclideanDistance(101,10,18,90)
d_eg = ComputeEuclideanDistance(99,5,18,90)
d_fg = ComputeEuclideanDistance(98,2,18,90)
print("d_ag:",d_ag)
print("d_bg:",d_bg)
print("d_cg:",d_cg)
print("d_dg:",d_dg)
print("d_eg:",d_eg)
print("d_fg:",d_fg)

執行結果:

d_ag: 20.518284528683193
d_bg: 18.867962264113206
d_cg: 19.235384061671343
d_dg: 115.27792503337315
d_eg: 117.41379816699569
d_fg: 118.92854997854805
比較以上的計算出的6個歐氏距離,選取最近的3個距離對應的點A,B,C三個點,由於這三個點都屬於Romance型別,則未知資料G點根據最近鄰規則分類(KNN)也屬於Romance型別。
若選取的點中兩個型別都存在,則遵從少數服從多數的原則,選取類別數目多的作為未知點的類別。


(4)KNN演算法的優缺點舉例


上圖有兩個不同類別的點分別為紅色和藍色,綠色的點為新的例項,問這個點的歸類?

假設取K=1,只看距離綠色最近的一個點,應該和藍色分類到一起;假設K=4,包含3個紅色與1個藍色,根據少數服從多數原則,應該歸類為紅色;假設K=9,應該歸類為紅色。

所以KNN演算法對於K的選擇非誠敏感,K=1時,不能夠防止噪音,通常會增大K,以增加對噪音的健壯性。

(5)演算法優缺點

演算法優點:簡單、易於理解、容易實現、通過對K的選擇可具備丟噪音資料的健壯性

演算法缺點:需要大量的空間儲存已知的例項、演算法的複雜度高(需要比較所有已知例項與要分類的例項)

當樣本分佈不均衡時,比如其中一類樣本過大(例項資料量過多)佔主導的時候,新的未知例項容易被歸類為這個主導樣本

因為這類樣本例項的數量過大,但這個新的未知例項實際並未接近目標樣本。

(6)改進版本

考慮距離,根據距離加上權重。比如:1/d(d為距離)

相關文章