如何在matlab中改进两个分离数据集的距离计算?

时间:2018-02-24 23:45:12

标签: matlab distance

如何改善2个分离数据集的距离计算?

这是代码:

X = [   3.6     79
        1.8     54
        3.333   74
        2.283   62
        4.533   85
        2.883   55
        4.7     88
        3.6     85
        1.95    51
        4.35    85
        1.833   54
        3.917   84
        4.2     78
        1.75    47
        4.7     83
        2.167   52
        1.75    62
        4.8     84
        1.6     52
        4.25    79
        1.8     51
        1.75    47
        3.45    78
        3.067   69
        4.533   74
        3.6     83
        1.967   55
        4.083   76
        3.85    78
        4.433   79
        4.3     73
        4.467   77
        3.367   66
        4.033   80
        3.833   74
        2.017   52
        1.867   48
        4.833   80
        1.833   59
        4.783   90  ]
    clc;  
    close all; 
    figure;
    h(1) = plot(X(:,1),X(:,2),'bx');
    hold on;
    X1 = X(1:3,:);
    X2 = X(4:40,:);
    h(2) = plot(X1(1:3,1), X1(1:3,2),'rs','MarkerSize',10);
    k=5;
    [D2 ind] = sort(squeeze(sqrt(sum(bsxfun(@minus,X2,permute(X1,[3 2 1])).^2,2))))
    ind_closest = ind(1:k,:)
    x_closest = X(ind_closest,:)
    for j = 1:length(x_closest);
        h(3) =plot(x_closest(j,1),x_closest(j,2),'ko','MarkerSize',10);
    end

输出如下图所示: enter image description here

问题是,代码没有选择红色平方数据点的最近数据点。我也尝试使用统计工具箱中的pdist2函数,结果与我在代码中应用的bsxfun函数类似。 我不确定代码中哪个部分需要改进,以便我可以选择最接近目标的数据点。 真的很感激,如果有人可以帮我改进我的代码

1 个答案:

答案 0 :(得分:0)

  • 如果closest point表示最接近X,则第19行&第20行应该替换为

    [D2 ind] = sort(squeeze(sqrt(sum(bsxfun(@minus, X ,permute(X1,[3 2 1]))。^ 2,2))))

    ind_closest = ind( 2:k + 1 ,:)

  • 如果closest point表示最接近X2,请尝试以下操作:

    x_closest = X2 (ind_closest,:)

与此同时,我对您的代码进行了一些修改,因为您的h(3)可以进行优化。

clc; clear; close all;         
%load fisheriris 
%X=meas(:,3:4);
load X
X=unique(X,'rows');

figure;
h(1) = plot(X(:,1),X(:,2),'bx');
hold on;

X1 = X([5 15 30],:);
h(2) = plot(X1(:,1), X1(:,2),'rs','MarkerSize',10);
[D2,ind] = sort(squeeze(sqrt(sum(bsxfun(@minus,X,permute(X1,[3 2 1])).^2,2))));

k=3;
ind_closest = unique(ind(2:k+1,:));
x_closest = X(ind_closest,:);
h(3) =plot(x_closest(:,1),x_closest(:,2),'ko','MarkerSize',10);
axis equal

似乎工作正常。

enter image description here