一、算法概述
1、kNN算法又稱為k近鄰分類(k-nearest neighbor classification)算法。kNN算法則是從訓練集中找到和新數據最接近的k條記錄,然後根據他們的主要分類來決定新數據的類別。該算法涉及3個主要因素:訓練集、距離或相似的衡量、k的大小。
計算步驟如下:
1)算距離:給定測試對象,計算它與訓練集中的每個對象的距離
2)找鄰居:圈定距離最近的k個訓練對象,作為測試對象的近鄰
3)做分類:根據這k個近鄰歸屬的主要類別,來對測試對象分類
2、距離或相似度的衡量
什麼是合適的距離衡量?距離越近應該意味著這兩個點屬於一個分類的可能性越大。距離衡量包括歐式距離、夾角餘弦等。
3、類別的判定
投票決定:少數服從多數,近鄰中哪個類別的點最多就分為該類。
加權投票法:根據距離的遠近,對近鄰的投票進行加權,距離越近則權重越大(權重為距離平方的倒數)
clear;clc;K=3;trainData = [1.0,2.0; 1.2,0.1; 0.1,1.4; 0.3,3.5];trainClass = [1,1,2,2];testData = [0.5,2.3];
[N,M]=size(trainData);%計算訓練數據集與測試數據之間的歐氏距離distdist=zeros(N,1);for i=1:N dist(i,:)=norm(trainData(i,:)-testData);end%將dist從小到大進行排序[Y,I]=sort(dist,1);%將訓練數據對應的類別與訓練數據排序結果對應trainClass=trainClass(I);%確定前K個點所在類別的出現頻率classNum=length(unique(trainClass));%取集合中的單值元素的個數labels=zeros(1,classNum);for i=1:K j=trainClass(i); labels(j)=labels(j)+1;end%返回前K個點中出現頻率最高的類別作為測試數據的預測分類[~,idx]=max(labels);fprintf('該測試數據屬於類 %d\n',idx);
%% f方法二更簡單labels=trainClass;idx=mode(labels(1:K));%mode函數求眾數fprintf('該測試數據屬於類 %d ',idx);