K近鄰演算法 KNN

2022-05-09 03:39:07 字數 2940 閱讀 6445

一: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 = 5

near = 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 np

import 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時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...