手推演算法 KNN總結

2022-08-02 20:24:13 字數 2961 閱讀 7133

k近鄰演算法,即k-nearest neighbor algorithm,簡稱knn演算法,可以根據字面意思理解為:k個最近的鄰居。因為k近鄰是分類演算法,找到最近的鄰居就能知道自己所在的類別。

k近鄰用於解決分類問題。因為需要計算特徵之間的距離,所以需要將資料集中的特徵資料變成數值型和標稱型。

1.計算出當前未知型別樣本點與訓練集中所有點的距離(歐氏距離);

2.按照距離大小,將訓練集中的點遞增排序;

3.選取前k個樣本點,計算出前k個樣本每個類別出現的頻率;

4.頻率最高的類別即為當前未知樣本**分類;

由於此演算法是計算未知樣本與每乙個訓練點的距離,所以時間複雜度為o(n),之後將學習kd-tree,以降低時間複雜度

import numpy as

npimport pandas

aspd

import

operator

def create_dataset():

# 四組二維

x = np.array([[1,101],[5,89],[108,5],[155,8

]]) y = ['

愛情片', '

愛情片', '

動作片', '

動作片'

]

return x, y

引數說明:   test為測試樣本(乙個向量);

train為訓練集(訓練樣本的特徵組成的矩陣);

labels為標籤(訓練集中每乙個樣本對應的型別組成的向量);

k為引數,表示選取距離最近的k個樣本

函式說明:   train為[[1,101],[5,89],[108,5],[115,8]],

test為1個樣本[10,45],

這裡的操作是將test平鋪成[[10,45],[10,45],[10,45],[10,45]],

這樣一來,train和test相減得到的矩陣,就可以用於我們計算測試樣本到每乙個訓練樣本的距離

def

knn(test,train,labels,k):

num_train_samples =train.shape[0]

test = np.tile(test,(num_train_samples,1)) #

np.tile將test複製num_train_samples行 複製1列

diff_set = train-test

distance = np.sqrt((diff_set ** 2).sum(axis=1)) #

sum(axis=1)表示每一行的所有列求和

sorted_distance_indicies = np.argsort(distance) #

返回陣列 [1,0,2,3] 表示下標為1的元素值最小,其次是0,以此類推

class_count = {} #

該字典用來存錢k個元素的類別,以及出現次數

for i in

range(k):

label =labels[sorted_distance_indicies[i]]

#dict.get(key,default=none) #字典的get方法返回指定鍵的值,如果不在字典中返回預設0

class_count[label] = class_count.get(label,0)+1

print

(class_count[label])

#字典按照value值 降序排列

#key = operator.itemgetter(1) 根據字典的值進行排序

#key = operator.itemgetter(0) 根據字典的鍵進行排序

#reverse 降序排序字典

sorted_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=true) #

如[('愛情片', 2), ('動作片', 1)]

return sorted_class_count[0][0]

train,labels =create_dataset()

test = [50,10]

knn(test,train,labels,k=3)

kd tree演算法介紹knn如何選擇合適的k值: 如果選擇較小的k值,就相當於用較小的鄰域內的樣本點進行**,如果碰巧裡面雜訊較多,**結果就會出錯,導致過擬合;           

推薦方法: step 1:用交叉驗證法,將樣本集分為訓練集和驗證集(如隨機分成5份,4份用於訓練,1份用於驗證),輪流選取乙份當驗證集,其餘幾份用來訓練, 統計每一輪的正確率,累計求均值,得到的結果即為當前k值的分類準確率;

step 2:更換k值,重複step 1,最終選取平均**準確率最高的k值作為模型的k值

knn 演算法的優缺點: 1.優點:

(1) 理論成熟,思想簡單,可處理數值型或者離散型資料,既可以用來做分類也可以用來做回歸

(2) 可用於非線性分類(線性不可分的樣本集)

(3) 訓練時間複雜度比支援向量機之類的演算法低,僅為o(n),kd-tree為o(log n)

(4) 受異常值(離群點)的影響小

2.缺點:

(1) 計算量大,尤其是特徵數非常多的時候

(2) 樣本分佈不平衡的時候,對於小類別的**準確性低

(3) 使用懶散學習方法,基本上不學習,每次**都要計算一遍在樣本集中的最鄰近點

KNN演算法總結

總體 分類演算法 有目標值,離散型 乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。k 本身取值對演算法有影響,又不能通過演算法訓練確定值的變數叫做超引數 距離 scikit learn 機器學習工具 k近鄰的sklearn的實現 skl...

星期推算法

通常我們只知道生活當天的前後幾天是星期幾,即便是翻日曆,也只能知道有限日期的星期數。那麼有沒有一種方法可以讓我們知道任何一天是星期幾呢?有,下面我將向大家介紹一種方法,用以編寫萬年曆的程式。首先我們必須約定一些法則,我們用y m d分別表示年 月 日,用數字0 6分別表示星期日 星期六,這樣我們就可...

K近鄰 KNN 演算法總結

knn演算法是選擇與輸入樣本在特徵空間內最近鄰的k個訓練樣本並根據一定的決策規則給出輸出結果。決策規則 分類任務 輸出結果為k個訓練樣本中佔大多數的類。回歸任務 輸出結果為k個訓練樣本值的平均值。如下圖的分類任務,輸出結果為w1類。k值的選擇 距離度量和分類決策規則是k近鄰演算法的三個基本要素。分類...