سؤال

لديّ مصفاة من (369x10) والتي أريد أن أتجمع في 19 مجموعة. أنا أستخدم هذه الطريقة

[idx ctrs]=kmeans(A,19)

الذي ينتج عن IDX (369x1) و CTRS (19x10)

أحصل على النقطة إلى هنا. جميع صفوفاتي في A يتم تجميعها في 19 مجموعة.

الآن لدي صفيف B (49x10). أريد أن أعرف أين تتوافق صفوف هذا B في 19 مجموعة.

كيف يمكن أن يكون ذلك ممكنا في ماتلاب؟

شكرا لكم مقدما

هل كانت مفيدة؟

المحلول

لا أستطيع التفكير في طريقة أفضل للقيام بذلك من ما وصفته. من شأن وظيفة مدمجة أن تنقذ سطرًا واحدًا ، لكنني لم أتمكن من العثور على خط. إليك الرمز الذي سأستخدمه:

[ids ctrs]=kmeans(A,19);
D = dist([testpoint;ctrs]); %testpoint is 1x10 and D will be 20x20
[distance testpointID] = min(D(1,2:end));

نصائح أخرى

فيما يلي مثال كامل على التجميع:

%% generate sample data
K = 3;
numObservarations = 100;
dimensions = 3;
data = rand([numObservarations dimensions]);

%% 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), 50, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (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)

لا أعرف ما إذا كنت قد حصلت على المعنى بشكل صحيح ، ولكن إذا كنت تريد معرفة المجموعة التي تنتمي إلى نقاطك ، يمكنك استخدام وظيفة knnsearch بسهولة. لديها وسيطتين وسيبحث في الحجة الأولى عن أول واحد منهم الأقرب إلى الحجة الثانية.

على افتراض أنك تستخدم مقياس المسافة الإقليدي التربيعي ، جرب هذا:

for i = 1:size(ctrs,2)
d(:,i) = sum((B-ctrs(repmat(i,size(B,1),1),:)).^2,2);
end
[distances,predicted] = min(d,[],2)

يجب أن يحتوي المتوقع بعد ذلك على فهرس أقرب النقط الوسطى ، ويجب أن تحتوي المسافات على مسافات إلى أقرب النقط الوسطى.

ألقِ نظرة داخل وظيفة Kmeans ، في "Distfun" الوظيفي. هذا يوضح لك كيفية القيام بما سبق ، ويحتوي أيضًا على ما يعادل مقاييس المسافة الأخرى.

للحصول على كمية صغيرة من البيانات ، يمكنك القيام بذلك

[testpointID,dum] = find(permute(all(bsxfun(@eq,B,permute(ctrs,[3,2,1])),2),[3,1,2]))

لكن هذا غامض إلى حد ما. يخلق BSXFUN مع CTRS المحفوظة مجموعة 49 × 10 × 19 من المنجدات ، والتي هي آنذاك "All-Ed" عبر البعد الثاني ، مرة أخرى ، ثم يتم العثور على معرفات الصف. مرة أخرى ، ربما ليست عملية لكميات كبيرة من البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top