機器學習實戰 kNN

2021-08-04 14:26:20 字數 1968 閱讀 2576

一 演算法過程:

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乙個機器學習的演算法開心。...