Assign 3d points to multiple cluster when their coordinates meet certain conditions

1 回表示 (過去 30 日間)
LH
LH 2024 年 4 月 22 日
コメント済み: LH 2024 年 5 月 2 日
Hi all,
I am trying to assign each point of the 3D dataset I have to the "correct" cluster based on certain conditions. The code below shows the 3D dataset I have with 15 data points. Here I have 4 clusters to assign these 15 points to. The challenge here is the following:
  1. I want to test the distance between the x cooridnate of the point and the x cooridnate of the initial centroid and the distance should be equal or less some value. The same goes for the y cooridnate.
  2. If the previous condition is met, test the z coordinate in the same way.
  3. If the previous two conditions are met, assign this point to the "correct" cluster. I think the final index matrix should be 15x4 where the rows corrspond to the number of points, the first column is the x coordinates, the second column is the y coorindtaes, the third column is the z coordinates, and the fourth clumn correspnds to the cluster index.
clear all;
close all;
%3D dataset
X = [0.6820 -0.4255 0.4255
0.6820 0.8088 0.5881
0.6820 -0.9337 -0.3580
0.6820 0.5513 0.8343
0.6820 -0.4142 0.4142
0.6820 0.5281 0.8492
0.6820 -0.9234 -0.3838
0.6820 -0.2950 0.2950
0.6820 -0.3111 0.3111
0.6820 -0.7517 -0.6595
0.6820 0.3220 0.9467
0.6820 -0.3805 0.3805
0.6820 0.6108 0.7918
0.6820 -0.2954 0.2954
0.6820 0.9530 0.3029];
%number of lcusters
NoCluster = 4;
%initial random centroids
xmin = 1 ; xmax = 4;
ymin = -1; ymax = 1;
zmin = -1; zmax = 1;
initial_centroids = [xmin+(xmax-xmin).*rand(NoCluster,1)...
ymin+(ymax-ymin).*rand(NoCluster,1)...
zmin+(zmax-zmin).*rand(NoCluster,1)];
%calculate the distance betweene each point and each centorid
%go through all points
for isp = 1:size(X,1)
%go through all clusters
for ic = 1:size(initial_centroids,1)
%measure the distance between each to each of the
%preivously determined centroids
Dist_x(isp,ic) = abs(X(isp,1)-initial_centroids(ic,1));
Dist_y(isp,ic) = abs(X(isp,2)-initial_centroids(ic,2));
Dist_z(isp,ic) = abs(X(isp,3)-initial_centroids(ic,3));
end
end
%go through all calculated distances for testing
for idist = 1:size(Dist_x,1)
%go throguh all clusters
for icc = 1:size(initial_centroids,1)
%test x and y
if Dist_x(idist,icc) <= 0.01 && ...
Dist_y(idist,icc) <= 0.01
%if the previous condiiton is met, test the
%corresponding z point
if Dist_z(idist,icc) <= 0.01
%if the previous two conditions are met,
%assign this point to the current cluster and save
%its cluster index
[~ , ~ , ~ , cluster_indices] = ; %what to write here?
end
end
end
end
Any help would be appreciated.
Thanks.

採用された回答

Yatharth
Yatharth 2024 年 4 月 30 日
Hi LH,
I understand that you're aiming to assign each point in the 3D dataset to a cluster based on specific conditions, as outlined in your question and provided code.
After setting initial centroids, consider using this code snippet instead:
threshold_x = 1.5;
threshold_y = 1.5;
threshold_z = 1.5;
% Initialize the cluster assignment matrix
cluster_assignments = zeros(size(X,1), 4);
for i = 1:size(X,1)
for j = 1:NoCluster
% Calculate the distance between the point and the centroid
dist_x = abs(X(i,1) - initial_centroids(j,1));
dist_y = abs(X(i,2) - initial_centroids(j,2));
dist_z = abs(X(i,3) - initial_centroids(j,3));
% Check if the point meets the conditions for all coordinates
if dist_x <= threshold_x && dist_y <= threshold_y && dist_z <= threshold_z
% Assign the point to this cluster
cluster_assignments(i,:) = [X(i,:), j];
break; % Break the loop once the point is assigned to a cluster
end
end
end
% Display the final cluster assignments
disp(cluster_assignments);
I hope this is what you were looking for.
  1 件のコメント
LH
LH 2024 年 5 月 2 日
Thanks. It works well. I think the problem was the absence of the matrix initialisation in the beginning.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeCluster Analysis and Anomaly Detection についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by