1. 程式人生 > >KNN分類——matlab(轉載)

KNN分類——matlab(轉載)

K-最近鄰分類方法(KNN,k-nearest-neighbor classifier)是一種惰性學習法,所謂惰性就是KNN不像一些演算法(比如SVM)一樣在接收待分類資料前就已經根據訓練資料構造好了分類模型,而是會在接受到訓練資料後,只是對訓練資料進行簡單的儲存,並不構造分類模型,在接受到待分類資料時,KNN通過計算待分類資料X與所有訓練資料之間的距離,選擇前K個距離X最近的資料,並將這K個距離最近的資料中出現次數最多的類屬性賦給X。如下圖所示,判斷圖中待分類資料綠色圓點的分類情況:
這裡寫圖片描述
當K取3時,此時離待分類資料綠色圓點最近的5個數據中,包含2個紅色三角和1個藍色四邊形,出現次數多的紅色三角的類屬性將會賦給此待分類資料。
當K取5時,此時離待分類資料綠色圓點最近的5個數據中,仍包含2個紅色三角,但是藍色四邊形數目增加到3個,3>2,所以,出現次數多的藍色四邊形的類屬性將會賦給此待分類資料。

knnclassify函式
在matlab中,關於KNN分類的函式為knnclassify,Class=knnclassify(Sample,Training,Group,k,distance,rule),其中輸入引數分別為
1、Sample:待分類資料,其列數(特徵數)要與訓練資料相同。
2、Training:訓練資料,M*N,M(行)為資料個數,N(列)為特徵數。
3、Group:訓練資料所對應的類屬性。
4、k:分類中,最近鄰的個數,預設為1.
5、distance:計算資料間距離的方法,有以下幾種選擇:
(1)euclidean:歐幾里得距離(預設值)
(2)cityblock:曼哈頓(或城市塊)距離
(3)cosine:餘弦距離
(4)correlation:相關距離
(5)hamming:海明距離
這些距離方式實際上是採用不同的函式來計算兩個資料物件之間的距離,例如:
對於兩個被p個特徵描述的資料物件 i=(Xi1,Xi2,……,Xip)和j=(Xj1,Xj2,……,Xjp),他們的歐幾里得距離為:

d(i,j)=(Xi1Xj1)2+(Xi2Xj2)2+......+(XipXjp)2
他們的曼哈頓(或城市塊)距離為:
d(i,j)=|Xi1Xj1|+|Xi2Xj2|+......+|XipXjp|
6、rule:確定類屬性的規則,有以下幾種選擇:
(1) nearest : 最近的K個的最多數(預設值)
(2) random : 隨機的最多數
(3) consensus: 投票法
測試實驗

(1)選取k=1,diatance=’cityblock’,rule=’nearest’
function [ classfication ] = KNN2_1( train,test )
%使用matlab自帶的關於花的資料進行二分類實驗(150*4),其中,每一行代表一朵花,
%共有150行(朵),每一朵包含4個屬性值(特徵),即4列。且每1-5051-100
%101-150資料分別為同一類,分別為setosa青風藤類,versicolor雲芝類,virginica錦葵類

load fisheriris                       %下載資料包含:meas(150*4花特徵資料)
                                  %和species(150*1 花的類屬性資料) 

meas=meas(1:100,1:2)                    %選取前兩類前兩個屬性進行分類 
train=[(meas(1:40,:));(meas(51:90,:))]; %選取資料中每類對應的前40個作為訓練資料
test=[(meas(41:50,:));(meas(91:100,:))];%選取資料中每類對應的後10個作為測試資料
trainGroup=[ones(1,40),2*ones(1,40)]';       %類屬性設定為1,2
testGroup=[ones(1,10),2*ones(1,10)]';

%KNN分類
class=knnclassify(test,train,trainGroup,1,'cityblock','nearest');
%用plot顯示出測試資料分類結果
testGroup=[ones(1,10),2*ones(1,10)]'; 
figure;
hold on;
plot(testGroup,'o');
plot(class,'*');
legend('測試集正確分類','KNN分類結果');
disp(class);
%計算分類測試的準確率%正確的分類情況為testGroup,實驗測試獲得的分類情況為class%計算分類精度
count=0;
fori=(1:20)
   if class(i)==testGroup(i)
      count=count+1;
   endend
fprintf('分類精度為:%f\n' ,count/20);

end

實驗結果
這裡寫圖片描述
這裡寫圖片描述

當改變knnclassify函式引數為:k=5,distance=’euclidean’,rule=’nearest’時,獲得的實驗結果如下圖:
這裡寫圖片描述
這裡寫圖片描述
主要存在的問題
KNN分類法最大的優點是思想簡單,容易理解,並且不需要訓練分類模型,同時,對於多分類問題,KNN分類較其他方法也更簡單,還是一樣的根據距離來判斷。
雖然KNN不需要訓練模型,但其在對資料分類時的計算量卻很大,因為每一個待分類的資料與訓練資料的距離都要計算,並且當訓練資料中各類別資料的個數差距較大時,在類別判定時,由於某類的資料個數太多,在總體訓練資料中分佈比較密集,對於一個待分類的資料來說,在它的K個最近鄰居中,資料個數多的類別更容易佔優勢,從而影響了分類結果。再有就是K值得選擇問題,如果K值太小,得到的最近鄰資料太少,對分類精度會有影響,如果K值太大,那麼像上面所說的‘各類別資料個數差距較大而影響分類結果’的問題就會被放大。
改進 (1)對於計算量大的問題,我們可以通過減少特徵個數,只選擇部分區別性能強的特徵來作為分類資料的特徵值,再有就是由於計算距離時,需要計算待分類資料與所有訓練資料的距離,我們還可以減少訓練資料的數量,只保留部分與分類相關較大的訓練資料。 (2)再有就是在計算距離時,通過對不同的特徵設定不同的權重值,對不同距離的鄰居設定不同的權重值的方法來改進KNN方法中所有特徵對距離的作用相同的缺陷以及不同距離的鄰居對類別的判定作用相同的缺陷。 (3)K值得選擇,很大程度影響分類的效果,可以採用交叉檢驗來確定K值。

相關推薦

KNN分類——matlab轉載

K-最近鄰分類方法(KNN,k-nearest-neighbor classifier)是一種惰性學習法,所謂惰性就是KNN不像一些演算法(比如SVM)一樣在接收待分類資料前就已經根據訓練資料構造好了分類模型,而是會在接受到訓練資料後,只是對訓練資料進行簡單的儲存,並不構造分類模型,在接受到待分類資料時

PCA 主成分分析詳解 寫給初學者 結合matlab轉載

整數 變量 行為 保持 sum osc 入參 函數 data 一、簡介 PCA(Principal Components Analysis)即主成分分析,是圖像處理中經常用到的降維方法,大家知道,我們在處理有關數字圖像處理方面的問題時,比如經常用的圖像的查詢

轉載matlab常用字符串處理函數

class 字符串排序 否則 比較 sds 處理 find let 獲取字符串 來源:Matlab中文論壇 % 字符串處理 a=‘ a‘;b=‘b b‘;c=‘cccc‘;m=‘‘ % 獲取字符串長度 length(a) % 連接兩個字符串,每個字符串最右邊的空

matlab和c++混合程式設計---matlab和vs的環境配置問題及方法和步驟轉載

matlab和c++混合程式設計---方法和步驟 matlab和c++混合程式設計---matlab和vs的環境配置問題 摘要:Matlab具有很強的數值計算和分析等能力,而C/C++是目前最為流行的高階程式設計語言,兩者互補結合的混合程式設計在科學研究和工程實踐中具有非常重要的意義。從Matlab呼叫C

Matlab記憶體管理/調優/優化問題轉載

感謝原文博主,因無法轉載,所以直接copy過來了: 以下為正文: 用 Matlab 進行大規模科學計算或模擬時,記憶體是一個需要時常注意的問題。在matlab裡執行 >>system_dependent memstats 就可以看到記憶體的使用狀況。當你寫

matlab 中 gradient函式計算影象梯度原理轉載

原文:http://blog.sina.com.cn/s/blog_53683dc20102v9f4.html Matlab中影象梯度的計算方式 轉載 2015-03-27 16:08:42 在matlab中可以使用gradient來計算一幅影象的梯度,它的計算方式是這樣的:

目前主流微控制器分類轉載

