【问题标题】:MATLAB: Does my k-NN classifier works correctly?MATLAB:我的 k-NN 分类器工作正常吗?
【发布时间】:2016-04-30 17:14:14
【问题描述】:

我正在做一个项目,我想在 Fisher 的虹膜数据集上使用 k-NN 分类。我在下面展示我的 k-NN 分类 MATLAB 代码:

rng default;

% k-NN classifier

indices = crossvalind('Kfold',species);
cp = classperf(species);

% k = 1
for i = 1:5
    test = (indices == i); 
    train = ~test;
    class = knnclassify(meas(test,:),meas(train,:),species(train,:));
    classperf(cp(:),class,test);
end
fprintf('The k-NN classification error rate for k = 1 is: %f\n', cp.ErrorRate);

fprintf('Program paused. Press enter to continue.\n');
pause

% k = 3
for i = 1:5
    test = (indices == i); 
    train = ~test;
    class = knnclassify(meas(test,:),meas(train,:),species(train,:),3);
    classperf(cp(:),class,test);
end
fprintf('The k-NN classification error rate for k = 3 is: %f\n', cp.ErrorRate);

fprintf('Program paused. Press enter to continue.\n');
pause

% k = 5
for i = 1:5
    test = (indices == i); 
    train = ~test;
    class = knnclassify(meas(test,:),meas(train,:),species(train,:),5);
    classperf(cp(:),class,test);
end
fprintf('The k-NN classification error rate for k = 5 is: %f\n', cp.ErrorRate);

fprintf('Program paused. Press enter to continue.\n');
pause

我怀疑所有 k = 1,3,5 的 cp.ErrorRate 是否相同。

这是接受状态还是 k = 1,3,5 应该不同? 如果是这样,我必须对我的代码进行哪些更改才能完成我的任务?

【问题讨论】:

    标签: matlab classification knn


    【解决方案1】:

    您的观察实际上与事实相差不远。如果你看一下 Iris 数据集的图,你会发现数据的可分离性非常好:

    因此,如果您选择一个数据项,您几乎总是可以用 1、3 和 5 个邻居对它进行非常精确的分类。在这些情况下,错误率将非常小。当使用更多的邻居时,速率会增加:

    ...但是如果您尝试仅使用一个特征对数据进行分类,尤其是一个无法单独很好地分离数据的特征,则绘图看起来会有所不同(这里我仅根据第二个特征对数据进行分类) :

    但是! 首先,您需要稍微修正一下您的代码。

    每次执行classperf(cp(:),class,test); 时,之前的cp 结构都会更新。只要您在折叠循环中就可以了,但是当您进入下一个实验以获取另一个 K 值时,您需要再次重新初始化 cp 结构!否则每次下一个实验的结果都会被之前的统计数据所影响。

    看看矩阵cp.CountingMatrix。它包含有关已分类数据点的confusion 信息,同时迭代折叠。当您调用cp.ErrorRate 时,将根据此矩阵计算误差。如果在每次循环后不重新初始化它,下一次实验的统计数据会添加到之前实验的结果中(我只从矩阵中取了 3 行):

    k = 1; i = 1;
    
        10     0     0
         0    10     0
         0     0    10
    
    k = 1; i = 2;
    
        20     0     0
         0    19     0
         0     1    20
    
    k = 1; i = 3;
    
        30     0     0
         0    28     0
         0     2    30
    
    k = 1; i = 4;
    
        40     0     0
         0    37     1
         0     3    39
    
    k = 1; i = 5;
    
        50     0     0
         0    47     3
         0     3    47
    
    k = 3; i = 1;
    
        60     0     0
         0    57     3
         0     3    57   % is biased by the first experiment
    

    这是我的代码,您可以在其中看到 cp 的重新初始化:

    rng default;
    load fisheriris;
    fold_number = 5;
    indices = crossvalind('Kfold',species, fold_number);
    
    val = 1:2:100;
    
    err_arr = [];
    
    for k=val
    
        cp = classperf(species); %!!! reinitialize the cp-structure
    
        for i = 1:fold_number
            test = (indices == i); 
            train = ~test;
            class = knnclassify(meas(test,:),meas(train,:),species(train), k);
            %class = knnclassify(meas(test,2),meas(train,2),species(train), k); %to experiment only with the 2nd feature
    
            classperf(cp,class,test);
        end
    
        err_arr = [err_arr; cp.ErrorRate];
    end    
    
    plot(val, err_arr, 'LineWidth', 2);
    grid on;
    xlabel('K');
    ylabel('ErrorRate');
    

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 2011-07-31
      • 2016-08-27
      • 2016-05-06
      • 2016-06-04
      • 2012-11-14
      • 2019-07-05
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多