2009-12-25 4 views
6

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

Antwort

11

Betrachten Sie dieses classification Problem (mit der Iris dataset):

points scatter plot

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 

classification boundaries with quadratic discriminant function

+3

+1 .... schön! – Jacob

+0

@Amro - ist es nur ich, oder der zweite Screenshot fehlt? – Shai

+1

@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