2009-12-25 38 views
6

Tôi có hai cụm dữ liệu mỗi cụm có x, y (tọa độ) và một giá trị để biết đó là loại (1 lớp1,2 lớp 2) .Tôi đã vẽ các dữ liệu này nhưng tôi sẽ muốn chia các lớp này với ranh giới (trực quan). chức năng để làm điều đó là gì. tôi đã cố gắng đường viền nhưng nó đã không giúp đỡ!Tách dữ liệu thành hai lớp trực quan trong MATLAB

Trả lời

11

Hãy xem xét vấn đề này classification (sử dụng Iris dataset):

points scatter plot

Như bạn thấy, ngoại trừ cho các cụm dễ dàng tách mà bạn biết phương trình của ranh giới trước, tìm ra ranh giới không phải là một nhiệm vụ tầm thường ...

một ý tưởng là sử dụng chức năng discriminant analysisclassify để tìm ra ranh giới (bạn có một sự lựa chọn giữa tuyến tính và ranh giới bậc hai).

Sau đây là ví dụ hoàn chỉnh để minh họa quy trình. Mã này đòi hỏi phải kê 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 .... khá! – Jacob

+0

@Amro - chỉ là tôi, hoặc ảnh chụp màn hình thứ hai bị thiếu? – Shai

+1

@Shai: không chỉ bạn, đôi khi hình ảnh cũ được tải lên hình ảnh có xu hướng biến mất vì một số lý do ... Dù sao tôi đã cập nhật ví dụ với hình ảnh mới :) – Amro

Các vấn đề liên quan