【问题标题】:Scipy.cluster.hierarchy.fclusterdata + distance measureScipy.cluster.hierarchy.fclusterdata + 距离测量
【发布时间】:2023-03-22 21:50:01
【问题描述】:

1) 我正在使用 scipy 的 hcluster 模块。

所以我可以控制的变量是阈值变量。 我如何知道每个阈值的表现?即在 Kmeans 中,该性能将是所有点到其质心的总和。当然,这必须进行调整,因为通常更多的集群 = 更小的距离。

我可以用 hcluster 对此进行观察吗?

2) 我意识到有大量可用于 fclusterdata 的指标。我正在基于关键术语的 tf-idf 对文本文档进行聚类。交易是,一些文档比其他文档长,我认为余弦是“规范化”这个长度问题的好方法,因为文档越长,它在 n 维字段中的“方向”应该保持不变,如果他们内容一致。有人可以建议其他方法吗?我该如何评估?

谢谢

【问题讨论】:

    标签: python cluster-analysis scipy


    【解决方案1】:

    可以计算平均距离 |x - 聚类中心|对于簇中的 x,就像对于 K-means 一样。 以下是蛮力的。 (它必须是内置的 在 scipy.cluster 或 scipy.spatial.distance 但我也找不到。)

    关于你的问题 2,通过。欢迎任何关于层次聚类的优秀教程的链接。

    #!/usr/bin/env python
    """ cluster cities: pdist linkage fcluster plot
        util: clusters() avdist()
    """
    
    from __future__ import division
    import sys
    import numpy as np
    import scipy.cluster.hierarchy as hier  # $scipy/cluster/hierarchy.py
    import scipy.spatial.distance as dist
    import pylab as pl
    from citiesin import citiesin  # 1000 US cities
    
    __date__ = "27may 2010 denis"
    
    def clusterlists(T):
        """ T = hier.fcluster( Z, t ) e.g. [a b a b a c]
            -> [ [0 2 4] [1 3] [5] ] sorted by len
        """
        clists = [ [] for j in range( max(T) + 1 )]
        for j, c in enumerate(T):
            clists[c].append( j )
        clists.sort( key=len, reverse=True )
        return clists[:-1]  # clip the []
    
    def avdist( X, to=None ):
        """ av dist X vecs to "to", None: mean(X) """
        if to is None:
            to = np.mean( X, axis=0 )
        return np.mean( dist.cdist( X, [to] ))
    
    #...............................................................................
    Ndata = 100
    method = "average"
    t = 0
    crit = "maxclust"
        # 'maxclust': Finds a minimum threshold `r` so that the cophenetic distance
        # between any two original observations in the same flat cluster
        # is no more than `r` and no more than `t` flat clusters are formed.
        # but t affects cluster sizes only weakly ?
        # t 25: [10, 9, 8, 7, 6
        # t 20: [12, 11, 10, 9, 7
    plot = 0
    seed = 1
    
    exec "\n".join( sys.argv[1:] )  # Ndata= t= ...
    np.random.seed(seed)
    np.set_printoptions( 2, threshold=100, edgeitems=10, suppress=True )  # .2f
    me = __file__.split('/') [-1]
    
        # biggest US cities --
    cities = np.array( citiesin( n=Ndata )[0] )  # N,2
    
    if t == 0:  t = Ndata // 4
    
    #...............................................................................
    print "# %s  Ndata=%d  t=%d  method=%s  crit=%s " % (me, Ndata, t, method, crit)
    
    Y = dist.pdist( cities )  # n*(n-1) / 2
    Z = hier.linkage( Y, method )  # n-1
    T = hier.fcluster( Z, t, criterion=crit )  # n
    
    clusters = clusterlists(T)
    print "cluster sizes:", map( len, clusters )
    print "# average distance to centre in the biggest clusters:"
    for c in clusters:
        if len(c) < len(clusters[0]) // 3:  break
        cit = cities[c].T
        print "%.2g %s" % (avdist(cit.T), cit)
        if plot:
            pl.plot( cit[0], cit[1] )
    
    if plot:
        pl.title( "scipy.cluster.hierarchy of %d US cities, %s t=%d" % (
            Ndata, crit, t) )
        pl.grid(False)
        if plot >= 2:
            pl.savefig( "cities-%d-%d.png" % (Ndata, t), dpi=80 )
        pl.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多