機器學習實戰之K-近鄰演算法
一、K-近鄰演算法概念
1、書上概念:
K-近鄰演算法採用不同特徵值之間的距離的方法進行分類
2、演算法介紹:
- 計算測試資料與各個訓練資料之間的距離;
- 按照距離的遞增關係進行排序;
- 選取距離最小的K個點;
- 確定前K個點所在類別的出現的頻率;
- 返回錢K個點中出現頻率最高的類別作為測試資料的預測分類。
3、怎麼算:
比如:如下這張圖, 圖中有兩種點,一種是藍色的正方形,一種是紅色的三角,在圖片的中間有一個未知的綠色圓點,請問這個綠色遠點應該是藍色的正方形,還是紅色的三角形?
在這裡:
- 首先將綠色遠點與整個圖中所有的藍色正方形以及紅色三角形進行距離的計算;
- 按照綠點與每個點的距離進行遞增排序;
- 選取距離最小的K個點;
- 在這K個點中,確定到底是藍色還是紅色出現的頻率,也就是次數更多;
- 如果紅色多,則返回紅色,反之返回紅色。
注意:
- 在K決定的過程中,需要根據實際情況進行確定,比如這裡的K如果取3,則在這個範圍內的紅色點多,那麼這個未知點就應該是紅色的三角,如果K取5,則這個範圍中的藍色點居多,則未知點應該是藍色的正方形。
- 在K進行取值判斷的時候,K應當取一個奇數值,即如果取偶數值,有可能會發生兩個的比例相同的情況,如這個圖中,如果K=4,則紅色和藍色的比例將相等,則無法進行有效判斷。
4、距離如何計算:
在K-臨近演算法中,距離通常使用歐氏距離:
L 2 ( a , b ) = ( ∑ i = 1 n ∣ a i − b i ∣ 2 ) 1 2 L_2(a, b)=(\sum_{i=1}^n \ |a_i-b_i|^2)^\frac{1}{2} \
L2(a,b)=(i=1∑n∣ai−bi∣2)21
通俗來講,就是計算兩個點的直線距離,比如
求二維座標軸中點a(1, 4)和點 b(4, 8)的歐氏距離,則:
s = ∣ 1 − 4 ∣ 2 + ∣ 4 − 8 ∣ 2 = 5 s = \sqrt{|1-4|^2+|4-8|^2} \ = 5 s=∣1−4∣2+∣4−8∣2 =5
所以,a、b兩點的直線距離為5,同理,高維的點的計算方法依舊是各個對應點的差的平方和,最後再開方。
二、資料的歸一化處理
1、什麼是資料歸一化
在《機器學習實戰》書中,K-近鄰演算法為我們提供了一個改進約會網站的配對效果的案例,在書中,作者為我們提供了相應的資料:
資料含義:
- 每年獲得的飛行常客里程數
- 玩視訊遊戲所耗時間百分比
- 每週消費的冰淇淋公升數
- 最右一列表示:1-不喜歡的人, 2-魅力一般的人, 3-極具魅力的人
在這裡,如果有一個需要測試的資料為:
里程數 | 時間百分比 | 公升數 |
---|---|---|
1234 | 6.24134 | 1.12345 |
在計算過程中,首先我們需要將該資料與提供的訓練資料中的每個資料進行歐氏距離計算,在這個過程中,我們就能發現,每一個特徵值的單位以及資料的大小几乎完全不一樣,所以最終的結果可能會因為某一個數據過大或過小導致最終的結果出現偏差。因此,我們需要引入資料歸一化的概念。
2、怎麼進行資料歸一化處理
我們在處理不同取值範圍的特徵值時,我們通常講取值範圍處理為0到1或者-1到1,具體公式如下:
n
e
w
V
a
l
u
e
(
歸
一
化
後
的
數
據
)
=
o
l
d
V
a
l
u
e
(
原
數
據
)
−
m
i
n
(
該
列
數
據
最
小
值
m
a
x
(
該
列
數
據
最
大
值
)
−
m
i
n
(
該
列
數
據
最
小
值
)
newValue(歸一化後的資料)=\frac{oldValue(原資料)-min(該列資料最小值}{max(該列資料最大值)-min(該列資料最小值)} \
newValue(歸一化後的數據)=max(該列數據最大值)−min(該列數據最小值)oldValue(原數據)−min(該列數據最小值
在該例中,比如求餓資料的處理:
裡 程 數 = 1234 − 5569 77372 − 5569 = − 0.06037352199768812 里程數=\frac{1234-5569}{77372-5569} \ =-0.06037352199768812 裡程數=77372−55691234−5569=−0.06037352199768812
時 間 百 分 比 = 6.24134 − 0 15.299570 − 0 = 0.40794218399602084 時間百分比=\frac{6.24134-0}{15.299570-0} \ =0.40794218399602084 時間百分比=15.299570−06.24134−0=0.40794218399602084
公 升 數 = 1.12345 − 0.134296 1.686209 − 0.134296 = 0.6373772241098566 公升數=\frac{1.12345-0.134296}{1.686209-0.134296} \ =0.6373772241098566 公升數=1.686209−0.1342961.12345−0.134296=0.6373772241098566
此時,可以發現三個特徵值都處於-1到1之間,同時將所有的資料進行相應的處理後,將會去除因為大小導致的偏差。此時,在進行歐式距離計算將會使資料在同等的單位下進行大小運算,得到的結果將會比原結果更加準確。