1. 程式人生 > >KNN(K-Nearest Neighbor)演算法Matlab實現

KNN(K-Nearest Neighbor)演算法Matlab實現

KNN(K-Nearest Neighbor)演算法即K最鄰近演算法,是實現分類器中比較簡單易懂的一種分類演算法。K臨近之所以簡單是因為它比較符合人們直觀感受,即人們在觀察事物,對事物進行分類的時候,人們最容易想到的就是誰離那一類最近誰就屬於哪一類,即俗話常說的“近朱者赤,近墨者黑”,人們自然而然地把這種觀察方式延伸到資料分類處理領域。K-NN演算法就是基於歐幾里得距離推斷事物類別的一種實現方法。

KNN演算法

KNN演算法中K指的是尋找距離測試樣本最近的訓練集元素個數。

一、KNN演算法描述如下:

1、初始化訓練集和類別;

2、計算測試集樣本與訓練集樣本的歐氏距離;

3、根據歐氏距離大小對訓練集樣本進行升序排序;

4、選取歐式距離最小的前K個訓練樣本,統計其在各類別中的頻率;

5、返回頻率最大的類別,即測試集樣本屬於該類別。

二、Matlab程式碼實現

在理解了演算法步驟之後,就能很容易地實現演算法,Matlab作為一種研究資料的優秀工具,是實現和理解這個演算法不錯的選擇。

%實現KNN演算法
%%演算法描述
%1、初始化訓練集和類別;
%2、計算測試集樣本與訓練集樣本的歐氏距離;
%3、根據歐氏距離大小對訓練集樣本進行升序排序;
%4、選取歐式距離最小的前K個訓練樣本,統計其在各類別中的頻率;
%5、返回頻率最大的類別,即測試集樣本屬於該類別。
close all;
clc;

%%演算法實現
%step1、初始化訓練集、測試集、K值
%建立一個三維矩陣,二維表示同一類下的二維座標點,第三維表示類別

trainData1=[0 0;0.1 0.3;0.2 0.1;0.2 0.2];%第一類訓練資料
trainData2=[1 0;1.1 0.3;1.2 0.1;1.2 0.2];%第二類訓練資料
trainData3=[0 1;0.1 1.3;0.2 1.1;0.2 1.2];%第三類訓練資料
trainData(:,:,1)=trainData1;%設定第一類測試資料
trainData(:,:,2)=trainData2;%設定第二類測試資料
trainData(:,:,3)=trainData3;%設定第三類測試資料

trainDim=size(trainData);%獲取訓練集的維數

testData=[1.6 0.3];%設定1個測試點

K=7;

%%分別計算測試集中各個點與每個訓練集中的點的歐氏距離
%把測試點擴充套件成矩陣
testData_rep=repmat(testData,4,1);
%設定三個二維矩陣存放測試集與測試點的擴充套件矩陣的差值平方

%diff1=zero(trainDim(1),trianDim(2));
%diff2=zero(trainDim(1),trianDim(2));
%diff3=zero(trainDim(1),trianDim(2));

for i=1:trainDim(3)
    diff1=(trainData(:,:,1)-testData_rep).^2;
    diff2=(trainData(:,:,2)-testData_rep).^2;
    diff3=(trainData(:,:,3)-testData_rep).^2;
end

%設定三個一維陣列存放歐式距離
distance1=(diff1(:,1)+diff1(:,2)).^0.5;
distance2=(diff2(:,1)+diff2(:,2)).^0.5;
distance3=(diff3(:,1)+diff3(:,2)).^0.5;

%將三個一維數組合成一個二維矩陣
temp=[distance1 distance2 distance3];
%將這個二維矩陣轉換為一維陣列
distance=reshape(temp,1,3*4);
%對距離進行排序
distance_sort=sort(distance);
%用一個迴圈尋找最小的K個距離裡面那個類裡出現的頻率最高,並返回該類
num1=0;%第一類出現的次數
num2=0;%第二類出現的次數
num3=0;%第三類出現的次數
sum=0;%sum1,sum2,sum3的和
for i=1:K
    for j=1:4
        if distance1(j)==distance_sort(i)
            num1=num1+1;
        end
        if distance2(j)==distance_sort(i)
            num2=num2+1;
        end
        if distance3(j)==distance_sort(i)
            num3=num3+1;
        end
    end
    sum=num1+num2+num3;
    if sum>=K
        break;
    end
