天天看點

K-最鄰近算法

一、算法簡介:

鄰近算法,或者說K-最近鄰(KNN,K-NearestNeighbor)分類算法是資料挖掘分類技術中最簡單的方法之一。所謂K最近鄰,就是K個最近的鄰居的意思,說的是每個樣本都可以用它最接近的K個鄰近值來代表。

 二、核心思想

  K臨近算法主要依靠周圍有限的臨近的樣本,而不是依靠判别類域的方法來确定所屬類别,是以對于類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為适合。

  簡單的來講,就是“在一定區域内從衆式的随波逐流”。

三、樣例分析

我們需要确定綠點屬于哪個顔色(藍色或者紅色),要做的就是選出距離目标點距離最近的k個點,看這k個點的大多數顔色是什麼顔色。以綠點為圓心做圓,可以直覺地看到其他樣本與其目标點距離大小的排序,當k取3的時候,我們可以看出距離最近的三個,分别是紅色,紅色,藍色,是以得到目标點為紅色;但當k取5時,我們可以看出距離最近的五個,分别是紅色,紅色,藍色,藍色,藍色,是以得到的目标點為藍色,是以我們可以知道k的取值不同,得到的結果也是不同的。

K-最鄰近算法

算法步驟:

  1. 計算測試資料與各個訓練資料之間的距離;

    2)按照距離的遞增關系進行排序;

    3)選取距離最小的K個點;

    4)确定前K個點所在類别的出現頻率;

    5)傳回前K個點中出現頻率最高的類别(決策依據方法之一)作為測試資料的預測分類。

K-最鄰近算法

關于距離的計算:

闵可夫斯基距離、歐幾裡得距離(勾股定理)、曼哈頓距離、切比雪夫距離、馬氏距離、餘弦相似度、皮爾遜相關系數、漢明距離、傑卡德相似系數、編輯距離、DTW距離、KL散度

四、代碼實作

#引庫
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt
#matplotlib inline
#原始資料
data=[[1,0.9],[1,1],[0.1,0.2],[0,0.1]]
labels=['A','A','B','B']
test_data=[[0.1,0.3]]
#繪制原始資料散點圖
print("------------------------資料準備----------------------")
print("原始資料圖像繪制...")
for i in range(len(data)):
    plt.scatter(data[i][0],data[i][1],color='b')
plt.scatter(test_data[0][0],test_data[0][1],color='r')
plt.show()
#測試資料x=(0.1,0.3)
#采用歐氏距離進行計算
print("------------------------距離計算----------------------")
x=[[0.1,0.3]]
distance=[]
labels_vz=[]
for i in range(len(data)):
    d=0
    d=sqrt((x[0][0]-data[i][0])**2+(x[0][1]-data[i][1])**2)
    distance.append(d)
    labels_vz.append(i)
print("計算的距離為:\n",distance)
print("現在對應的标簽位置為:\n",labels_vz)
#按照升序排序,并取距離最小的前3個
print("-----------------------距離排序-----------------------")
for i in range(len(data)-1):
    for j in range(i+1,len(data)):
        if distance[i]>distance[j]:
            distance[i],distance[j]= distance[j],distance[i]
            labels_vz[i],labels_vz[j]= labels_vz[j],labels_vz[i]
print("排序後的距離為:\n",labels_vz)
print("取距離最近的3個值:",distance[0:3])
#進行投票表決
print("-----------------------表決投票-----------------------")
A=0
B=0
for i in range(len(labels_vz[0:3])):
    if labels[labels_vz[i]]=='A':
        A+=1
    else:
        B+=1
print("投票為A的數量為:",A)
print("投票為B的數量為:",B)
print("\n對照初始圖中紅色點(測試點)與前兩個标簽為A的離的最近,是以我們的計算與圖中所呈現的繪圖一緻")
           
K-最鄰近算法
K-最鄰近算法