機器學習實戰(一) KNN

2021-08-15 08:16:20 字數 2588 閱讀 6637

knn演算法本身簡單有效,它是一種lazy-learning演算法,分類器不需要使用訓練集進行訓練,訓練時間複雜度為0。knn分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為n,那麼knn的分類時間複雜度為o(n)。

knn演算法不僅可以用於分類,還可以用於回歸。通過找出乙個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成正比。

該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的 k個鄰居中大容量類的樣本占多數。因此可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。該方法的另乙個不足之處是計算量較大,因為對每乙個待分 類的文字都要計算它到全體已知樣本的距離,才能求得它的k個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該 演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

knn演算法本身簡單有效,它是一種lazy-learning演算法,分類器不需要使用訓練集進行訓練,訓練時間複雜度為0。knn分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為n,那麼knn的分類時間複雜度為o(n)。

from numpy import *

import operator

def createdataset():

'''建立訓練集以及對應的分類標籤

:return: 返回集合和分類標籤

'''group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

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

return group, labels

def classify0(intx,dataset,labels,k):

'''k均值演算法分類器簡單實現

:param intx: 輸入待測樣本

:param dataset: 訓練集合

:param labels: 已知分類標籤

:param k: 最近的k個樣本點

:return: 返回待測樣本點的分類結果

'''# 獲取已知樣本行數

datasetsize = dataset.shape[0]

# tile 表示重複a 輸出,計算intx 與每個樣本的差值

diffmat = tile(intx,(datasetsize,1)) - dataset

# 每個值取平方

sqdiffmat = diffmat**2

print "sqdiffmat = %s" % sqdiffmat

# 歐式距離 axis=1 行之和,0 列之和

sqdistances = sqdiffmat.sum(axis=1)

print "sqdistances = %s" % sqdistances

# 開平方

distances = sqdistances**0.5

# 返回從小到大的索引值

sorteddistindieies = distances.argsort()

classcount = {}

# 取最近的k個樣本點

for i in range(k):

voteilabel = labels[sorteddistindieies[i]]

# 用字典儲存最近樣本點的次數

classcount[voteilabel] = classcount.get(voteilabel,0)+1

sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=true)

# 返回出現最高的那乙個分類

print sortedclasscount[0][0]

if '__main__==__name__':

dataset,labels = createdataset()

# print dataset

# print labels

classify0([0,0],dataset,labels,3)

結果:

sqdiffmat = [[ 1.    1.21]

[ 1. 1. ]

[ 0. 0. ]

[ 0. 0.01]]

sqdistances = [ 2.21 2. 0. 0.01]

b

該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的 k個鄰居中大容量類的樣本占多數。因此可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。該方法的另乙個不足之處是計算量較大,因為對每乙個待分類的文字都要計算它到全體已知樣本的距離,才能求得它的k個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該 演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

機器學習實戰 kNN

一 演算法過程 1 首先存在乙個資料集作為訓練樣本集dataset,比如訓練樣本的資料中,每一條資料都包含乙個城市的某一天空氣中的pm2.5,no2濃度等維度的特徵值。每一條資料同時包含乙個標籤,比如這一天的空氣質素是優,良,輕度汙染,中度汙染,重度汙染中的乙個。2 現在我們輸入一條資料inx,如包...

機器學習實戰 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個最相似的...