我有一个来自我班级的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
答案 0 :(得分:3)
如果我们有一个三角形,使其边长为a, b, c
,那么
我们知道(来自law of cosines)
a^2=c^2+b^2-2bc*cos(alpha)
其中alpha
是尺寸为b
的边与尺寸为c
的尺寸之间的角度。
现在,考虑由三个顶点x
,c_j
和O
(R^n
的原点)组成的三角形。写theta
x
和c
之间的角度,我们有
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)
这是您在代码中最小化的等式。