代码之家  ›  专栏  ›  技术社区  ›  Alex

KNN Matlab列车测试交叉验证

  •  0
  • Alex  · 技术社区  · 9 年前

    所以我想使用我在下面定义的数据(有两个标签),并使用KNN进行培训和测试,以及交叉验证。我找不到有用的MATLAB教程,所以如果你们能帮助我,我很感激。

    想象一下我有

    Data=rand(2000,2);
    Lables=[ones(1000,1);-1*ones(1000,1)]; 
    

    我想使用KNN,并具有:

    • 50%的数据用于培训
    • 25%交叉验证
    • 25%测试
    1 回复  |  直到 9 年前
        1
  •  0
  •   Odedy    9 年前

    你给出的数据不是一个很好的数据集,因为这两个数据集之间没有差异。你应该使用

    Data = [rand(1000,2)+delta;rand(1000,2)-delta];
    

    最大的三角洲越容易分类 kNN背后的理念是你不需要任何训练。

    假设您有一个具有N个标记值的数据集。现在假设您有一个要分类的条目。

    如果考虑1-NN分类器,则计算输入和N标记训练示例之间的距离。分类为具有最短距离示例标签的输入。

    在k-NN分类器中,检查距离最短的示例的k个标签是什么。NN人数最多的班级获胜。

    在MATLAB中,您可以使用knnserach查找最近的k个索引,也可以使用knnclassification获取标签。

    下面是knnserach的示例

    delta = 0.3;
    N1 = 50;
    N2 = 50;
    Data1 = rand(1000,2)+delta;
    Data2 = rand(1000,2)-delta;
    train = [Data1(1:N1,:);Data2(1:N2,:)]; % create a training set
    labels = [ones(N1,1);-1*ones(N2,1)]; % create labels for the training
    plot(train(1:N1,1),train(1:N1,2),'xb',train(N1+1:end,1),train(N1+1:end,2),'or')
    k = 7; % Can't be an even number
    idx = knnsearch(train,Data1(N1+1:end,:),'K',k); % classify for the rest of data 1
    res1 = 0;
    for i=1:size(idx,1)
        if sum(labels(idx(i,:))) < 0;
            res1 = res1 + 0; % wrong answer
        else
            res1 = res1 + 1; % correct answer
        end
    end
    idx2 = knnsearch(train,Data2(N2+1:end,:),'K',k); % classify for the rest of data 2
    res2 = 0;
    for i=1:size(idx2,1)
        if sum(labels(idx2(i,:))) > 0;
            res2 = res2 + 0; % wrong answer
        else
            res2 = res2 + 1; % correct answer
        end
    end
    corr = res1+res2;
    tot = size(idx2,1)+size(idx,1);
    fprintf('Classified %d right out of %d. %.2f correct\n',corr,tot,corr / tot * 100)