How do you cluster lines in 3D space?

8 ビュー (過去 30 日間)
Nathan
Nathan 2023 年 8 月 23 日
編集済み: Nathan 2023 年 8 月 23 日
Say you have the time and position of 9 samples.
A=[1:11; 1:11; 1:11];
B(1:3,1:11)=6;
C=flip(A,2);
mynoise=rand(3,11)*.75;
A=A+mynoise;
B=B+mynoise;
C=C+mynoise;
plot([A' B' C'])
How would you cluster/group these lines/paths into 3 different groups? I have been clustering at each timepoint and then connecting the cluster to the closest cluster from i-1, but that falls apart at i=6.
My real data is ankle position while walking on a treadmill. The ankle goes up/down, forward/back, in/out, and over time traces out corkscrews in x,y,z,t space. But after hundreds of steps by many subjects we have noticed some step paths are more "circular", some "triangular", and others "oval."
But I don't want to fit the data to my pre-concieved shapes, I want the data to determine the clusters. How do you cluster in x,y,z space where the clusters are linked/determined from the clusters from t-1 and t+1?
  2 件のコメント
Matt J
Matt J 2023 年 8 月 23 日
編集済み: Matt J 2023 年 8 月 23 日
We would have to know more about how the curves arise, and any specifics about the model they follow. Once curves intersect, there is no general way to know which post-intersection samples associate with which pre-intersection samples.

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

回答 (1 件)

Les Beckham
Les Beckham 2023 年 8 月 23 日
I would suggest something like this since the main difference in your "groups" seems to be the approximate slopes of the three groups of lines.
Of course, this may not be appropriate for your real data. If you share an example of the real data it would help in determining an appropriate approach.
A=[1:11; 1:11; 1:11];
B(1:3,1:11)=6;
C=flip(A,2);
mynoise=rand(3,11)*.75;
A=A+mynoise;
B=B+mynoise;
C=C+mynoise;
% plot([A' B' C'])
D = [A' B' C'];
plot(D)
grid on
figure
[Fx, Fy] = gradient(D);
plot(Fy)
grid on
slopes = mean(Fy, 1) % average slope of each of the 9 lines
slopes = 1×9
1.0742 0.9861 1.0266 0.0742 -0.0139 0.0266 -0.9258 -1.0139 -0.9734
groups = discretize(slopes, [-inf -0.5 0.5 inf]) % assign the lines to a group based on average slope
groups = 1×9
3 3 3 2 2 2 1 1 1

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by