- 首先我們通過一個簡單的資料集來了解一下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()
結果顯示如下圖:
我們可以清楚的看到,紅色和綠色的兩個不同類别分布情況,接下來我們又得到了另一個點,但是我們不知道他是屬于哪一個類别,這時我們就需要将它也在圖上表示出來,代碼如下:
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()
我們将新增的這個點用藍色表示,結果如下:
我們可以清楚的再圖上看到他的位置,和紅色部分靠近。
* 因為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.
代碼截圖: