KNN實現鳶尾花分類

2021-10-06 05:10:30 字數 3163 閱讀 5568

將其按照7:3的比例劃分為訓練集和測試集。前4列為特徵,第5列為類別,"setosa"視為1,"versicolor"視為2,"virginica"視為3;測試集順序略有調整。

最簡單最初級的分類器是將全部的訓練資料所對應的類別都記錄下來,當測試物件的屬性和某個訓練物件的屬性完全匹配時,便可以對其進行分類。但是怎麼可能所有測試物件都會找到與之完全匹配的訓練物件呢,其次就是存在乙個測試物件同時與多個訓練物件匹配,導致乙個訓練物件被分到了多個類的問題,基於這些問題,就產生了knn。

knn是通過測量不同特徵值之間的距離進行分類。它的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,其中k通常是不大於20的整數。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。

其步驟如下:

計算測試資料與各個訓練資料之間的距離;

按照距離的遞增關係進行排序;

選取距離最小的k個點;

確定前k個點所在類別的出現頻率;

返回前k個點**現頻率最高的類別作為測試資料的**分類。

基於以上步驟,可以很容易寫出matlab**,**有詳細注釋:

clear all;

clc;

% 讀入訓練集,分類:"setosa"視為1,"versicolor"視為2,"virginica"視為3

train =

xlsread

('train.xlsx');

traindata =

train(:

,1:4

);% 前四列是特徵

trainclass =

train(:

,5);

% 最後一列是分類

% 讀入測試集

test =

xlsread

('test.xlsx');

testdata =

test(:

,1:4

);n=

size

(testdata,1)

;% 測試資料個數

testclass =

zeros(1

,n);

% 定義陣列存放分類結果

testclasscorrect =

test(:

,5)';% 正確結果,為之後判斷準確率使用

% 主函式

k =9

;% 確定k的值,取值不同分類結果不同

row =

size

(traindata,1)

;% 返回行數

col =

size

(traindata,2)

;% 返回列數

% 開始for迴圈,對每乙個測試資料進行分類

for n =1:n

itest =

testdata

(n,:);

% 找出乙個測試集

itestrep =

repmat

(itest,row,1)

;% 此步驟將測試資料複製為乙個和訓練集大小相同的矩陣,為方便後面的迴圈計算

dis =

zeros(1

,row)

;% 有很多種距離計算方法,此處選擇歐氏距離

for i =

1:row

diff =0;

for j =

1:col

diff = diff +

(itestrep

(i,j)

-traindata

(i,j)).

^2;end

dis(

1,i)

= diff.

^0.5

;end

% 對距離進行排序,選出距離最小的k個鄰近

class

= trainclass';

joinclass =

[dis;

class];

sortdis=

sortrows

(joinclass')

;% 對加入分類後的矩陣按照距離公升序排序

sortdisclass = sortdis';

% 統計出現次數最高的類別

ksort =

sortdisclass(2

,1:k)

; table=

tabulate

(ksort)

;maxpercent

=max

(table(:

,3))

;[r,c]

=find

(table==

maxpercent);

% 找出最大概率所在的位置

maxvalue

=table

(r,1);

testclass(1

,n)=

maxvalue

;end

% 顯示結果

disp

('最終的分類結果為:');

for x =1:n

fprintf

('%d\t'

,testclass(1

,x))

;end

fprintf

('\n');

% 計算正確率

count =0;

% 正確個數

for y =1:n

if(testclass(1

,y)==

testclasscorrect(1

,y))

count = count+1;

endend

disp

('最終的正確率為:');

fprintf

('%.2f%%\n'

,count/n*

100)

;

結果如下:

最終的分類結果為:11

1112

2222

1111

1222

2233

3332

2222

3332

3111

1133

333 最終的正確率為:

97.78

%

knn實現鳶尾花分類

依照歐氏距離計算公式計算測試資料與訓練集的距離 按照距離公升序排序,選取距離最小的k個點 確定前k個點所在類別的出現頻率 返回前k個點出現頻率最高的類作為測試資料的 分類 import operator import numpy as np from sklearn.datasets import ...

KNN演算法進行鳶尾花分類

import numpy as np import matplotlib.pylab as pyb matplotlib inline from sklearn.neighbors import kneighborsclassifier from sklearn import datasets fr...

Python Iris鳶尾花資料Knn分類

首先匯入sklearn庫中自帶iris資料 三類 0 山鳶尾花 1 變色鳶尾花 2 維吉尼亞鳶尾花 訓練集112個,測試集38個。匯入iris資料,x資料,y標籤 iris datasets.load iris x iris.data y iris.target x train,x test,y t...