kNN分類器和Python演算法實現

2021-08-14 08:35:07 字數 3494 閱讀 9941

假設生活中你突然遇到乙個陌生人,你對他很不了解,但是你知道他喜歡看什麼樣的電影,喜歡穿什麼樣的衣服。根據以前你的認知,你把你身邊的朋友根據喜歡的電影型別,和穿什麼樣的衣服,簡單的分為了兩類,有錢的和沒錢的。那你該怎麼將這個陌生人分類呢?物以類聚,人以群分,你看他喜歡看的電影和穿衣服的衣服和那群人比較接近,然後你就把他歸為那類人,這就是knn演算法的思想。

那麼怎麼評判他和那類人比較接近呢?這就用到了「距離」的概念。首先你要把電影型別、和穿的衣服量化,轉化為可以進行計算的數字量。然後計算他的[電影型別、衣服品牌]和你原來分類中其餘個體的[電影型別、衣服品牌]之間的距離,從距離[d1,d2,d3....]中選取出k個最近的值,然後看這些距離中最多的分類是哪個。

這,就是knn分類的思想。

首先,我們先建立乙個訓練樣本,也就是已有的資料大類「a」和「b」,對應的點分別為a - [1.0 0.9] [1.0 1.0] 和b - [0.1 0.2 ] [0.0 0.1]

from numpy import *

def createdataset():

group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])

labels = ['a','a','b','b']

return group,labels

在這裡我們用歐式距離: d = sqrt((x1-x2)^2+(y1-y2)^2)來計算要分類的資料和樣本資料之間的「相近」程度。當然,選擇用什麼距離也是knn演算法的一大難點,這裡不做贅述。

首先我們按照歐氏距離的計算公式,用python表示出來

def euclidean(vec1, vec2):

# 將兩個向量轉化為array,以便計算座標的差

npvec1, npvec2 = array(vec1), array(vec2)

# 計算每個維度上差值平方根之和

return math.sqrt(((npvec1-npvec2)**2).sum()))

計算輸入資料和訓練資料中每個資料的歐式距離
def disvector(inx,dataset):

dis = #記錄距離

count = 0

#計算待分類資料和訓練集和中所有資料的距離

for i in dataset:

#print(i)

dis.insert(count,euclidean(inx,i))

count = count +1

return dis

下面,就按距離來進行分類

def classify(inx,dataset,labels,k):

distance = disvector(inx,dataset)

classified =

count = 0

# 初始化classified

for i in range(len(distance)):

for i in range(k):#distance和labels列表長度一樣

# 找到距離的最小值

count = distance.index(min(distance))

# 把最小值索引位置對應的+1

classified[count] = classified[count] +1

#把distance中的最小值移除,最小值變為次小值

distance = distance.remove(min(distance))

#把字典classified的鍵值

return labels[classified.index(max(classified))]

我們測試程式

dataset,labels = createdata()

a= [0.1,0.3]

class = classify(a,dataset,labels,1)

print(class)

結果為b 

當然,還有資料歸一化的問題,等等。以後再更新吧。

下面是原始碼:

from numpy import *

import os

import math

def createdataset():

group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])

labels = ['a','a','b','b']

return group,labels

def euclidean(vec1, vec2):

# 將兩個向量轉化為array

npvec1, npvec2 = array(vec1),array(vec2)

# 計算每個維度上差值平方根之和

return math.sqrt(((npvec1-npvec2)**2).sum())

def disvector(inx,dataset):

dis = #記錄距離

count = 0

#計算待分類資料和訓練集和中所有資料的距離

for i in dataset:

#print(i)

dis.insert(count,euclidean(inx,i))

count = count +1

return dis

def classify(inx,dataset,labels,k):

distance = disvector(inx,dataset)

classified =

count = 0

# 初始化classified

for i in range(len(distance)):

for i in range(k):#distance和labels列表長度一樣

# 找到距離的最小值

count = distance.index(min(distance))

# 把最小值索引位置對應的+1

classified[count] = classified[count] +1

#把distance中的最小值移除,最小值變為次小值

distance = distance.remove(min(distance))

#把字典classified的鍵值

return labels[classified.index(max(classified))]

dataset,labels = createdataset()

inx = [0.2,0.3]

print('訓練樣本為:',dataset)

print('標籤為:',dataset)

print('待分類樣本為:',inx)

print('分類結果為:',classify(inx,dataset,labels,1))

python最近鄰分類器KNN演算法

1.knn演算法 鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。k最近鄰 k nearest neighbor,knn 分類演算法的核心思...

Python 實現 KNN 分類演算法

2.python 實現 本文將詳細講述 knn 演算法及其 python 實現 knn k nearest neighbour 即 k最近鄰,是分類演算法中最簡單的演算法之一。knn 演算法的核心思想是如果乙個樣本在特徵空間中的 k 個最相鄰的樣本中的大多數屬於某乙個類別,則將該樣本歸為該類別 有 ...

python實現KNN分類演算法

k近鄰演算法,簡稱knn演算法,作用就是分類 三大要素 import numpy import matplotlib.pyplot as plt 已知訓練集和訓練集類別 測試集 1.測試集廣播和訓練集一樣的規格 2.計算距離 3.對距離列表排序返回最近的k個點的下標 4.有幾個類別就設幾個標籤用來統...