在 Matlab 中用一条线分开双月分类

Separate Double Moon Classification with A Line in Matlab

我有一些用于绘制双月分类的 Matlab 代码行:

    function data=dm(r,w,ts,d)
clear all; close all;
if nargin<4, w=6;end
if nargin<3, r=10;end
if nargin<2, d=-4;end
if nargin < 1, ts=1000; end
ts1=10*ts;
done=0; tmp1=[];

while ~done, 
    tmp=[2*(r+w/2)*(rand(ts1,1)-0.5) (r+w/2)*rand(ts1,1)];
    tmp(:,3)=sqrt(tmp(:,1).*tmp(:,1)+tmp(:,2).*tmp(:,2)); 
    idx=find([tmp(:,3)>r-w/2] & [tmp(:,3)<r+w/2]);
    tmp1=[tmp1;tmp(idx,1:2)];
    if length(idx)>= ts, 
        done=1;
    end
end

data=[tmp1(1:ts,:) zeros(ts,1);
    [tmp1(1:ts,1)+r -tmp1(1:ts,2)-d ones(ts,1)]];
plot(data(1:ts,1),data(1:ts,2),'.r',data(ts+1:end,1),data(ts+1:end,2),'.b');
title(['Perceptron with the double-moon set at distance d = ' num2str(d)]),
axis([-r-w/2 2*r+w/2 -r-w/2-d r+w/2])
save dm r w ts d data;

结果:

我的问题是如何在双月分类中加入一条线,以便在 Matlab 代码中将两个分类分开?

我已经模拟了你的问题,并根据步骤写了一个实用的解决方案

  1. 生成足够精细的点网格(步长小至 可能)
  2. 找出这些点中的哪些点在两点之间的 space 中 团体
  3. 找出哪些点到两组的距离相等
  4. 情节点

代码的主要部分(没有我的数据生成代码和我做的情节)是

PBlues = data(1:ts,:);
PReds = data(ts+1:end,:);
Xs = linspace( min(data(:,1)), max(data(:,1)), 100);
Ys = linspace( min(data(:,2)), max(data(:,2)), 100);
[Xs,Ys] = meshgrid( Xs, Ys);

%% compute point relative distance to each point set (ble and red)
bCouldbeInbetween = false(size(Xs));
minDistsb = zeros(size(Xs));
minDistsr = zeros(size(Xs));
for p=1:numel(Xs)
    distb = sqrt( (Xs(p)- PBlues(:,1)).^2+(Ys(p)- PBlues(:,2)).^2);
    distr = sqrt( (Xs(p)- PReds(:,1)).^2+(Ys(p)- PReds(:,2)).^2);
    minDistsb(p) = min(distb);
    minDistsr(p) = min(distr);
    i = find(distb == minDistsb(p));
    j = find(distr == minDistsr(p));
    bCouldbeInbetween(p) = (sign(PBlues(i,1)-Xs(p)) ~= sign(PReds(j,1)-Xs(p))) || ...
        (sign(PBlues(i,2)-Ys(p)) ~= sign(PReds(j,2)-Ys(p)));
    if bCouldbeInbetween(p)

    end
end
% point distance difference to each point set
DistDiffs = abs(minDistsb - minDistsr);
% point with equal distance using proportional decision strategy
bCandidates = DistDiffs./ max(minDistsb,minDistsr) < 0.05;
medianLine = [Xs(bCandidates),Ys(bCandidates)];
[~,I] = sort(medianLine(:,1));
medianLine(:,1) = medianLine(I,1);
medianLine(:,2) = medianLine(I,2);

希望对您有所帮助 我刚刚提交了一份可以在这里下载的文件:https://de.mathworks.com/matlabcentral/fileexchange/66618-linebetweentwopointsgroups-exchange--