我有一个形式为(x,y,z)的n个坐标点的集合。这些存储在n×3矩阵M中。
Julia中是否有内置函数来计算每个点与每个点之间的距离?我使用少量积分,因此计算时间并不重要。
我的总体目标是运行一个聚类算法,所以如果有一个我可以看到的聚类算法并不需要我首先计算这些距离,请同样建议。我想要执行聚类的数据示例如下。显然,我只需要为z坐标做这个。
答案 0 :(得分:7)
要计算距离,请使用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
如您所见,上面返回X
列之间的距离矩阵。如果需要,您可以使用其他距离指标,只需检查包的文档。
答案 1 :(得分:5)
为了完整性地回答@ 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
)的返回值中。两个可能最有趣的字段:r.centers
包含kmeans算法检测到的中心,r.assigments
包含100个样本中每个样本所属的集群。
同一个包中还有其他几种聚类方法。您可以随意浏览文档并应用最适合您需求的文档。
在您的情况下,由于您的数据是N x 3
矩阵,因此您只需转置它:
M = rand(100, 3)
kmeans(M', k)