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
6
A
Répondre
11
Tenir compte de ce problème classification (en utilisant le Iris dataset):
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
+1 .... joli! – Jacob
@Amro - est-ce juste moi, ou la deuxième capture d'écran est manquant? – Shai
@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