2012-02-15 4 views
2

Mon programme utilise le clustering K-means d'un nombre défini de clusters de l'utilisateur. Pour ce k = 4, mais je voudrais exécuter les informations en cluster par l'intermédiaire de matlabs naïf bayes classificateur après.MATLAB - Sortie de classification

Existe-t-il un moyen de diviser les clusters et de les alimenter dans différents classificateurs naïfs dans matlab?

Naive Bayes:

class = classify(test,training, target_class, 'diaglinear'); 

K-means:

%% generate sample data 
K = 4; 
numObservarations = 5000; 
dimensions = 42; 
%% cluster 
opts = statset('MaxIter', 500, 'Display', 'iter'); 
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ... 
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3); 
%% plot data+clusters 
figure, hold on 
scatter3(data(:,1),data(:,2),data(:,3), 5, clustIDX, 'filled') 
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 100, (1:K)', 'filled') 
hold off, xlabel('x'), ylabel('y'), zlabel('z') 
%% plot clusters quality 
figure 
[silh,h] = silhouette(data, clustIDX); 
avrgScore = mean(silh); 
%% Assign data to clusters 
% calculate distance (squared) of all instances to each cluster centroid 
D = zeros(numObservarations, K);  % init distances 
for k=1:K 
%d = sum((x-y).^2).^0.5 
D(:,k) = sum(((data - repmat(clusters(k,:),numObservarations,1)).^2), 2); 
end 
% find for all instances the cluster closet to it 
[minDists, clusterIndices] = min(D, [], 2); 
% compare it with what you expect it to be 
sum(clusterIndices == clustIDX) 

quelque chose comme outputing k grappes à un format k1, k2, k3 alors avoir le classificateur naïf choisir ceux qui, au lieu de tester ce serait k1, k2 .. etc

class = classify(k1,training, target_class, 'diaglinear'); 

Mais je ne sais tout simplement pas comment envoyer la sortie des k clusters en m Atlab à un certain type de format? (Vraiment nouveau à ce programme)

EDIT

training = [1;0;-1;-2;4;0]; % this is the sample data. 
target_class = ['posi';'zero';'negi';'negi';'posi';'zero'];% This should have the same number of rows as training data. The elements and the class on the same row should correspond. 
% target_class are the different target classes for the training data; here 'positive' and 'negetive' are the two classes for the given training data 

% Training and Testing the classifier (between positive and negative) 
test = 10*randn(10,1) % this is for testing. I am generating random numbers. 
class = classify(test,training, target_class, 'diaglinear') % This command classifies the test data depening on the given training data using a Naive Bayes classifier 

% diaglinear is for naive bayes classifier; there is also diagquadratic 

Répondre

1

Essayez ceci:

% create 100 random points (this is the training data) 
X = rand(100,3); 

% cluster into 5 clusters 
K = 5; 
[IDX, C] = kmeans(X, K); 

% now let us say you have new data and you want 
% to classify it based on the training: 
SAMPLE = rand(10,3); 
CLASS = classify(SAMPLE,X,IDX); 

Et si vous voulez juste pour filtrer l'un des groupes de données que vous pouvez faire quelque chose comme ça:

K1 = X(IDX==1) 

Espérons que cela a été utile ..

+0

Zenpoy vous remercie! Cependant, lorsque vous utilisez SAMLE comme données de test, n'utilisez-vous pas K1? Ou ai-je confondu test, entraînement, target_class? Je pensais que target_class serait les étiquettes pour chaque rangée classifiée, la formation serait des données spécifiques pour apprendre à reconnaître, et les données de test seraient les premiers exemples de données à vérifier si elles peuvent classer ce que vous cherchez? (c'est l'un des clusters pour mon problème spécifique) –

+0

Je ne suis pas sûr mais je pense que vous avez confondu quelque chose. Selon la documentation 'help classify': CLASS = classify (SAMPLE, TRAINING, GROUP) classe chaque ligne des données dans SAMPLE dans l'un des groupes de TRAINING. SAMPLE et TRAINING doivent être des matrices avec le même nombre de colonnes. GROUP est une variable de regroupement pour TRAINING. Ses valeurs uniques définissent des groupes, et chaque élément définit à quel groupe appartient la rangée correspondante de TRAINING. GROUP peut être une variable catégorielle, un vecteur numérique, un tableau de chaînes ou un tableau de chaînes de chaînes. – zenpoy

+0

Ah attends qu'il y ait plusieurs choix oui tu peux les grouper mais tu peux aussi les classer individuellement. Voir mon code d'édition ci-dessus. Notez que je les forme avec des données d'entraînement et utilise la classe cible pour les classer. Ensuite, je "teste" le classificateur avec des nombres aléatoires. La sortie est la classe avec les nombres positifs et négatifs classés. Dans mon exemple, j'utiliserais simplement l'un de mes clusters comme mécanisme de test. –