end

class=[num1 num2 num3];

classname=find(class(1,:)==max(class));

fprintf('測試點(%f %f)屬於第%d類',testData(1),testData(2),classname);

%%使用繪圖將訓練集點和測試集點繪畫出來
figure(1);
hold on;
for i=1:4
    plot(trainData1(i,1),trainData1(i,2),'*');
    plot(trainData2(i,1),trainData2(i,2),'o');
    plot(trainData3(i,1),trainData3(i,2),'>');
end
plot(testData(1),testData(2),'x');
text(0.1,0.1,'第一類');
text(1.1,0.1,'第二類');
text(0.1,1,'第三類');
三、測試結果

對於測試點testData=[1.6 0.3],測試結果如下:

圖中,星形表示第一類訓練樣本點,圈兒代表第二類訓練樣本點,三角形代表第三類訓練樣本點,x代表測試樣本點;

測試點(1.600000 0.300000)屬於第2類>> 


將測試點改為:testData=[0.1 0.4],執行結果如下:

測試點(0.100000 0.400000)屬於第1類>> 


將測試點改為:testData=[0.3 1.2],測試結果如下:

測試點(0.300000 1.200000)屬於第3類>> 


經過測試,可以看出KNN能夠很好的實現樣本分類功能,並且理解簡單容易,對於初學分類器的開發者而言,KNN是一個很好的選擇!

相關推薦

KNN(K-Nearest Neighbor)演算法Matlab實現

KNN(K-Nearest Neighbor)演算法即K最鄰近演算法,是實現分類器中比較簡單易懂的一種分類演算法。K臨近之所以簡單是因為它比較符合人們直觀感受,即人們在觀察事物,對事物進行分類的時候,人們最容易想到的就是誰離那一類最近誰就屬於哪一類,即俗話常說的“近朱者赤,

k近鄰演算法(k-nearest neighbor)和python 實現

1、k近鄰演算法 k近鄰學習是一種常見的監督學習方法,其工作機制非常簡單:給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這K個"鄰居"的資訊來進行預測。 通常,在分類任務中可使用"投票法",即選擇這K個樣本中出現最多的類別標記作為預測結果;在迴歸任務中可使用"平

KNN(k-nearest neighbor的縮寫)最近鄰演算法原理詳解

k-最近鄰演算法是基於例項的學習方法中最基本的,先介紹基於例項學習的相關概念。 基於例項的學習 已知一系列的訓練樣例,很多學習方法為目標函式建立起明確的一般化描述;但與此不同,基於例項的學習方法只是簡單地把訓練樣例儲存起來。 從這些例項中泛化的工作被推遲到必須分類新的例

演算法knn 擴充套件 BBF演算法,在KD-tree上找KNN ( K-nearest neighbor)

