我是Matlab的新手,我想做以下几点。
我有2500个数据点,可以聚为10组。我的目标是找到每个簇最靠近质心的前5个数据点。为此,我做了以下几点。
1)找到每个点与每个质心之间的距离,并将最近的簇分配给每个数据点。
2)将数据点的索引(1,...,2500)和相应的距离存储在一个簇{index}数组中(不知道这应该是什么数据类型),其中index = 1, 2,...,10。
3)浏览每个群集以找到最近的5个数据点。
我的问题是我不知道每个群集中将存储多少数据点,因此我不知道我应该为群集使用哪种数据类型以及如何在步骤2中添加它们我认为单元阵列可能是我需要的,但是我需要一个用于数据点索引,一个用于距离。或者我可以创建一个结构的单元格数组(每个结构由2个成员组成 - 索引和距离)。同样,我怎么能动态地添加到每个集群呢?
答案 0 :(得分:2)
我建议你将数据保存在普通数组中,这通常在Matlab中最快。
您可以执行以下操作:(假设p
是n=2500
个dim
个数据点矩阵,c
是m=10
个dim
1}}质心矩阵):
dists = zeros(n,m);
for i = 1:m
dists(:,i) = sqrt(sum(bsxfun(@minus,p,c(i,:)).^2,2));
end
[mindists,groups] = min(dists,[],2);
orderOfClosenessInGroup = zeros(size(groups));
for i = 1:m
[~,permutation] = sort(mindists(groups==i));
[~,orderOfClosenessInGroup(groups==i)] = sort(permutation);
end
然后groups
将n
1
个1
值矩阵m
到orderOfClosenessInGroup
,告诉您相应数据点最接近哪个质心,以及n
是一个1
个orderOfClosenessInGroup <= 5
矩阵,告诉您每个组内的亲近顺序(n = 2500;
m = 10;
dim = 2;
c = rand(m,dim);
p = rand(n,dim);
将为您提供一个逻辑向量,其中哪个数据点位于最接近的5个数据点中他们在他们的群体中的质心)。为了说明它,请尝试以下示例:
scatter(p(:,1),p(:,2),100./orderOfClosenessInGroup,[0,0,1],'x');hold on;scatter(c(:,1),c(:,2),50,[1,0,0],'o');
figure;scatter(p(orderOfClosenessInGroup<=5,1),p(orderOfClosenessInGroup<=5,2),50,[0,0,1],'x');hold on;scatter(c(:,1),c(:,2),50,[1,0,0],'o');
然后运行上面的代码,最后按如下方式绘制数据:
Named_Range
这会给你一个看起来像这样的结果:
和此: