概述:k-近鄰演算法採用測量不同特徵值之間的距離方法進行分類
長處:精度高、對於異常值不敏感。無資料輸入假定
缺點:計算複雜度高,空間複雜度高,而且它沒有辦法各處基礎資料的一些內部資訊資料。
演算法描寫敘述:存在乙個準確的資料集合樣本。稱作訓練樣本集,樣本集合中每乙個item都附帶自己所屬分類標籤。當須要推斷新資料的分類是,僅僅須要計算特徵資料和樣本資料中最類似的分類標籤,選擇k個最類似的標籤,k個標籤中佔比最多的即為目標標籤。
#-*- coding=utf-8 -*-
from numpy import *
import operator
##簡單的knn演算法實現
#dataset是訓練資料集合。每行代表每乙個訓練資料的每乙個特徵值
#labels 相應dataset每乙個訓練資料的class標籤
#inx 表示待分類的特徵資料
defclassify0
(inx, dataset, labels, k):
datasetsize = dataset.shape[0] # 獲取測試集合大小
#求每乙個輸入特徵值和每乙個測試集合總的特徵值的超時
#首先須要使用tile將特徵值擴充套件為和測試集合相等大小的矩陣
diffmat = tile(inx, (datasetsize, 1)) - dataset
#取平方
sqldiffmat = diffmat ** 2
summat = sqldiffmat.sum(axis=1)
distances = summat ** 0.5
#獲取排序資訊
#比如:array([9,1,3,0]) -> array([3,1,2,0]) 公升序標籤
sortindicies = distances.argsort()
classcount = {}
#取距離最小的前k個相應的標籤統計資訊
for i in range(k):
label = labels[sortindicies[i]]
classcount[label] = classcount.get(label,0) + 1
#取最大的
sortedclasscount = sorted(classcount.iteritems(), key = operator.itemgetter(1), reverse=true)
return sortedclasscount[0][0]
不同的特徵,詳細的資料值波動區間是不同的,比如特徵a取值範圍在[1000,10000],可是特徵b取值範圍在[0,10],假設直接使用這種特徵資料進行knn演算法運算。會出現的乙個問題,高區間的特徵對結果的影響遠遠大於低區間的特徵值,因此我們須要對我們的特徵資料做歸一化處理,即將全部特徵值處理到同樣的區間範圍中。
詳細演算法:((特徵值-min)/(max - min)) -> [0,1]區間範圍
from numpy import *
import operator
#用於將乙個不同範圍域的特徵值歸一化到統一的[0,1]之間
defnormdata
(dataset):
#獲取每乙個特徵的最大值
maxvalue = dataset.max(0)
#獲取每乙個特徵的最小值
minvalue = dataset.min(0)
ranges=maxvalue-minvalue
#將資料歸一到同乙個範圍
normaldataset = zeros(shape(dataset))
m = dataset.shape[0]
normaldataset = dataset - tile(ranges,(m,1))
#除於最大值
normaldataset = normaldataset/tile(maxvalue,(m,1))
return normaldataset, ranges, minvalues
怎樣判別我們取得的特徵資料集合適合使用knn進行分類訓練?
在做資料觀察時我們往往須要通過視覺化方式去觀察我們的特徵資料和label的分布,這個時候就須要用到python的乙個圖形工具matplotlib。
特徵和分類資料:testset.txt
3.542485 1.977398 -1
3.018896 2.556416 -1
7.551510 -1.580030 1
2.114999 -0.004466 -1
8.127113 1.274372 1
7.108772 -0.986906 1
8.610639 2.046708 1
2.326297 0.265213 -1
3.634009 1.730537 -1
0.341367 -0.894998 -1
3.125951 0.293251 -1
2.123252 -0.783563 -1
0.887835 -2.797792 -1
7.139979 -2.329896 1
1.696414 -1.212496 -1
8.117032 0.623493 1
8.497162 -0.266649 1
4.658191 3.507396 -1
8.197181 1.545132 1
1.208047 0.213100 -1
1.928486 -0.321870 -1
2.175808 -0.014527 -1
7.886608 0.461755 1
3.223038 -0.552392 -1
3.628502 2.190585 -1
7.407860 -0.121961 1
7.286357 0.251077 1
視覺化指令碼:
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
##read file
fr = open('testset.txt')
lines = fr.readlines()
dataset = zeros((len(lines),1))
labels =
index = 0
forline
inlines:
items = line.strip().split('\t')
dataset[index:] = items[0:2]
#matplot
fx = plt.figure()
ax = fx.add_subplot(111)
#將陣列轉換為矩陣
dataset = matrix(dataset)
colora = tile(50, len(lines))
#這裡的colora是為了通過顏色區分不同的labels, cmap代表顏色map,預設是yard, s是每乙個點的大小,alpha是每乙個點的透明度
ax.scatter(dataset[:,0], dataset[:,1], c=colora * labels, cmap='autum', s=50, alpha=0.3)
plt.show()
機器學習鄰近演算法(KNN)
臨近演算法 臨近演算法 knn 是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表,knn方法既可以做分類,也可以做回歸。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬...
機器學習 KNN鄰近演算法
1 knn 演算法概述 cover和hart在1968年提出了最初的鄰近演算法。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。knn是一種分類 classification 演算法,它輸入基於例項的學習 instance based learning 屬於懶...
機器學習 K 鄰近演算法 KNN
k 鄰近演算法 有監督演算法 演算法工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每乙個特徵與樣本集中資料對應的特徵進行比較,然後演算法提供樣本集中特徵最相似資料 最鄰近 的分類標...