天天看點

python3實作機器學習--KNN算法詳解

  • 首先我們通過一個簡單的資料集來了解一下KNN算法。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

data_x=
[[3.342342, 2.3231231],
 [3.12122, 1.782342],
 [1.343423, 3.362342],
 [3.5823423, 4.67342],
 [2.2834234, 2.866345],
 [7.42123123, 4.696345],
 [5.742434, 3.63234],
 [9.173423, 2.5152342],
 [7.7952342, 3.5212412],
 [7.9352342, 0.79523421]]
 data_y=[,,,,,,,,,]
           

data_x資料集是繪制圖像需要的幾個基本點,data_y是這些點所在的不同類别,分别是0,1。

接下來我們通過matplotlib來展示這些點的分布情況。

#這是實際操作的點
X_train=np.array(data_x)
Y_train=np.array(data_y)

plt.scatter(X_train[Y_train==,],X_train[Y_train==,],color="g")
plt.scatter(X_train[Y_train==,],X_train[Y_train==,],color="r")
plt.show()
           

結果顯示如下圖:

python3實作機器學習--KNN算法詳解

我們可以清楚的看到,紅色和綠色的兩個不同類别分布情況,接下來我們又得到了另一個點,但是我們不知道他是屬于哪一個類别,這時我們就需要将它也在圖上表示出來,代碼如下:

x=np.array([,])

plt.scatter(X_train[Y_train==,],X_train[Y_train==,],color="g")
plt.scatter(X_train[Y_train==,],X_train[Y_train==,],color="r")
plt.scatter(x[],x[],color="b")
plt.show()
           

我們将新增的這個點用藍色表示,結果如下:

python3實作機器學習--KNN算法詳解

我們可以清楚的再圖上看到他的位置,和紅色部分靠近。

* 因為KNN算法是根據相近的幾個點的位置來判斷該點是什麼類别,是以我們可以知道,這個點是屬于紅色的類别。

* 思路:

1.計算出新的那個點和原來那些點的距離

from math import sqrt
dis=[]
for x_train in X_train:
    d=sqrt(np.sum((x_train-x)**))
    dis.append(d)

 結果:
 dis:
 [,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ]
           

或直接使用:

dis=[sqrt(np.sum((x_train-x)**)) for x_train in X_train]
           

結果都是一樣的,我們得到了新的點和原來點的距離

2.接下來我們要得到與新的點距離最近的幾個點,我們要對生成的dis裡面的資料進行排序,得到這些點的位置,我們可以得到最近的點的索引位置,使用numpy内置的argsort方法。

将排序結果存在short裡面:

short=np.argsort(dis)

結果:
array([, , , , , , , , , ])
           

可以知道,最近的點是索引為8的點,其次是7.

3.我們還要得到這些距離最近的幾個點屬于哪些類别。我們設定k為6,看前六個點屬于哪些類别,将y_train中的資料在short中周遊,看哪些符合條件。

topK_y=[y_train[i] for i in short[:k]]
           

結果:[1, 1, 1, 1, 1, 0]

是以,最近的五個點為類别1,還有一個類别0.

或者我們計算結果:

from collections import Counter
Counter(topK_y)#計算出現的頻次

結果:Counter({: , : })
           
votes=Counter(topK_y)#存放結果
votes.most_common()

結果:
[(, )]#最多的為1,有五個
           

因為我們要擷取的是類别,是以通過[0][0]擷取。

pre=votes.most_common(1)[0][0]
結果:
1
           

是以我們就得到了最近的點的類别是1,這個點就是類别1.

代碼截圖:

python3實作機器學習--KNN算法詳解
python3實作機器學習--KNN算法詳解
python3實作機器學習--KNN算法詳解
python3實作機器學習--KNN算法詳解
python3實作機器學習--KNN算法詳解

繼續閱讀