一 演算法過程:
1 首先存在乙個資料集作為訓練樣本集dataset,比如訓練樣本的資料中,每一條資料都包含乙個城市的某一天空氣中的pm2.5,no2濃度等維度的特徵值。每一條資料同時包含乙個標籤,比如這一天的空氣質素是優,良,輕度汙染,中度汙染,重度汙染中的乙個。
2 現在我們輸入一條資料inx,如包含某一天的各項空氣引數。計算這一條資料inx中各個特徵的特徵值與樣本集dataset中各條資料之間的相似度或者距離(距離的演算法有很多種,這個例子中使用歐氏距離),並且將這些相似度/距離從小到大排序。
3 選擇排序後的距離中前k條樣本資料(k一般是不大於20的整數,這20怎麼來的?),提取這k個樣本集的標籤,統計這些標籤中出現次數最多的分類,作為我們輸入資料inx的分類。
簡單總結就是計算資料點與樣本集中的每乙個樣本點的相似度,選取前k個相似的資料最為樣本點的分類結果
二 演算法優缺點
knn演算法的輸入引數只有,樣本集dataset,樣本點inx,以及人為選取的k。因為輸入都是確定的引數,所以不需要訓練演算法。
(下面是參考《機器學習實戰》,還沒理解,後面待補充todo)
優點:精度高,對異常值不敏感,無資料輸入假定
缺點:計算複雜度高,空間複雜度高
三 python實踐
# -*- coding:utf-8 -*-
import numpy as np
import operator
defcreatedata
(): group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
lables = ['a','a','b','b']
return group,lables
defknn
(inx,dataset,lables,k):
#計算inx與各個點的距離
datasetsize = dataset.shape[0]
diffmat = np.tile(inx,(datasetsize,1)) - dataset
sqdiffmat = diffmat ** 2
sqdistance = sqdiffmat.sum(axis=1)
distance = sqdistance ** 0.5
#對所有點間的距離從小到大排序
sorteddistindecies = distance.argsort()#argsort()函式返回的是原陣列排序後的索引
#選取前k個距離,分別比較k個結果裡,inx各被分為什麼類
clascount = {}
for i in range(k):
votelable = lables[sorteddistindecies[i]]
clascount[votelable] = clascount.get(votelable,0)+1
sortedclasscount = sorted(clascount.iteritems(),key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
if __name__ == '__main__':
group,lables = createdata()
result = knn((1,1.1),group,lables,3)
print
'分類結果為' + result + '類'
四 利用knn對空氣質素分類
dataset:
特徵:aqi指數 當天aqi排名 pm2.5 pm10 no2 so2 co o3
特徵值:77 146 56 77 40 9 1.27 40
特徵值:76 186 55 75 47 12 1.40 14
lables: 優 良 輕度汙染 中毒汙染 重度汙染
機器學習實戰 KNN
import numpy as np import operator def createdataset group np.array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a a b b return group,labels def classify0 inx,dat...
機器學習實戰 kNN
k 近鄰演算法 knn k nearest neighbors 測量不同特徵值之間的距離方法進行分類。有乙個樣本資料集 每個樣本都存在標籤 輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,提取樣本集中特徵最相似資料 最近鄰 的分類標籤。一般,只選擇樣本資料中前k個最相似的...
機器學習實戰 kNN演算法
今天看了第乙個機器學習演算法 k 鄰近演算法。大概意思就是,先根據已有分劃分好類別的資料集,然後輸入新的資料向量,就計算與資料集裡各個向量的距離,排序找到前k個資料,統計前k資料中各個類別 標籤 出現的次數,最多的那個類別 標籤 就是輸入向量所屬的類別,然後返回。哈哈get乙個機器學習的演算法開心。...