繁体   English   中英

在 matlab 中创建簇

[英]Creating Clusters in matlab

假设我在matlab中生成了一些数据如下:

n = 100;

x = randi(n,[n,1]);
y = rand(n,1);
data = [x y];

plot(x,y,'rx')
axis([0 100 0 1])

现在我想生成一种算法,以某种方式将所有这些数据分类到一些集群(这是任意的)中,只有当该点与集群成员中的至少一个成员之间的距离为小于 10.我怎么能生成代码?

您所描述的聚类方法是DBSCAN 请注意,此算法将仅在提供的数据中找到一个集群,因为数据集中存在一个点,使其与所有其他点的距离超过10 的可能性很小。如果这确实是您想要的,您可以使用DBSCAN ,或发布在 FE 中的那个,如果您使用的版本早于 2019a。

% Generating random points, almost similar to the data provided by OP 
data = bsxfun(@times, rand(100, 2), [100 1]);
% Adding more random points
for i=1:5
    mu = rand(1, 2)*100 -50;
    A = rand(2)*5;
    sigma = A*A'+eye(2)*(1+rand*2);%[1,1.5;1.5,3];
    data = [data;mvnrnd(mu,sigma,20)];
end
% clustering using DBSCAN, with epsilon = 10, and min-points = 1 as 
idx = DBSCAN(data, 10, 1);
% plotting clusters
numCluster = max(idx);
colors = lines(numCluster);
scatter(data(:, 1), data(:, 2), 30, colors(idx, :), 'filled')
title(['No. of Clusters: ' num2str(numCluster)])
axis equal

在此处输入图片说明

上图中的数字显示了任何两个不同集群中最近的点对之间的距离。

Matlab 内置函数clusterdata()可以很好地满足您的要求。

以下是如何将其应用于您的示例:

% number of points
n = 100; 

% create the data
x = randi(n,[n,1]);
y = rand(n,1);
data = [x y]; 

% the number of clusters you want to create
num_clusters = 5; 

T1 = clusterdata(data,'Criterion','distance',...
'Distance','euclidean',...
'MaxClust', num_clusters)

scatter(x, y, 100, T1,'filled')

在这种情况下,我使用了 5 个集群并使用欧几里得距离作为对数据点进行分组的度量,但您可以随时更改它(请参阅clusterdata()文档

请参阅下面带有一些随机数据的 5 个集群的结果。

在此处输入图片说明

请注意,数据是有偏差的( x从 0 到 100, y从 0 到 1),因此结果也有偏差,但您始终可以对数据进行标准化。

这是使用图的连接组件的一种方法:

D = pdist2(x, y) < 10;
D(1:size(D,1)+1:end) = 0;
G = graph(D);
C = conncomp(G);

连通分量是表示簇数的向量。

  • 使用pdist2计算xy距离矩阵。
  • 使用距离矩阵创建一个逻辑邻接矩阵,如果两个点之间的距离小于10则该矩阵显示两个点是邻居。
  • 将邻接矩阵的对角元素设置为0以消除自环。
  • 从邻接矩阵创建一个
  • 计算图的 连通分量
  • 请注意,对大型数据集使用pdist2可能不适用,您需要使用其他方法来形成稀疏邻接矩阵。

我在提出答案后通知@saastn 提供的答案建议使用几乎遵循相同方法的DBSCAN算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM