【问题标题】:sklearn agglomerative clustering: dynamically updating the number of clusterssklearn 凝聚聚类:动态更新聚类数量
【发布时间】:2016-07-29 03:57:17
【问题描述】:

sklearn.cluster.AgglomerativeClustering 的文档提到,

当改变集群数量并使用缓存时, 计算完整的树可能是有利的。

这似乎意味着可以先计算完整的树,然后根据需要快速更新所需集群的数量,而无需重新计算树(使用缓存)。

但是,似乎没有记录此更改集群数量的过程。我想这样做,但不确定如何进行。

更新:澄清一下,fit 方法不将簇数作为输入: http://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html#sklearn.cluster.AgglomerativeClustering.fit

【问题讨论】:

    标签: python scikit-learn hierarchical-clustering


    【解决方案1】:

    我知道这是一个老问题,但是下面的解决方案可能会有所帮助

    # scores = input matrix
    
    from scipy.cluster.hierarchy import linkage
    from scipy.cluster.hierarchy import cut_tree
    from sklearn.metrics import silhouette_score
    from sklearn.metrics.pairwise import euclidean_distances
    
    linkage_mat = linkage(scores, method="ward")
    euc_scores = euclidean_distances(scores)
    
    n_l = 2
    n_h = scores.shape[0]
    
    silh_score = -2
    # Selecting the best number of clusters based on the silhouette score
    for i in range(n_l, n_h):
        local_labels = list(cut_tree(linkage_mat, n_clusters=i).flatten())
        sc = silhouette_score(
            euc_scores,
            metric="precomputed",
            labels=local_labels,
            random_state=42)
        if silh_score < sc:
            silh_score = sc
            labels = local_labels
    
    n_clusters = len(set(labels))
    print(f"Optimal number of clusters: {n_clusters}")
    print(f"Best silhouette score: {silh_score}")
    # ...
    

    【讨论】:

      【解决方案2】:

      您使用参数memory = 'mycachedir' 设置一个缓存目录,然后如果您设置compute_full_tree=True,当您使用不同的n_clusters 值重新运行fit 时,它将使用缓存树而不是每次都重新计算。举个例子,说明如何使用 sklearn 的 gridsearch API 做到这一点:

      from sklearn.cluster import AgglomerativeClustering
      from sklearn.grid_search import GridSearchCV
      
      ac = AgglomerativeClustering(memory='mycachedir', 
                                   compute_full_tree=True)
      classifier = GridSearchCV(ac, 
                                {n_clusters: range(2,6)}, 
                                scoring = 'adjusted_rand_score', 
                                n_jobs=-1, verbose=2)
      classifier.fit(X,y)
      

      【讨论】:

      • 感谢您的帮助,但是 fit 方法不会将 n_clusters 作为输入:scikit-learn.org/stable/modules/generated/…
      • 我又看了看,似乎正确的方法是通过 model.set_params(n_clusters=x) scikit-learn.org/stable/modules/generated/…
      • 您永远不会将参数传递给 fit 方法,而是在初始化分类器时设置它们,例如ac = AgglomerativeClustering(memory='mycachedir', compute_full_tree=True, n_clusters=10)(这实际上正是 set_params 正在做的事情,但这是您不需要的额外步骤)
      • 是的,但我的目标是在不重新计算树的情况下动态更新集群的数量:看来我只能使用 set_params 来做到这一点。
      • 尝试不同超参数的常用方法是通过使用GridsearchCV 的网格搜索,试试这些设置,希望它会使用缓存树(并且您的代码会更干净)
      猜你喜欢
      • 2017-12-03
      • 2023-03-12
      • 2015-01-07
      • 2019-05-19
      • 1970-01-01
      • 2014-06-28
      • 2018-04-29
      • 2019-03-28
      相关资源
      最近更新 更多