【问题标题】:Clustering and distance calculation in JuliaJulia 中的聚类和距离计算
【发布时间】:2016-08-02 11:14:12
【问题描述】:

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

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

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

【问题讨论】:

  • 有几种不同的聚类算法。你想运行什么样的集群?
  • 我有一个数据集,给出了两条单独的悬挂电缆的 (x,y,z) 坐标。它们仅沿 z 轴(高度)不同。因此,我想基于 z 坐标进行聚类。然而,使用直线切割簇的聚类不起作用,因为上悬链线的最低点可能低于下悬链线的最高点。我目前正在将悬链线分成小块,直线型聚类可以工作,但这不是一个很好的解决方案。

标签: julia hierarchical-clustering


【解决方案1】:

为了完整回答@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)

【讨论】:

    【解决方案2】:

    要计算距离,请使用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 的列之间的距离矩阵。如果需要,您可以使用其他距离指标,只需查看软件包的文档即可。

    【讨论】:

    • 谢谢。现在,当我用更多数据尝试另一个问题时,我得到了内存不足错误。任何想法如何在大量数据集上计算距离矩阵? span>
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2015-01-07
    • 1970-01-01
    • 2015-11-16
    • 2016-02-19
    • 2013-08-31
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多