如何知道集群的最佳数量是多少——有没有办法评估实际应该有多少集群?
How to know what is the optimal number of clusters -- is there a way to evaluate how many clusters should actually be there?
我刚刚开始学习聚类,遇到了诸如 groundtruth
之类的术语,这是参考已知集的另一个名称,它包含正确组中的实际聚类数据。出于教育目的,我创建了一个随机生成的数据集,并希望将其聚类为 7 个聚类。假设实际的集群应该是 5,我如何使用这些信息来评估集群的完成情况。有人可以帮忙吗?
K=3;
numObservarations = 100;
dimensions = 3;
data = rand([numObservarations dimensions]);
numObservarations = length(data);
%% cluster
opts = statset('MaxIter', 500, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ...
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);
%% plot data+clusters
figure, hold on
scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')
据我所知,衡量聚类与已知 classes 相比好坏的最常见指标之一是 purity
。
purity
是集群质量的外部评价标准,表示正确class化的数据点的百分比,得分范围从0
到1
.为了计算purity
,每个簇被分配给簇中最频繁的class,然后通过计算正确分配的元素的数量并将其除以数据点总数。
执行计算的第一步是创建 confusion matrix。这可以通过遍历每个集群 CR
并计算有多少对象被 class 化为每个 class CS
:
来实现
| CS_1 | CS_2 | CS_3 |
---------------------------
CR_1 | 4 | 28 | 10 |
CR_2 | 11 | 3 | 22 |
CR_3 | 8 | 14 | 0 |
CR_4 | 1 | 9 | 3 |
CR_5 | 1 | 8 | 0 |
第二步包括迭代每个集群 CR
以找到最大行值:
CR_1 - 28
CR_2 - 22
CR_3 - 14
CR_4 - 9
CR_5 - 8
最后一步,必须聚合行最大值,结果必须除以数据点总数:
PURITY = (28 + 22 + 14 + 9 + 8) / 122 ~= 0,66
这是生成测试集的一种方法:
K = 3;
numObservations = 100;
dimensions = 3;
data = cell(K,1);
for ii=1:K
data{ii} = randn([numObservations,dimensions]) + 3 * randn([1,dimensions]);
end
data = cat(1,data{:});
labels = repmat(1:K,numObservations,1);
labels = labels(:); % This is the ground truth
scatter3(data(:,1),data(:,2),data(:,3), 50, labels, 'filled')
data
是一个数据集,和你做的那个很像,但是里面有三个聚类,均值不同。我使用 3*randn
来生成充分分离集群的随机均值,以便集群有机会做正确的事情。 10*randn
会做一个微不足道的问题,1*randn
会做一个不可能的问题。
labels
是每个数据点所属的簇ID。这是你的 "ground truth".
接下来,像之前一样将 k-means 应用于数据集 data
,以获得您的 clustIDX
。现在您可以比较 clustIDX
和 labels
。因为 k-means 为每个集群分配一个随机 ID(它无法知道您为每个集群分配了哪些 ID),所以不要期望集群会给出与您的基本事实相同的 ID。正确分配的数据点可能有 label=2
和 clustIDX=3
。但是正如 Tommaso 在另一个答案中所解释的那样,混淆矩阵可以向您展示聚类的进展情况。计算如下:
C = zeros(K,K);
for ii=1:length(labels)
C(labels(ii),clustIDX(ii)) = C(labels(ii),clustIDX(ii)) + 1;
end
我刚刚开始学习聚类,遇到了诸如 groundtruth
之类的术语,这是参考已知集的另一个名称,它包含正确组中的实际聚类数据。出于教育目的,我创建了一个随机生成的数据集,并希望将其聚类为 7 个聚类。假设实际的集群应该是 5,我如何使用这些信息来评估集群的完成情况。有人可以帮忙吗?
K=3;
numObservarations = 100;
dimensions = 3;
data = rand([numObservarations dimensions]);
numObservarations = length(data);
%% cluster
opts = statset('MaxIter', 500, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ...
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);
%% plot data+clusters
figure, hold on
scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')
据我所知,衡量聚类与已知 classes 相比好坏的最常见指标之一是 purity
。
purity
是集群质量的外部评价标准,表示正确class化的数据点的百分比,得分范围从0
到1
.为了计算purity
,每个簇被分配给簇中最频繁的class,然后通过计算正确分配的元素的数量并将其除以数据点总数。
执行计算的第一步是创建 confusion matrix。这可以通过遍历每个集群 CR
并计算有多少对象被 class 化为每个 class CS
:
| CS_1 | CS_2 | CS_3 |
---------------------------
CR_1 | 4 | 28 | 10 |
CR_2 | 11 | 3 | 22 |
CR_3 | 8 | 14 | 0 |
CR_4 | 1 | 9 | 3 |
CR_5 | 1 | 8 | 0 |
第二步包括迭代每个集群 CR
以找到最大行值:
CR_1 - 28
CR_2 - 22
CR_3 - 14
CR_4 - 9
CR_5 - 8
最后一步,必须聚合行最大值,结果必须除以数据点总数:
PURITY = (28 + 22 + 14 + 9 + 8) / 122 ~= 0,66
这是生成测试集的一种方法:
K = 3;
numObservations = 100;
dimensions = 3;
data = cell(K,1);
for ii=1:K
data{ii} = randn([numObservations,dimensions]) + 3 * randn([1,dimensions]);
end
data = cat(1,data{:});
labels = repmat(1:K,numObservations,1);
labels = labels(:); % This is the ground truth
scatter3(data(:,1),data(:,2),data(:,3), 50, labels, 'filled')
data
是一个数据集,和你做的那个很像,但是里面有三个聚类,均值不同。我使用 3*randn
来生成充分分离集群的随机均值,以便集群有机会做正确的事情。 10*randn
会做一个微不足道的问题,1*randn
会做一个不可能的问题。
labels
是每个数据点所属的簇ID。这是你的 "ground truth".
接下来,像之前一样将 k-means 应用于数据集 data
,以获得您的 clustIDX
。现在您可以比较 clustIDX
和 labels
。因为 k-means 为每个集群分配一个随机 ID(它无法知道您为每个集群分配了哪些 ID),所以不要期望集群会给出与您的基本事实相同的 ID。正确分配的数据点可能有 label=2
和 clustIDX=3
。但是正如 Tommaso 在另一个答案中所解释的那样,混淆矩阵可以向您展示聚类的进展情况。计算如下:
C = zeros(K,K);
for ii=1:length(labels)
C(labels(ii),clustIDX(ii)) = C(labels(ii),clustIDX(ii)) + 1;
end