matlab

2009-12-25 13 views
6

में डेटा को दो वर्गों में विभाजित करना मेरे पास प्रत्येक क्लस्टर में एक्स, वाई (निर्देशांक) डेटा के दो क्लस्टर हैं और इसके प्रकार (1 कक्षा 1,2 कक्षा 2) को जानने के लिए एक मूल्य है। मैंने इन आंकड़ों को प्लॉट किया है लेकिन मैं चाहता हूं इन वर्गों को सीमा (दृष्टि से) के साथ विभाजित करना पसंद है। ऐसी चीज करने का काम क्या है। मैंने समोच्च कोशिश की लेकिन इससे मदद नहीं मिली!matlab

उत्तर

11

इस classification समस्या पर विचार करें (का उपयोग कर Iris dataset):

points scatter plot

आप आसानी से वियोज्य समूहों जिसके लिए आप पहले से सीमा के समीकरण पता के लिए छोड़कर, देख सकते हैं, सीमा नहीं मिल एक है तुच्छ काम ...

एक विचार discriminant analysis समारोह classify उपयोग करने के लिए सीमा (आप रैखिक और द्विघात सीमा के बीच एक विकल्प है) मिल रहा है।

प्रक्रिया को चित्रित करने के लिए निम्नलिखित एक पूर्ण उदाहरण है। कोड की आवश्यकता है सांख्यिकी टूलबॉक्स:

%# 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 .... सुंदर! – Jacob

+0

@Amro - क्या यह सिर्फ मुझे है, या दूसरा स्क्रीनशॉट गुम है? – Shai

+1

@Shai: सिर्फ आप ही नहीं, कभी-कभी छवियों के लिए अपलोड की गई पुरानी छवियां किसी कारण से गायब हो जाती हैं ... वैसे भी मैंने ताजा छवियों के साथ उदाहरण अपडेट किया :) – Amro