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)
我有一个形式为 (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)