如何使用 Matlab 实现 KNN 并计算百分比准确度

Posted

技术标签:

【中文标题】如何使用 Matlab 实现 KNN 并计算百分比准确度【英文标题】:How to implement KNN using Matlab and calculate the percentage accuracy 【发布时间】:2016-09-19 03:23:42 【问题描述】:

我是matlab新手,我的目标是实现knn,我有两个不同的txt文件,一个包含测试数据(样本),另一个包含训练数据。

到目前为止,我认为我应该做这样的事情,但我不知道该怎么做。

load fisheriris 
x = meas(:,3:4);
gscatter(x(:,1),x(:,2),species)
newpoint = [5 1.45];
[n,d] = knnsearch(x,newpoint,'k',10);
line(x(n,1),x(n,2),'color',[.5 .5 .5],'marker','o','linestyle','none','markersize',10)

或者也许这是一种更简单的方法,对我来说这两组不同的数据集,样本和训练非常清楚,但这并不能显示预测类的准确性。

 A= [50, 60;
    7,2;
    13,12;
    100,200;];
B=[1,0;
    200,30;
    19,10];
G='First Row';
    'Second Row';
    'Third Row';
class = knnclassify(A,B,G);

disp('Result: ');
disp(class);

矩阵如下所示:

Training data:
148.0,50.0,0
187.0,34.0,0
204.0,89.0,0
430.0,161.0,1
427.0,22.0,1
-42.0,469.0,1
more,more,class....

Test data:
290.0,-57.0,0
194.0,-80.0,0
174.0,33.0,0
465.0,691.0,1
270.0,-194.0,1
-56.0,665.0,1
more,more,class....

如何使用 knn 对这些数据进行分类并显示每一行的预测,以便计算准确率?

-------EDITED------

我忘了,如果我需要每个类的准确度,我该怎么办?

【问题讨论】:

【参考方案1】:

这是使用knnclassify的更新代码

trainData= [148.0,50.0,0; ...
            187.0,34.0,0; ...
            204.0,89.0,0; ...
            430.0,161.0,1; ...
            427.0,22.0,1; ...
            -42.0,469.0,1 ...
            ];

testData=   [290.0,-57.0,0; ...
            194.0,-80.0,0; ...
            174.0,33.0,0; ...
            465.0,691.0,1; ...
            270.0,-194.0,1; ...
            -56.0,665.0,1];

% Data
Sample=testData(:,1:2);
Training=trainData(:,1:2);
Group=trainData(:,3);

% Classify
k=1;  % number of nearest neighbors used in the classification
Class = knnclassify(Sample, Training, Group,k);

% Display Prediction
fprintf('%.1f %.1f - Real %d , Predicted %d\n',[testData.'; Class.']);

% Calculate percentage accuracy for each class
trueClass=testData(:,3);
classList=unique(trueClass);
for classIndex=1:length(classList)
    indexesOfEachClass=find(trueClass==classList(classIndex));
    percentageAccuracyEachClass(classIndex,1)=sum(Class(indexesOfEachClass)==trueClass(indexesOfEachClass))/length(indexesOfEachClass)*100;
end
fprintf('\nClass %d Accuracy : %f%%',[classList.'; percentageAccuracyEachClass.']);

% Calculate overall percentage accuracy 
dataClassifiedAccurately=Class==trueClass;
percentageAccuracy=sum(dataClassifiedAccurately)/length(dataClassifiedAccurately)*100;
fprintf('\n\nOverall Accuracy : %f%%\n',percentageAccuracy);

【讨论】:

非常感谢,我现在完全明白了。 如果我需要申请ENN规则,我应该怎么做?有一张带有伪代码的图像:i.imgur.com/axyD7ms.png 如果我采用训练集并找到最大距离和最短距离然后除以行数,它会起作用吗?最后用新编辑的训练数据集找到最近的邻居? 我已经更新了每个类的百分比准确度的答案。接下来是关于 ENN 规则。请将此作为一个新问题提出。 谢谢,您的代码非常清晰,易于理解。我认为找到每个类的准确性的关键是使用索引。

以上是关于如何使用 Matlab 实现 KNN 并计算百分比准确度的主要内容,如果未能解决你的问题,请参考以下文章

人脸识别基于HOG特征KNN算法实现人脸识别matlab源码

MATLAB中如何使用KNN对数据进行分类?

matlab中的KNN算法

kNN的matlab实现

分类预测 | MATLAB实现KNN分类预测(SA-KNNGOA-KNN对比)

数据挖掘之分类算法---knn算法(有matlab样例)