如何理解Matlab内置函数”kmeans”?

假设我有一个矩阵A,其大小为2000*1000 double。然后我对矩阵A应用Matlab内置函数"kmeans"

k = 8;[idx,C] = kmeans(A, k, 'Distance', 'cosine');

我得到C = 8*1000 doubleidx = 2000*1 double,其值从1到8;根据文档,C返回k-by-p (8 by 1000)矩阵中的k个聚类中心位置。并且idx返回一个n-by-1向量,包含每个观测值的聚类索引。我的问题是:

1) 我不知道如何理解C,即中心位置。位置应该表示为(x,y),对吗?如何正确理解矩阵C

2) 最终的中心c1, c2,...,ck是什么?它们只是值还是位置?

3) 对于每个聚类,如果我只想得到最接近该聚类中心的向量,如何计算并获取它?

谢谢!


回答:

在回答这三个部分之前,我先解释一下MATLAB对k-means的解释中使用的语法(http://www.mathworks.com/help/stats/kmeans.html)。

  • A是你的数据矩阵(在链接中表示为X)。有n行(在本例中为2000),代表你拥有的观测值/数据点的数量。还有p列(在本例中为1000),代表每个数据点拥有的“特征”数量。例如,如果你的数据由2D点组成,那么p将等于2。
  • k是你希望将数据分组的聚类数量。根据你提供的C的维度,k必须是8。

现在我将回答这三个部分:

  1. C矩阵的维度为k x p。每一行代表一个中心。中心位置根本不需要是(x, y)。中心位置的维度等于p。换句话说,如果你有2D点,你可以将中心绘制为(x, y)。如果你有3D点,你可以将中心绘制为(x, y, z)。由于A中的每个数据点有1000个特征,因此你的中心也有1000个维度。
  2. 如果不清楚你的数据具体是什么,这一点解释起来有点困难。中心当然不仅仅是值,它们也不一定是位置。如果你的数据A是坐标点,你当然可以将中心表示为位置。然而,我们可以更普遍地看待它。如果你有一个聚类中心i和与该中心分组的数据点v,那么该中心将代表其聚类中最相似的数据点。希望这有意义,如果需要,我可以提供更清晰的解释。
  3. k-means方法实际上为我们提供了一种很好的方法来实现这一点。该函数实际上有4个可能的输出,但我将关注第四个,我称之为D

    [idx,C,sumd,D] = kmeans(A, k, 'Distance', 'cosine');

    D的维度为n x k。对于数据点iD矩阵中的第i行给出了该点到每个中心的距离。因此,对于每个中心,你只需找到最接近它的数据点,并返回相应的数据点。如果你需要,我可以提供实现此操作的简短代码。

另外,给个建议。你应该使用kmeans++方法来初始化中心。它更快且通常更好。你可以使用以下方式调用它:

[idx,C,sumd,D] = kmeans(A, k, 'Distance', 'cosine', 'Start', 'plus');

编辑:

这是第3部分所需的代码:

[~, min_idxs] = min(D, [], 1);closest_vecs = A(min_idxs, :);

closest_vecs的每一行i是最接近中心i的向量。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注