Step1: BBF演算法,在KD-tree上找KNN。第一步做匹配咯~ 1.       什麼是KD-tree(from wiki) K-Dimension tree,實際上是一棵平衡二叉樹。 一般的KD-tree構造過程: function kdtree (list

機器學習演算法kNN(K-Nearest Neighbor)最鄰近規則分類

KNN最鄰近規則,主要應用領域是對未知事物的識別,即判斷未知事物屬於哪一類,判斷思想是,基於歐幾里得定理,判斷未知事物的特徵和哪一類已知事物的的特徵最接近; K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器

KNN(k-nearest neighbor algorithm)--從原理到實現

零.廣告         本文所有程式碼實現均可以在 DML 找到,不介意的話請大家在github裡給我點個Star 一.引入  K近鄰演算法作為資料探勘十大經典演算法之一,其演算法思想可謂是intuitive,就是從訓練集裡找離預測點最近的K個樣本來預測分類      

MachineLearning— (KNN)k Nearest Neighbor實現手寫數字識別(三)

    本篇博文主要結合前兩篇的knn演算法理論部分knn理論理解(一)和knn理論理解(二),做一個KNN的實現,主要是根據《機器學習實戰》這本書的內容,一個非常經典有趣的例子就是使用knn最近鄰演算法來實現對手寫數字的識別,下面將給出Python程式碼,儘量使用詳盡的解

kNN(K-Nearest Neighbor)最鄰近規則分類

K最近鄰分類演算法 方法的思路:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於這一類別,則該樣本也屬於這個類別。KNN演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分類樣本所屬的類

K最近鄰(KNN,k-Nearest Neighbor)準確理解

用了之後,發現我用的都是1NN,所以查閱了一下相關文獻,才對KNN理解正確了,真是丟人了。 左圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果K=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果K=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。

MachineLearning— (KNN)k Nearest Neighbor之最近鄰法原理舉例理解(一)

K近鄰法(k-nearest neighbor)是機器學習當中較為簡單理解的一種基本分類與迴歸方法,KNN輸入的是例項的特徵向量,也就是特徵空間上的點;輸出的是其對應的類別標籤,KNN的訓練資料集的

我的人工智慧之旅——近鄰演算法KNNK-Nearest Neighbor

在影象識別中,影象分類是首要工作。因為需要將不同型別的影象先進行排除。近鄰演算法是最簡單的演算法之一,但由於其弊端的存在,本篇只做瞭解性的簡單介紹, K近鄰演算法的實質 將測試圖片在已經分類好的,具有不同標籤的訓練資料圖片中,找到K張最相似的圖片,進而根據K張圖片中型別的比例大小,推斷圖

機器學習實戰(一)k-近鄰演算法kNNk-Nearest Neighbor

目錄 0. 前言 簡單案例 學習完機器學習實戰的k-近鄰演算法,簡單的做個筆記。文中部分描述屬於個人消化後的理解,僅供參考。 如果這篇文章對你有一點小小的幫助,請給個關注喔~我會非常開心的~ 0. 前言 k-近鄰演算法kNN(k-Neare

4.1 最鄰近規則分類(K-Nearest NeighborKNN演算法

1968年提出的分類演算法 輸入基於示例的學習(instance-based learning),懶惰學習(lazy learning) 例子: 演算法詳述步驟: 為了判斷未知例項類別,用所有已知類別的例項作為參照 選擇引數k 計算未知例項與所有已知例項的距離 選擇

【深度學習基礎-04】最鄰近規則分類(K Nearest NeighborKNN演算法

1 基本概念 Cover和Hart在1968年提出了最初的臨近演算法 分類演算法classfication 輸入基於例項的學習instance-based learning ,懶惰學習lazy learning 2 例子:    &n

《機器學習實戰》k最近鄰演算法(K-Nearest Neighbor,Python實現)

============================================================================================ 《機器學習實

kNNk-nearest neighbor)理解與實現

一、理解   kNN三要素:k值選擇、距離度量、分類決策規則   流程:計算輸入例項與訓練集中各例項的距離,選出K個最近鄰訓練例項點,然後根據這K個點多數類進行分類。   k值選擇:k值選得過小意

k最近鄰演算法(K-Nearest Neighbor)理解與python實現

numpy 模組參考教程:http://old.sebug.net/paper/books/scipydoc/index.html 一:什麼是KNN演算法? kNN演算法全稱是k-最近鄰演算法(K-Nearest Neighbor) kNN演算法的核心思想是如果一個樣本在特

K近鄰(k-Nearest NeighborKNN演算法,一種基於例項的學習方法

1. 基於例項的學習演算法 0x1:資料探勘的一些相關知識脈絡 本文是一篇介紹K近鄰資料探勘演算法的文章,而所謂資料探勘,就是討論如何在資料中尋找模式的一門學科。 其實人類的科學技術發展的歷史,就一直伴隨著資料探勘,人們一直在試圖中資料中尋找模式, 獵人在動物遷徙的行為中尋找模式 農夫在莊稼的生

最鄰近規則分類(K-Nearest Neighbor)KNN算法

bubuko rev created 換行 差值 code 是否 clas 分隔 自寫代碼: 1 # Author Chenglong Qian 2 3 from numpy import * #科學計算模塊 4 import operat

機器學習實戰(一)k-近鄰kNNk-Nearest Neighbor

目錄 0. 前言 1. k-近鄰演算法kNN(k-Nearest Neighbor) 2. 實戰案例 2.1. 簡單案例 2.2. 約會網站案例 2.3. 手寫識別案例 學習完機器學習實戰的k-近鄰演算法,簡單的做個筆記。文中