2009-12-25 9 views
6

Tengo dos grupos de datos cada clúster tiene x, y (coordenadas) y un valor para saber su tipo (1 clase1,2 clase 2). He trazado estos datos pero lo haría Me gusta dividir estas clases con el límite (visualmente). cuál es la función para hacer tal cosa. Intenté contornear pero no sirvió de nada.División visual de datos en dos clases en matlab

Respuesta

11

consideran este problema classification (utilizando el Iris dataset):

points scatter plot

Como se puede ver, a excepción de los grupos fácilmente separables del cual conoce la ecuación de la frontera de antemano, la búsqueda de la frontera no es una tarea trivial ...

una idea es utilizar la función discriminant analysisclassify para encontrar el límite (que tiene que elegir entre lineal y cuadrática límite).

El siguiente es un ejemplo completo para ilustrar el procedimiento. El código requiere la Caja de Herramientas Estadísticas:

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

+0

@Amro: ¿soy yo o falta la segunda captura de pantalla? – Shai

+1

@Shai: no solo usted, a veces las imágenes antiguas cargadas en imageshack tienden a desaparecer por alguna razón ... De todos modos, actualicé el ejemplo con imágenes nuevas :) – Amro

Cuestiones relacionadas