k近鄰演算法matlab實現 K 近鄰演算法(一)

2021-10-13 16:16:45 字數 3495 閱讀 9170

k-近鄰演算法是採用不同特徵之間的距離方法進行分類。

優點:精度高、對異常值不敏感、無資料輸入假定

缺點:計算複雜度高、空間複雜度高

k-近鄰演算法的一般流程

(1)收集資料集:可以使用任何方法

(2)準備資料集:距離計算所需要的數值,最好是結構化的資料格式

(3)分析資料:可以使用任何方法

(4)訓練資料集:此步驟不適用與k-近鄰演算法

(5)測試演算法:計算錯誤率

(6)使用演算法:首先需要輸入樣本資料和結構化輸出結果,然後執行k-近鄰演算法判斷輸入資料分別屬於那個分類,最後應用對計算出的分類執行後續的處理。

2.1.1 準備:使用python匯入資料

#createdataset()from numpy import *import operatordef createdataset():    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels=['a','a','b','b']    return group,labels
2.1.2 實施k-近鄰演算法

k-近鄰演算法的偽**:

對未知屬性集中的每個點依次執行以下操作:

(1)計算已知類別資料中心的點與當前點之間的距離

(2)按照距離遞增次序排序

(3)選取與當前點距離最最小的k個點

(4)確定當前k個點所在類別的出現頻率

(5)返回前k個點出現頻率最高的類別作為當前點的**分類

#k-近鄰演算法def classify0(inx,dataset,labels,k):    datasetsize=dataset.shape[0]#計算有多少個點    diffmat=tile(inx,(datasetsize,1))-dataset #計算歐氏距離    sqdiffmat=diffmat**2    sqdistance=sqdiffmat.sum(axis=1)    distances=sqdistance**0.5    sorteddistindicies=distance.argsort()    classcount={}    for i in range(k):    #選擇距離最小的k個點        voteilabel=labels[sorteddistindicies[i]]        classcount[voteilabel]=classcount.get(voteilabel,0)+1    sortedclasscount=sorted(classcount.iteritems(), #排序                           key=operator.itemgetter(1),reverse=true)    return sortedclasscount[0][0]
2.1.3 通過學習函式理解k-近鄰演算法

看了上述knn的實現,可能大家還是一頭霧水,因為其中用到了很多內嵌函式,所以下面我們就先來學習這些內嵌函式。

1.tile函式

函式形式是tile(a,reps)

a的型別幾乎所有型別都可以:array,list,tuple,dict,matrix以及基本的資料型別int,string,float,bool等。

reps的型別可以使tuple,list,dict,array,int,bool但不可以是float,string,matrix。

import numpynumpy.tile(1,(5,1))    array([[1],           [1],           [1],           [1],           [1]])numpy.tile(2,(5,2))array([[2, 2],           [2, 2],           [2, 2],           [2, 2],           [2, 2]])numpy.tile((3,2),(5,2)) array([[3, 2, 3, 2],           [3, 2, 3, 2],           [3, 2, 3, 2],           [3, 2, 3, 2],           [3, 2, 3, 2]])
2.shape函式

功能是讀取矩陣的長度,輸入引數可以是乙個整數表示維度,也可以是乙個矩陣。

舉例說明:

import numpyarray1 = numpy.tile(1,(3,2))array1    array([[1, 1],           [1, 1],           [1, 1]]) array1.shape    (3l, 2l) array1.shape[0]       #shape[0]表示第一維的長度 3larray1.shape[1]        #shape[1]表示第二維的長度2l
3.sum函式

sum(a,axis=0)或者sum(axis=1)

axis=0就是普通的相加,axis=1則是將乙個矩陣的每一行向量相加

舉例說明:

import numpyarray1 = numpy.tile(1,(3,2))array1array([[1, 1],           [1, 1],           [1, 1]]) array1.sum()array1.sum(axis=1) array([2, 2, 2])
4.argsort函式

返回陣列值從小到大的索引值

舉例說明:

import numpy as npx = np.array([3, 1, 2])np.argsort(x)    array([1, 2, 0], dtype=int64)x = np.array([[0, 3], [2, 2]])x    array([[0, 3],           [2, 2]])np.argsort(x, axis=0) #按列排序   array([[0, 1],           [1, 0]], dtype=int64)np.argsort(x, axis=1) #按行排序 array([[0, 1],           [0, 1]], dtype=int64)x = np.array([3, 1, 2])np.argsort(x) #按公升序排列array([1, 2, 0], dtype=int64)np.argsort(-x) #按降序排array([0, 2, 1], dtype=int64)
參考鏈結

《機器學習實戰》

python中的tile函式,shape函式,sum函式,argsort函式,python交流,技術交流區,魚c論壇 - powered by discuz!

(出處: 魚c論壇)

K近鄰的MATLAB實現

參考 1 計算已知類別資料集合彙總的點與當前點的距離 2 按照距離遞增次序排序 3 選取與當前點距離最近的k個點 4 確定距離最近的前k個點所在類別的出現頻率 5 返回距離最近的前k個點中頻率最高的類別作為當前點的 分類 function relustlabel knn inx,data,label...

Matlab實現加權K近鄰

加權k近鄰是k近鄰的一種修正,當理解k近鄰之後,加權k近鄰則很好理解了,不說了,上 function label1 wknn training,testing,k row,column size training row1,column1 size testing 計算測試集與訓練集的距離 dist...

MATLAB計算K近鄰

在實驗中經常會需要計算k近鄰,為了避免多次重寫,這裡用matlab實現了乙個計算k近鄰的函式,該函式要求輸入兩個引數,第乙個引數就是資料矩陣,要求每行為乙個多維樣本點,第二個引數就是k值了。函式返回k近鄰矩陣。計算k近鄰比較好的一種演算法是利用kd樹,這裡暫且用的是易於理解的常規方法。使用kd樹的 ...