假设我有一个矩阵A
,其大小为2000*1000 double
。然后我对矩阵A
应用Matlab内置函数"kmeans"
。
k = 8;[idx,C] = kmeans(A, k, 'Distance', 'cosine');
我得到C = 8*1000 double
;idx = 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。
现在我将回答这三个部分:
C
矩阵的维度为k x p
。每一行代表一个中心。中心位置根本不需要是(x, y)。中心位置的维度等于p
。换句话说,如果你有2D点,你可以将中心绘制为(x, y)。如果你有3D点,你可以将中心绘制为(x, y, z)。由于A
中的每个数据点有1000个特征,因此你的中心也有1000个维度。- 如果不清楚你的数据具体是什么,这一点解释起来有点困难。中心当然不仅仅是值,它们也不一定是位置。如果你的数据
A
是坐标点,你当然可以将中心表示为位置。然而,我们可以更普遍地看待它。如果你有一个聚类中心i
和与该中心分组的数据点v
,那么该中心将代表其聚类中最相似的数据点。希望这有意义,如果需要,我可以提供更清晰的解释。 -
k-means方法实际上为我们提供了一种很好的方法来实现这一点。该函数实际上有4个可能的输出,但我将关注第四个,我称之为
D
:[idx,C,sumd,D] = kmeans(A, k, 'Distance', 'cosine');
D
的维度为n x k
。对于数据点i
,D
矩阵中的第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
的向量。