MAT中的K均值算法 - 解释群集标签分配步骤

时间:2017-07-20 14:57:57

标签: matlab k-means

我有一个来自我班级的Matlab代码,其中教授使用此代码将每个数据点分配到最近的聚类,其中c是质心矩阵,x是数据矩阵。

  % norm squared of the centroids; 
  c2 = sum(c.^2, 1);  

  % For each data point x, computer min_j  -2 * x' * c_j + c_j^2;
  % Note that here is implemented as max, so the difference is negated.
  tmpdiff = bsxfun(@minus, 2*x'*c, c2); 
  [val, labels] = max(tmpdiff, [], 2); 

我不确定这是如何等同于通过

完成群集分配的此步骤的算法定义
% For every centroid j and for every data point x_i
labels(i) = `argmin||x_i - c_j||^2`

任何人都可以向我解释这是如何工作的,基本上是如何计算

min_j  -2 * x' * c_j + c_j^2 

相当于

 argmin||x_i - c_j||^2

1 个答案:

答案 0 :(得分:3)

如果我们有一个三角形,使其边长为a, b, c,那么 我们知道(来自law of cosines

a^2=c^2+b^2-2bc*cos(alpha)

其中alpha是尺寸为b的边与尺寸为c的尺寸之间的角度。

现在,考虑由三个顶点xc_jOR^n的原点)组成的三角形。写theta xc之间的角度,我们有

 argmin_j||x-c_j||^2
 =argmin_j (||x||^2+||c_j||^2 - 2*||x||* ||c_j|| * cos(theta)  )

等于

 argmin_j(||x||^2 + ||c||^2 - 2x^t c_j)

现在,请记住x在此最小化中是常量,因此最后一个等式恰好等于

argmin_j(||c_j||^2 - 2 x^t c_j)

这是您在代码中最小化的等式。