我需要使用具有余弦相似度而不是欧几里得距离的 k-means 聚类方法。
例如:
data a: a1 a2 a3 a4 ...
data b: b1 b2 b3 b4 ...
余弦相似度:
我的问题是如何根据余弦相似度重新计算每次迭代的质心向量?
我还可以使用平均值,例如:吗?
我需要使用具有余弦相似度而不是欧几里得距离的 k-means 聚类方法。
例如:
data a: a1 a2 a3 a4 ...
data b: b1 b2 b3 b4 ...
余弦相似度:
我的问题是如何根据余弦相似度重新计算每次迭代的质心向量?
我还可以使用平均值,例如:吗?
您可以通过它们的长度对每个集群中的向量进行归一化并将它们相加,然后对总和进行归一化。结果将是质心(又名原型)向量方向上的单位向量。就球面k-means算法而言,质心向量的长度无关紧要,不使用。这是因为为了计算每个簇成员和质心之间的余弦距离,两个向量都通过它们的长度进行归一化。请参阅本文的以下摘录:
如果你真的需要一个具有代表性长度的质心向量,你可以取集群成员长度的平均值,然后乘以单位质心向量。但这完全是您的选择,与 k-means 算法无关(您可以使用任何其他类型的平均、算术、几何或仅使用平均向量的长度来计算代表质心长度)。
Vijay Rajan 发布的公式实际上是相同的(除了给出非单位长度的质心向量),但请注意,在该公式中,向量也必须在应用公式之前标准化为单位长度。如果计算得当,质心确实会“平分”向量之间的角度。(我目前没有论坛特权对他们的回复发表评论。)
使用余弦计算平均值的常规方法应该是安全的 - 至少如果您的数据是正数并且不包含零向量。
球形 k 均值(即正确的搜索项)IIRC 将平均向量归一化为单位长度。
当心极端情况:如果您的聚类退化并且一个聚类变为空,您最终可能会得到一个零向量并获得 NaN 值。
有一些 k-means 实现(R 中的一个 k-means)允许您只输入距离矩阵而不是实际数据。cran上有一个名为“proxy”的包,您可以使用它来查找基于余弦相似度公式的数据距离矩阵。
您可以直接在 k-means 中使用此距离矩阵。
根据http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.31.7900&rep=rep1&type=pdf它说您可以将所有向量相加,然后将每个向量元素除以向量的数量.
我个人不喜欢这个公式。原因是这不会平分 2 个向量和原点之间的角度。示例 [1,1] 和 [1,0] 之间的原点角度为 45 度,即 SQRT(2)。但是根据书中引用的公式,现在将成为质心的新向量不会平分角度。所以根据公式 1/2 * [1+1, 0+1] 是 [1,0.5]。这一点不在平分线上。