2009-12-25 9 views
6

J'ai deux groupes de données chaque groupe a x, y (coordonnées) et une valeur pour savoir son type (1 classe1,2 classe 2) .J'ai tracée ces données, mais je voudrais aime diviser ces classes avec limite (visuellement). quelle est la fonction de faire une telle chose. J'ai essayé le contour mais ça n'a pas aidé!Diviser les données en deux classes visuellement dans matlab

Répondre

11

Tenir compte de ce problème classification (en utilisant le Iris dataset):

points scatter plot

Comme vous pouvez le voir, à l'exception des groupes facilement séparables dont vous connaissez l'équation de la frontière au préalable, trouver la frontière n'est pas un tâche triviale ...

une idée est d'utiliser la fonction discriminant analysisclassify pour trouver la limite (vous avez le choix entre linéaire et limite quadratique).

Ce qui suit est un exemple complet pour illustrer la procédure. Le code exige la Boîte à outils Statistiques:

%# 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 .... joli! – Jacob

+0

@Amro - est-ce juste moi, ou la deuxième capture d'écran est manquant? – Shai

+1

@Shai: pas seulement vous, parfois de vieilles images téléchargées sur imageshack ont ​​tendance à disparaître pour une raison quelconque ... En tout cas j'ai mis à jour l'exemple avec des images fraîches :) – Amro