Merhaba,
Elimde 2 ayrı nokta grubu verisi var (x,y,z şeklinde). Bunları k-means-clustering ile kümelendirip çizdirdim ve iki nokta grubu arasındaki min mesafeleri hesaplattım.
bu noktaları sırasına gore etiketlemek istiyorum..
Kodum Şu şekilde;
x=xlsread('ping1.xlsx', 'A:A');
y=xlsread('ping1.xlsx', 'B:B');
z=xlsread('ping1.xlsx', 'C:C');
a=xlsread('ping2.xlsx', 'A:A');
b=xlsread('ping2.xlsx', 'B:B');
c=xlsread('ping2.xlsx', 'C:C');
xyz=[x y z];
abc=[a b c];
rng(1);
[idx1,C1] = kmeans(xyz,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
[idx2,C2] = kmeans(abc,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
plot3(C1(:,1),C1(:,2),C1(:,3),'kx','color','b')
hold on
plot3(C2(:,1),C2(:,2),C2(:,3),'k*','Color','r')
m=[C1(:,1) C1(:,2) C1(:,3)]
n=[C2(:,1) C2(:,2) C2(:,3)]
d = pdist2(m,n)
[mindist, idx] = min(d, [], 2);
for K = 1 : length(idx)
fprintf('m(%d,:)@(%f,%f,%f) <-> n(%d,:)@(%f,%f,%f) is distance %f\n', K, m(K,:), idx(K), n(idx(K),:), mindist(K));
end
Çıktım da şu şekilde;
m(1,:)@(2.307377,-9.474109,2176.994092) <-> n(56,:)@(2.290992,-9.478318,2176.981385) is distance 0.021158
m(2,:)@(-2.665247,-9.509813,2175.179836) <-> n(78,:)@(-2.604127,-9.516500,2175.234717) is distance 0.082416
m(3,:)@(1.938588,-9.341269,2175.164459) <-> n(2,:)@(1.934761,-9.333414,2175.158117) is distance 0.010796
m(4,:)@(-0.428525,-9.582331,2177.013545) <-> n(77,:)@(-0.465985,-9.597041,2177.017668) is distance 0.040455
m(5,:)@(-1.616256,-9.620964,2176.938217) <-> n(46,:)@(-1.576331,-9.621269,2176.947139) is distance 0.040911
m(6,:)@(-0.749726,-9.431995,2175.113013) <-> n(58,:)@(-0.785440,-9.427461,2175.085079) is distance 0.045568
m(7,:)@(-1.141970,-9.584293,2176.986975) <-> n(86,:)@(-1.164590,-9.604803,2176.984763) is distance 0.030614
m(8,:)@(-1.749833,-9.470245,2175.137265) <-> n(84,:)@(-1.788894,-9.474396,2175.151150) is distance 0.041663
.
.
.
Grafikte noktaların üzerine m1, m2, m3 ve n1, n2, n3 şeklinde etiket eklemek istiyorum..Hatta mümkünse distanceleri de yazdırabilirsem çok faydalı olur
Birkaç birşey denedim ama beceremedim..
Teşekkürler..
Öncelikle çok sayıda veriniz olduğu için isimler birbirine karışabilir. Bunun için text kısmında ki x, y ve z yerlerine (mesela C(:,1)+0.02 yazdım) ekleyebilirsiniz.
İsimleri kendimce birden yüze kadar verdim. Kod bu şekilde çalışıyor.Bunu referans alarak arzu ettiğiniz güncellemeler yapabilirsiniz.
for i=1:100
m(i)=i
end
m=m';
for i=1:100
n(i)=i;
end
n=n';
plot3(C1(:,1),C1(:,2),C1(:,3),'kx','color','b');grid on;
text(C1(:,1)+0.02,C1(:,2),C1(:,3),num2str(m),'FontSize',5)
hold on
plot3(C2(:,1),C2(:,2),C2(:,3),'k*','Color','r');grid on;
text(C2(:,1),C2(:,2),C2(:,3),num2str(n),'FontSize',5)
Merhaba,
Sorunuzu yanlış anlamadıysam nokta numaralarını "text" fonksiyonu ile yazdırabilirsiniz.
Mesafelere gelince noktaların mesafelerini işlem ile bulup bunları bir matrise atayarak yine "text" fonksiyonu kullanarak yazdırabilirsiniz, text'i kullanırken mesafeler sayı olacağı için num2str fonksiyonu ile yazı formatına dönüştürebilirsiniz.
Arzu ederseniz ping1 ve ping2 dosyalarını paylaşın kendim de deneyebilirim
Text fonksiyonu ile denedim ama koordinatları yazdırmıştım, sıralamayı yazdıramadım.
Dosyaları aşağıdaki linkten indirebilirsiniz,
Teşekkürler.
https://dosya.co/lqgip6239ie2/ping.rar.html
Merhaba tekrar,
Yardımınız için teşekkürler, kodu ekleyip ilk çalıştırdığımda istediğim gibi sonuç aldım ancak daha sonra çalıştırdığımda noktaların yanında sıralama yanında koordinatlar da çıktı, tekrar çalıştırdım bu sefer sadece m noktalarını çizdirdi label hiç yoktu.Ve her çalıştırdığımda sırayla bu iki durum tekrar ediyor. Yazdığım kod aşağıdaki gibi oldu. Aşağıdaki kodda bir aksilik görebiliyor rmusunuz?
x=xlsread('king1.xlsx', 'A:A');
y=xlsread('king1.xlsx', 'B:B');
z=xlsread('king1.xlsx', 'C:C');
a=xlsread('king2.xlsx', 'A:A');
b=xlsread('king2.xlsx', 'B:B');
c=xlsread('king2.xlsx', 'C:C');
xyz=[x y z];
abc=[a b c];
rng(1);
[idx1,C1] = kmeans(xyz,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
[idx2,C2] = kmeans(abc,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
for i=1:100
m(i)=i
end
m=m';
for i=1:100
n(i)=i;
end
n=n';
plot3(C1(:,1),C1(:,2),C1(:,3),'kx','color','b');grid on;
text(C1(:,1)+0.02,C1(:,2),C1(:,3),num2str(m),'FontSize',5)
hold on
plot3(C2(:,1),C2(:,2),C2(:,3),'k*','Color','r');grid on;
text(C2(:,1),C2(:,2),C2(:,3),num2str(n),'FontSize',5)
m=[C1(:,1) C1(:,2) C1(:,3)]
n=[C2(:,1) C2(:,2) C2(:,3)]
d = pdist2(m,n)
[mindist, idx] = min(d, [], 2);
for K = 1 : length(idx)
fprintf('m(%d,:)@(%f,%f,%f) <-> n(%d,:)@(%f,%f,%f) is distance %f\n', K, m(K,:), idx(K), n(idx(K),:), mindist(K));
end
Şöyle ki; m değişkeni isminde birçok değişken var ve dikkat ederseniz m ve n değişkenlerinin transpozesini alınıyoruz, tekrar çalıştırıldığında bu sonucu vermesi doğal. Tavsiyem aynı isimde hiç değişken olmasın. O zaman herhangi bir problem kalmaz
Merhaba tekrar,
Öncelikle desteğiniz için teşekkürler, değişken isimlerinin hepsini değiştirdim bu seferde ikinci kere çalıştırdığımda her noktanın yanına 1den 100'e kadar sayı yazdırıyor. 3. defa çalıştırdığımda tekrar eski hale geliyor. Bu konuda fikriniz var mı?
Teşekkürler..
Sanırım m ve n'yi oluştururken 100 e kadar komut veriyoruz ordan kaynaklanıyor olabilir. Onun dışında bir fikrim maalesef yok.
Kolay gelsin…
Matlab programında bir kodu ikinci defa çalıştırdığınızda önce ki çalıştırdığınızın sonuçları tanımlı olduğu için değişkenlerin değerleri üst üste binebilir. Bunun için de kod yazmaya başladığınızda mutlaka en başta clc;clear; komutlarını yazmalısınız. Bu sayede önce ki değerler silinir ve yeniden hesaplatılır. Sanırım ihtiyacınız olan tek şey en başa yazmanız gereken clc;clear; komutları
Evet değişkenlerin üst üste binmesinden kaynaklanıyor onu fark etmiştim, clc;clear; komutları işe yaradı. Yardımlarınız için çok teşekkür ederim..
İyi çalışmalar dilerim..