Soru sorKümeli 3d scatterplot çizimi ve kmeans ile küme ortalamalarını buldurma
mehmetozdogan tarafından 6 yıl önce soruldu

Merhaba,
Elimde x,y,z den oluşan koordinatlar var. Amacım bunları kümelere ayırarak scatterplot olarak çizdirmek ve her kümelenin içindeki koordinatların ortalamasını kmeans ile bularak grafik üzerine işaretlemek. Aşağıdaki gibi bir kod yazdım ancak hata veriyor sanırım scatter 3ün kullanımı ile ilgili hata yapıyorum. Yardımlarınız için şimdiden teşekkürler…
 
x=xlsread('kesit3D.xlsx', 'A:A');
y=xlsread('kesit3D.xlsx', 'B:B');
z=xlsread('kesit3D.xlsx', 'C:C');
xyz=[x y z];
[idx,C] = kmeans(xyz,150);
figure
scatter3(xyz(:,1),xyz(:,2),xyz(:,3), idx,'bgm')
hold on
plot(C(:,1),C(:,2),C(:,3),'kx')
disp(C)
 
 

9 Cevap
En iyi cevap
Caglar Yönetici tarafından 6 yıl önce cevaplandı

Dokumantasyona bakmadim ama kmeans'te veya scatter3'de, 3 boyutlu ve merkezleri de gosteren grafik elde etmek icin pratik bir yol  yoksa, döngüyle şöyle olabilir:

 
clear; close all;
 
xyz=[20 40 30; 1 1 3; 2 2 5; 30 50 20; 3 4 5; 2 3 4; 40 35 45; 4 7 8]; %excelden bu tarz bir veri geliyor sanirim. bariz iki ayri kume olsuturacak sekilde degerler uydurdum.
 
kume_sayisi=2; %bu degeri iki yerde kullanacagimiz icin degisken yaptim
 
[idx,C]=kmeans(xyz,kume_sayisi); %idx her bir elemanin ait oldugu kume numarasini, C o kumelerin merkez koordinatlarini verir
 
for kume=1:1:kume_sayisi %her kumeyi ayri ayri cizecek
 
aktif_kumeye_ait_olanlar=idx==kume;    %idx degeri, dongunun kume degerine esit olanlari secece sadece
 
elemanlar=scatter3(xyz(aktif_kumeye_ait_olanlar,1),xyz(aktif_kumeye_ait_olanlar,2),xyz(aktif_kumeye_ait_olanlar,3));
 
hold on
 
merkez=plot3(C(kume,1), C(kume,2), C(kume,3),'*');
 
merkez.Color=elemanlar.CData; %kume elemanlari ile merkezleri ayni renk olsun
 
end
 

Tabi bu 150 kumede nasil gorunur, bilemiyorum. Ayrica, matlab her seferinde renkleri degistirecek ama birkac taneden sonra renkleri tekrar kullanmaya baslayacak. Bu soruna karsi şöyle bir paylasım var: https://uk.mathworks.com/matlabcentral/fileexchange/29702-generate-maximally-perceptually-distinct-colors
 

sayginer Yönetici tarafından 6 yıl önce cevaplandı

Ne hatası alıyorsunuz? Elinizdeki excell dosyası olmadan kodu çalıştırmamız mümkün değil. Ancak aldığınız hatayı paylaşırsanız yardımcı olabiliriz.

mehmetozdogan tarafından 6 yıl önce cevaplandı

Merhaba,
Elimde excel dosyası var.. Aldığım hata aşağıdaki gibidir. ilgiiniz için teşekkürler..
Error using scatter3 (line 45)
Error in color/linetype argument.
Error in abc (line 7)
scatter3(xyz(:,1),xyz(:,2),xyz(:,3),idx,'bgm')
 
 

sayginer Yönetici tarafından 6 yıl önce cevaplandı

Evet grafigi bastirirken bir sorun olusturuyor. scatter3(xyz(:,1),xyz(:,2),xyz(:,3)) Şeklinde basit hali ile denediğinizde çalışması gerekiyor. Sanırım grafik renklendirmes vs yaparken sorun yaşanıyor.

mehmetozdogan tarafından 6 yıl önce cevaplandı

Evet o şekilde çalışıyor ancak clusterlarıda ayrı renklerde göstermek için ne yapabilirim, fikriniz var mı?
Teşekkürler

Caglar Yönetici tarafından 6 yıl önce cevaplandı

düzeltme:

merkez=plot3(C(kume,1), C(kume,2), C(kume,3),'*');
merkez.Color=elemanlar.CData; %kume elemanlari ile merkezleri ayni renk olsun

satırlarını

merkez=plot3(C(kume,1), C(kume,2), C(kume,3),'*','Color', elemanlar.CData);

yaparsak matlab renkleri ikişer ikişer harcamaz.

mehmetozdogan tarafından 6 yıl önce cevaplandı

Cevap için teşekkürler işe yarıyor. 150 ayrı renge gerek yok 3 renk bile yeter sadece clusterları ayırsa yeter.
Bu konu ile ilgili bir sorum daha olacak. Kodu çalıştırıp çizimi yaptıktan sonra. disp (C) ile kmeans ile hesaplanan ortalamaları gostertiyorum. Ancak aynı veri ve kod ile tekrar tekrar hesaplattığımda aldığım ortalama verileri her seferinde değişiyor. Bu konu hakkında fikriniz var mı ? Teşekkürler 

Caglar Yönetici tarafından 6 yıl önce cevaplandı

İyi akşamlar,
kmeans algoritması rastgele noktalar uydurarak denemeye başlar ve hata (her noktanın, en yakın oldugu merkez noktaya olan uzaklıgının karesi) en az olacak yonde noktaların yerini değiştirir. yani global degil local cozumler bulabiliyor. (https://www.quora.com/What-is-the-local-minimum-and-global-minimum-in-machine-learning-Why-are-these-important-in-machine-learning) (https://stats.stackexchange.com/questions/48757/why-doesnt-k-means-give-the-global-minimum/50316)
Şu an bunun icin en pratik cozum, birkac defa kmeans'i çalıştırıp en iyi (en az hatalı) versiyonu kullanmak. Matlab bunu da otomatik olarak yapabiliyor. Kmeansın sayfasında (https://uk.mathworks.com/help/stats/kmeans.html) sayfa içinde "replicates" yazıp aratırsanız örnekleri var. Açıklama sayfasında da (https://uk.mathworks.com/help/stats/k-means-clustering.html) "Avoid local minima" alt başlığında aynı şeyi göstermiş. 
Amacınız tam olarak tekrar edilebilirlik, yani her seferinde aynı sonuçları almak ise, başta seçilen rastgele noktaları hep aynı aldırmanız gerekiyor.  Bunun için de kodun başına 

rng(14,'twister');

yazabilirsiniz.
(https://uk.mathworks.com/help/releases/R2019a/matlab/ref/rng.html) (https://uk.mathworks.com/help/stats/examples/cluster-analysis.html)
Maalesef bildiğim kadarıyla, 3d koordinat düzleminde global çözüm bulan bir clustering algoritması yok.
 
 

mehmetozdogan tarafından 6 yıl önce cevaplandı

Detaylı yanıtınız için teşekkürler oldukça faydalı oldu..