Julia 中的聚类和距离计算

Clustering and distance calculation in Julia

我有一个形式为 (x,y,z) 的 n 个坐标点的集合。这些存储在 n x 3 矩阵 M 中。

Julia 中是否有内置函数来计算每个点与其他点之间的距离?我正在处理少量点,因此计算时间并不太重要。

我的总体目标是 运行 一种聚类算法,因此如果有一种我可以查看的聚类算法不需要我首先计算这些距离,请也提出建议。下面是我想要对其执行聚类的数据示例。显然,我只需要为 z 坐标执行此操作。

要计算距离,请使用 Distances package

给定一个矩阵 X,您可以计算列之间的成对距离。这意味着您应该提供输入点(您的 n 个对象)作为矩阵的列。 (在你的问题中你提到了 nx3 矩阵,所以你必须用 transpose() 函数转置它。)

这里有一个如何使用它的例子:

>using Distances  # install with Pkg.add("Distances")

>x = rand(3,2)

3x2 Array{Float64,2}:
 0.27436   0.589142
 0.234363  0.728687
 0.265896  0.455243

>pairwise(Euclidean(), x, x)

2x2 Array{Float64,2}:
 0.0       0.615871
 0.615871  0.0     

可以看到上面的returns是X的列之间的距离矩阵。如果需要,您可以使用其他距离指标,只需查看包的文档即可。

为了完整回答 @niczky12,Julia 中有一个名为 Clustering 的包,正如其名称所示,它基本上允许您执行聚类。

示例kmeans算法:

>>> using Clustering         # Pkg.add("Clustering") if not installed

>>> X = rand(3, 100)         # data, each column is a sample
>>> k = 10                   # number of clusters

>>> r = kmeans(X, k)
>>> fieldnames(r)
8-element Array{Symbol,1}:
:centers    
:assignments
:costs      
:counts     
:cweights   
:totalcost  
:iterations 
:converged

结果存储在包含上述字段的 kmeans (r) 的 return 中。两个可能最有趣的字段:r.centers 包含 kmeans 算法检测到的中心,r.assigments 包含 100 个样本中的每一个样本所属的集群。

同一个包中还有其他几种聚类方法。随意深入文档并应用最适合您需要的文档。


在你的例子中,因为你的数据是一个 N x 3 矩阵,你只需要转置它:

M = rand(100, 3)
kmeans(M', k)