Ich habe zwei Cluster von Daten jeder Cluster hat x, y (Koordinaten) und ein Wert zu wissen, es ist Typ (1 Klasse1,2 Klasse 2) .Ich habe diese Daten geplottet, aber ich würde spalte diese Klassen gerne mit der Grenze (visuell). Was ist die Funktion, um so etwas zu tun? Ich habe versucht Kontur, aber es hat nicht geholfen!Teilen von Daten in zwei Klassen visuell in Matlab
6
A
Antwort
11
Betrachten Sie dieses classification Problem (mit der Iris dataset):
Wie Sie sehen können, mit Ausnahme der leicht trennbaren Cluster, für die Sie die Gleichung der Grenze vorher wissen, ist die Grenze zu finden, nicht ein triviale Aufgabe ...
eine Idee ist, die discriminant analysis Funktion classify zu verwenden, um die Grenze zu finden (Sie haben die Wahl zwischen linearer und quadratischer Grenze).
Das folgende ist ein vollständiges Beispiel zur Veranschaulichung des Verfahrens. Der Code erfordert die Statistics Toolbox:
%# load Iris dataset (make it binary-class with 2 features)
load fisheriris
data = meas(:,1:2);
labels = species;
labels(~strcmp(labels,'versicolor')) = {'non-versicolor'};
NUM_K = numel(unique(labels)); %# number of classes
numInst = size(data,1); %# number of instances
%# visualize data
figure(1)
gscatter(data(:,1), data(:,2), labels, 'rb', '*o', ...
10, 'on', 'sepal length', 'sepal width')
title('Iris dataset'), box on, axis tight
%# params
classifierType = 'quadratic'; %# 'quadratic', 'linear'
npoints = 100;
clrLite = [1 0.6 0.6 ; 0.6 1 0.6 ; 0.6 0.6 1];
clrDark = [0.7 0 0 ; 0 0.7 0 ; 0 0 0.7];
%# discriminant analysis
%# classify the grid space of these two dimensions
mn = min(data); mx = max(data);
[X,Y] = meshgrid(linspace(mn(1),mx(1),npoints) , linspace(mn(2),mx(2),npoints));
X = X(:); Y = Y(:);
[C,err,P,logp,coeff] = classify([X Y], data, labels, classifierType);
%# find incorrectly classified training data
[CPred,err] = classify(data, data, labels, classifierType);
bad = ~strcmp(CPred,labels);
%# plot grid classification color-coded
figure(2), hold on
image(X, Y, reshape(grp2idx(C),npoints,npoints))
axis xy, colormap(clrLite)
%# plot data points (correctly and incorrectly classified)
gscatter(data(:,1), data(:,2), labels, clrDark, '.', 20, 'on');
%# mark incorrectly classified data
plot(data(bad,1), data(bad,2), 'kx', 'MarkerSize',10)
axis([mn(1) mx(1) mn(2) mx(2)])
%# draw decision boundaries between pairs of clusters
for i=1:NUM_K
for j=i+1:NUM_K
if strcmp(coeff(i,j).type, 'quadratic')
K = coeff(i,j).const;
L = coeff(i,j).linear;
Q = coeff(i,j).quadratic;
f = sprintf('0 = %g + %g*x + %g*y + %g*x^2 + %g*x.*y + %g*y.^2',...
K,L,Q(1,1),Q(1,2)+Q(2,1),Q(2,2));
else
K = coeff(i,j).const;
L = coeff(i,j).linear;
f = sprintf('0 = %g + %g*x + %g*y', K,L(1),L(2));
end
h2 = ezplot(f, [mn(1) mx(1) mn(2) mx(2)]);
set(h2, 'Color','k', 'LineWidth',2)
end
end
xlabel('sepal length'), ylabel('sepal width')
title(sprintf('accuracy = %.2f%%', 100*(1-sum(bad)/numInst)))
hold off
+1 .... schön! – Jacob
@Amro - ist es nur ich, oder der zweite Screenshot fehlt? – Shai
@Shai: nicht nur du, manchmal alte Bilder hochgeladen zu imageshack neigen dazu, aus irgendeinem Grund zu verschwinden ... Anyways ich aktualisiert das Beispiel mit frischen Bildern :) – Amro