在 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
.
我正在 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
.