微控制器現在可謂是鋪天蓋地,種類繁多,讓開發者們應接不暇,發展也是相當的迅速,從上世紀80年代,由當時的4位8位發展到現在的各種高速微控制器……目前已投放市場的主要微控制器產品多達70 多個系列,500多個品種。這其中還不包括那些系統或整機廠商定製的專用微控制器,及針對專門業務、專門市場的微

樸素貝葉斯演算法實現分類問題三類matlab程式碼

資料簡介 本訓練資料共有625個訓練樣例,每個樣例有4個屬性x1,x2,x3,x4,每個屬性值可以取值{1,2,3,4,5}。 資料集中的每個樣例都有標籤"L","B"或"R"。 我們在這裡序號末尾為1的樣本當作測試集,共有63個,其他的作為訓練集,共有562個。 下

Matlab記憶體問題轉載

用 Matlab 進行大規模科學計算或模擬時,記憶體是一個需要時常注意的問題。在matlab裡執行>>system_dependent memstats就可以看到記憶體的使用狀況。當你寫的 Matlab 程式跳出“Out of Memory” 時,以下幾點措施是

Caffe matlab之基於Alex network的特徵提取轉載

R-CNN是第一篇成功得將CNN用於object detection並取得優異效果的文章,是學習CNN for object detection的必讀文章。R-CNN中提到Alex network可以用作一個“黑匣子”來提取特徵,CV中的很多問題都需要尋找特徵,如果直接試試利用Alex network去做

MATLAB 字串處理 轉載

% 字串處理 a=’ a’;b=’b b’;c=’cccc’;m=” % 獲取字串長度 length(a) % 連線兩個字串,每個字串最右邊的空格被裁切 d=strcat(a,c) length(d) % 連線多行字串,每行長度可

Matlab影象識別/檢索系列(7)-10行程式碼完成深度學習網路之取中間層資料作為特徵轉載

現在,大家都意識到深度神經網路在影象特徵提取方面具有很強的能力,儘管其解釋性不強,儘管人們對它的內部原理不十分清楚。那麼能不能取出網路中某層資料作為影象特徵而進行自己定製的其它處理呢?答案當然是肯定的。在Matlab2017b中,從網路取資料主要有兩種方法。一是使用Neural Network Toolbox

Matlab中的圖形控制代碼轉載

在matlab中,每一個物件都有一個數字來標識,叫做控制代碼.當每次建立一個物件時,matlab就為它建立一個唯一的控制代碼 控制代碼中包含有該物件的相關資訊引數,可以在後續程式中進行操作,改變其中的引數,以便達到不同的效果 例如:gcf 是返回當前被啟用的視窗的控制

分類問題F-score評判指標轉載

ati ria 比例 csdn 但是 https 假設 tail rgb 小書匠深度學習分類方法常用的評估模型好壞的方法.

二、Linear Regression 練習轉載

hold off int 必須 html 移動 根據 which win from 轉載鏈接:http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2961660.html 前言   本文是多元線性回歸的練習,這裏練習的

六、regularized logisitic regssion練習轉載

method open lose hold on update import 等高線 algo 2個 轉載鏈接:http://www.cnblogs.com/tornadomeet/archive/2013/03/17/2964858.html 在上一講Deep learn

SQLServer · BUG分析 · Agent 鏈接泄露分析轉載

空閑 doc ucc object bsp line existing rds 成功 背景 SQLServer Agent作為Windows服務提供給用戶定期執行管理任務,這些任務被稱為Job;考慮應用鏡像的場景如何解決Job同步問題,AWS RDS的做法是不予理會,由

最短路徑-Dijkstra算法轉載

ges 圖論 測試 log logs 表示 保存 依次 路徑 註意:以下代碼 只是描述思路,沒有測試過!! Dijkstra算法 1.定義概覽 Dijkstra(迪傑斯特拉)算法是典型的單源最短路徑算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心

最短路徑-Floyd算法轉載

進一步 數字 sdn 進行 無法 .net %d data scanf 暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。 上圖

linux最大文件句柄數量總結轉載

指定 which 非root cti 文件打開 可能 查看 mit value   最近部署上線的一個引擎,啟動之後內存、日誌顯示一切正常,但是外部無法進行引擎訪問。幾經周折,在同事的協助下,找出了問題:root用戶的open files為1024,引擎啟動時,1024個文