一:knn演算法概念(k-nearest neighbor)
舉個栗子:現在有10個點,突然我們又加了乙個點,然後我們計算該點到其它點的距離從小到大排序,然後取前k個,檢視該k個屬於哪一部分的較多,那麼我們就可以大概率的確定該點屬於那一類。
圖中藍色點為我們新加的點,然後我們就是要確定這個藍色的點屬於哪一類的概率較大。
二:計算兩點間的公式
歐式距離(常用):類似於亮點間的距離公式,但是我們的特徵有可能多個,所以可以擴充套件到n維。
曼哈頓距離:
就是表示兩個點在標準座標系上的絕對軸距之和。
三:案例分析
有10個病人,得了腫瘤,但是有良性的有惡性的,0代表良性的1代表惡性的,然後我們現在又來了乙個病人,想要**他是良性還是惡性。這時我們就可以採取knn演算法來判斷他屬於哪一種。
特徵有兩個,a和b,將其封裝為向量。
raw_data_x = [[1.232422,1.22324],[2.324232,1.3224],
[2.3435353,2.3232342],
[3.434353,3.434353],
[4.54546,3.54544],
[7.42422,6.764353],
[6.42224534,7.533232],
[8.435353,8.5433],
[9.423534,9.422224],
[8.544444,9.4564454]]
標記,0和1,同樣封裝為向量。
raw_data_y=[0,0,0,0,0,1,1,1,1,1]被**的病人,給出兩個特徵。
x = np.array([5.4323213,6.433534454])
我們可以先看下10個樣本的分布,紅色是良性的,綠色是惡性的。第一張圖的藍色的就是我們新加點,然後我們要計算藍色點到其他點的距離用歐式距離計算。
x_train = np.array(raw_data_x)y_train = np.array(raw_data_y)
distinces = [sqrt(np.sum(i-x)**2) for i in x_train]distince列表就是我們計算出到每個點的距離。
然後我們取k個,k的大小先取5,後面講解如何確定。
k = 5near = np.argsort(distinces)
topk = [y_train[i] for i in near[:k]]
topk就是只包括0和1的列表。
再計算0和1的個數,
dic = counter(topk)取最多的也就是第乙個,
final = dic.most_common(1)取**值
predict = final[0][0],結果不是1就是0,如果是1說明是惡性的,如果是0說明是良性的。四:完整**
import numpy as npimport matplotlib.pyplot as plt
from math import sqrt
from collections import counter
raw_data_x = [[1.232422,1.22324],
[2.324232,1.3224],
[2.3435353,2.3232342],
[3.434353,3.434353],
[4.54546,3.54544],
[7.42422,6.764353],
[6.42224534,7.533232],
[8.435353,8.5433],
[9.423534,9.422224],
[8.544444,9.4564454]]
raw_data_y=[0,0,0,0,0,1,1,1,1,1]
x_train = np.array(raw_data_x)
y_train = np.array(raw_data_y)
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='red')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='green')
plt.show()
x = np.array([5.4323213,6.433534454])
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='red')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='green')
plt.scatter(x[0],x[1],color='blue')
plt.show()
distinces = [sqrt(np.sum(i-x)**2) for i in x_train]
k = 5
near = np.argsort(distinces)
topk = [y_train[i] for i in near[:k]]
dic = counter(topk)
final = dic.most_common(1)
predict = final[0][0]
print(predict)
K 近鄰演算法 KNN
knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...
k近鄰演算法 kNN
核心思想 前k個最相似資料中出現次數最多的類別,作為新資料的類別。核心函式 計算距離函式,投票函式 coding utf 8 import random import sys from collections import counter from operator import itemgette...
K近鄰演算法 KNN
k近鄰演算法 knn 何謂k近鄰演算法,即k nearest neighbor algorithm,簡稱knn演算法,單從名字來猜想,可以簡單粗暴的認為是 k個最近的鄰居,當k 1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...