matlab k-均值聚类评估
matlab k-means clustering evaluation
如何有效地评估标准 matlab k-means 实现的性能。
例如我有一个矩阵 X
X = [1 2;
3 4;
2 5;
83 76;
97 89]
对于每个点,我都有一个黄金标准聚类。假设 (83,76)、(97,89) 是第一个集群,(1,2)、(3,4)、(2,5) 是第二个集群。然后我们运行 matlab
idx = kmeans(X,2)
并得到如下结果
idx = [1; 1; 2; 2; 2]
根据 NOMINAL 值,这是非常糟糕的聚类,因为只有 (2,5) 是正确的,但我们不关心标称值,我们只关心聚集在一起的点。因此,我们必须以某种方式确定只有 (2,5) 到达了错误的集群。
对于我这个 matlab 新手来说,评估聚类的性能并不是一项微不足道的任务。如果您能与我们分享您对如何评估绩效的想法,我将不胜感激。
评估 "best clustering" 有点模棱两可,尤其是当您在两个不同的组中有点可能最终会在其特征方面交叉时。当您遇到这种情况时,您如何准确定义这些点合并到哪个集群?这是来自 Fisher Iris dataset 的示例,您可以使用 MATLAB 对其进行预加载。让我们具体取萼片宽度和萼片长度,即数据矩阵的第三列和第四列,并绘制 setosa
和 virginica
类:
load fisheriris;
plot(meas(101:150,3), meas(101:150,4), 'b.', meas(51:100,3), meas(51:100,4), 'r.', 'MarkerSize', 24)
这是我们得到的:
你可以看到在中间,有一些重叠。你很幸运,因为你事先知道集群是什么,所以你可以测量准确度是多少,但是如果我们要获得上述数据,我们 不知道每个点属于什么标签to,你怎么知道中间点属于哪个簇?
相反,您应该做的是通过多次 运行ning kmeans
尝试尽量减少这些分类错误。具体来说,您可以通过执行以下操作来覆盖 kmeans
的行为:
idx = kmeans(X, 2, 'Replicates', num);
'Replicates'
标志告诉 kmeans
到 运行 总共 num
次。在 运行ning kmeans
num
次之后,输出成员资格是算法认为在所有这些时间 kmeans
运行 中最好的成员资格。我不会深入探讨,但他们确定了所有成员输出中的 "best" 平均值,并为您提供了这些值。
不设置 Replicates
标志显然默认为 运行ning 一次。因此,请尝试增加 kmeans
运行 的总次数,以便您更有可能获得更高质量的集群成员资格。通过设置 num = 10
,这就是我们从您的数据中得到的:
X = [1 2;
3 4;
2 5;
83 76;
97 89];
num = 10;
idx = kmeans(X, 2, 'Replicates', num)
idx =
2
2
2
1
1
您会看到前三个点属于一个聚类,而后两个点属于另一个聚类。即使 ID 被翻转了,也没关系,因为我们要确保组之间有明确的分隔。
关于 运行dom 算法的小说明
如果您查看上面的评论,您会注意到有几个人在您的数据上尝试了 运行ning kmeans
算法,并且他们收到了不同的聚类结果。原因是因为当 kmeans
为您的聚类中心选择初始点时,这些是 以 运行dom 方式选择的 。因此,根据他们的 运行dom 数字生成器处于什么状态,不能保证运行为一个人选择的初始点数与另一个人相同。
因此,如果您想要可重现的结果,您应该将 运行dom 种子生成器的 运行dom 种子设置为与 运行ning kmeans
之前相同.请注意,尝试将 rng
与一个事先已知的整数一起使用,例如 123
。如果我们在上面的代码之前这样做,运行编写代码的每个人都能够重现相同的结果。
因此:
rng(123);
X = [1 2;
3 4;
2 5;
83 76;
97 89];
num = 10;
idx = kmeans(X, 2, 'Replicates', num)
idx =
1
1
1
2
2
这里的标签是颠倒的,但我保证运行如果上面的代码还有其他运行,它们将得到与上面每次生成的标签相同的标签。
如何有效地评估标准 matlab k-means 实现的性能。
例如我有一个矩阵 X
X = [1 2;
3 4;
2 5;
83 76;
97 89]
对于每个点,我都有一个黄金标准聚类。假设 (83,76)、(97,89) 是第一个集群,(1,2)、(3,4)、(2,5) 是第二个集群。然后我们运行 matlab
idx = kmeans(X,2)
并得到如下结果
idx = [1; 1; 2; 2; 2]
根据 NOMINAL 值,这是非常糟糕的聚类,因为只有 (2,5) 是正确的,但我们不关心标称值,我们只关心聚集在一起的点。因此,我们必须以某种方式确定只有 (2,5) 到达了错误的集群。
对于我这个 matlab 新手来说,评估聚类的性能并不是一项微不足道的任务。如果您能与我们分享您对如何评估绩效的想法,我将不胜感激。
评估 "best clustering" 有点模棱两可,尤其是当您在两个不同的组中有点可能最终会在其特征方面交叉时。当您遇到这种情况时,您如何准确定义这些点合并到哪个集群?这是来自 Fisher Iris dataset 的示例,您可以使用 MATLAB 对其进行预加载。让我们具体取萼片宽度和萼片长度,即数据矩阵的第三列和第四列,并绘制 setosa
和 virginica
类:
load fisheriris;
plot(meas(101:150,3), meas(101:150,4), 'b.', meas(51:100,3), meas(51:100,4), 'r.', 'MarkerSize', 24)
这是我们得到的:
你可以看到在中间,有一些重叠。你很幸运,因为你事先知道集群是什么,所以你可以测量准确度是多少,但是如果我们要获得上述数据,我们 不知道每个点属于什么标签to,你怎么知道中间点属于哪个簇?
相反,您应该做的是通过多次 运行ning kmeans
尝试尽量减少这些分类错误。具体来说,您可以通过执行以下操作来覆盖 kmeans
的行为:
idx = kmeans(X, 2, 'Replicates', num);
'Replicates'
标志告诉 kmeans
到 运行 总共 num
次。在 运行ning kmeans
num
次之后,输出成员资格是算法认为在所有这些时间 kmeans
运行 中最好的成员资格。我不会深入探讨,但他们确定了所有成员输出中的 "best" 平均值,并为您提供了这些值。
不设置 Replicates
标志显然默认为 运行ning 一次。因此,请尝试增加 kmeans
运行 的总次数,以便您更有可能获得更高质量的集群成员资格。通过设置 num = 10
,这就是我们从您的数据中得到的:
X = [1 2;
3 4;
2 5;
83 76;
97 89];
num = 10;
idx = kmeans(X, 2, 'Replicates', num)
idx =
2
2
2
1
1
您会看到前三个点属于一个聚类,而后两个点属于另一个聚类。即使 ID 被翻转了,也没关系,因为我们要确保组之间有明确的分隔。
关于 运行dom 算法的小说明
如果您查看上面的评论,您会注意到有几个人在您的数据上尝试了 运行ning kmeans
算法,并且他们收到了不同的聚类结果。原因是因为当 kmeans
为您的聚类中心选择初始点时,这些是 以 运行dom 方式选择的 。因此,根据他们的 运行dom 数字生成器处于什么状态,不能保证运行为一个人选择的初始点数与另一个人相同。
因此,如果您想要可重现的结果,您应该将 运行dom 种子生成器的 运行dom 种子设置为与 运行ning kmeans
之前相同.请注意,尝试将 rng
与一个事先已知的整数一起使用,例如 123
。如果我们在上面的代码之前这样做,运行编写代码的每个人都能够重现相同的结果。
因此:
rng(123);
X = [1 2;
3 4;
2 5;
83 76;
97 89];
num = 10;
idx = kmeans(X, 2, 'Replicates', num)
idx =
1
1
1
2
2
这里的标签是颠倒的,但我保证运行如果上面的代码还有其他运行,它们将得到与上面每次生成的标签相同的标签。