假設生活中你突然遇到乙個陌生人,你對他很不了解,但是你知道他喜歡看什麼樣的電影,喜歡穿什麼樣的衣服。根據以前你的認知,你把你身邊的朋友根據喜歡的電影型別,和穿什麼樣的衣服,簡單的分為了兩類,有錢的和沒錢的。那你該怎麼將這個陌生人分類呢?物以類聚,人以群分,你看他喜歡看的電影和穿衣服的衣服和那群人比較接近,然後你就把他歸為那類人,這就是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.有幾個類別就設幾個標籤用來統...