在 Julia 中为 K-Means 计算余弦相似度

Calculating Cosine Similarity in Julia for K-Means

我正在 Julia 中实现 K 均值聚类。

找出并实施 k-means 的修改,或者通过向量之间的角度测量相似性。

所以我假设可以为此使用余弦相似度,我通过计算欧几里得距离的平方使代码与常规 K-means 一起工作,方法是:

Distances[:,i] = sum((X.-C[[i],:]).^2, dims=2) # Where C is center, Distances are added using the i-th center

我尝试通过使用余弦相似度来做到这一点,例如:

Distances[:, i] = sum(1 .- ((X*C[[i], :]).^2 /(sum(X.^2, dims=2).*(C[[i],:]'*C[[i],:]))))

但这似乎不起作用。

是我误解了这个问题还是我执行错了?

我设法使用 Distances github 中的 CosineDist 函数解决了这个问题。尽管也可以使用 Github 或其他实现中提供的代码手动计算距离。

我是怎么做到的,是计算每个数据点到第 i 个聚类中心的距离。

Distances[:, i] = [evaluate(CosineDist(), X[j,:], C[[i],:]] for j in 1:300] # Or the length of X

在我的 Beta Machine Learning Package, module Utils 中,我将距离实现为:

using LinearAlgebra
"""L1 norm distance (aka _Manhattan Distance_)"""
l1_distance(x,y)     = sum(abs.(x-y))
"""Euclidean (L2) distance"""
l2_distance(x,y)     = norm(x-y)
"""Squared Euclidean (L2) distance"""
l2²_distance(x,y)    = norm(x-y)^2
"""Cosine distance"""
cosine_distance(x,y) = dot(x,y)/(norm(x)*norm(y))

然后我在集群模块中使用它们。 请注意,您需要标准库包 LinearAlgebra.