2

我正在 Julia 中实现 K-means 聚类。

找出并实现 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],:]))))

但这似乎不起作用。

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

4

2 回答 2

2

在我的Beta Machine Learning Package模块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

于 2021-02-09T20:44:14.327 回答
1

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

我是如何做到这一点的,是计算每个数据点到第 i 个聚类中心的距离。

Distances[:, i] = [evaluate(CosineDist(), X[j,:], C[[i],:]] for j in 1:300] # Or the length of X
于 2021-02-09T12:09:54.513 回答