首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.cluster.hierarchy教程

scipy.cluster.hierarchy教程
EN

Stack Overflow用户
提问于 2014-02-07 21:32:26
回答 1查看 45.1K关注 0票数 40

我试图了解如何操作层次结构集群,但是文档太.技术?..。我不明白它是怎么工作的。

有什么教程可以帮助我开始,逐步解释一些简单的任务吗?

假设我有以下数据集:

代码语言:javascript
复制
a = np.array([[0,   0  ],
              [1,   0  ],
              [0,   1  ],
              [1,   1  ], 
              [0.5, 0  ],
              [0,   0.5],
              [0.5, 0.5],
              [2,   2  ],
              [2,   3  ],
              [3,   2  ],
              [3,   3  ]])

我可以轻松地完成层次结构集群并绘制树状图:

代码语言:javascript
复制
z = linkage(a)
d = dendrogram(z)
  • 现在,我如何恢复特定的集群?比方说,在树状图中有元素[0,1,2,4,5,6]的那个?
  • 我怎么才能拿回那个元素的值?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-12 09:19:03

分层聚集聚类(HAC)有三个步骤:

  1. 量化数据(metric参数)
  2. 集群数据(method参数)
  3. 选择集群的数量

正在做什么

代码语言:javascript
复制
z = linkage(a)

将完成前两步。由于您没有指定任何参数,所以它使用了标准值。

  1. metric = 'euclidean'
  2. method = 'single'

因此,z = linkage(a)将给您提供一个a的单个链接的层次聚集聚类。这种集群是一种解决方案的层次结构。从这个层次结构中,您可以得到一些有关数据结构的信息。你现在可能做的是:

  • 检查哪个metric是合适的,例如cityblockchebychev将对数据进行不同的量化(cityblockeuclideanchebychev对应于L1L2L_inf规范)
  • 检查methdos的不同性质/行为(如singlecompleteaverage)
  • 检查如何确定集群的数量,例如,通过reading the wiki about it
  • 计算已找到的解决方案(聚类)上的索引,例如silhouette coefficient (通过这个系数,您可以得到关于一个点/观测是否适合于它通过集群分配的集群的质量的反馈)。不同的索引使用不同的标准来限定聚类。

这里有一些事情要开始

代码语言:javascript
复制
import numpy as np
import scipy.cluster.hierarchy as hac
import matplotlib.pyplot as plt


a = np.array([[0.1,   2.5],
              [1.5,   .4 ],
              [0.3,   1  ],
              [1  ,   .8 ],
              [0.5,   0  ],
              [0  ,   0.5],
              [0.5,   0.5],
              [2.7,   2  ],
              [2.2,   3.1],
              [3  ,   2  ],
              [3.2,   1.3]])

fig, axes23 = plt.subplots(2, 3)

for method, axes in zip(['single', 'complete'], axes23):
    z = hac.linkage(a, method=method)

    # Plotting
    axes[0].plot(range(1, len(z)+1), z[::-1, 2])
    knee = np.diff(z[::-1, 2], 2)
    axes[0].plot(range(2, len(z)), knee)

    num_clust1 = knee.argmax() + 2
    knee[knee.argmax()] = 0
    num_clust2 = knee.argmax() + 2

    axes[0].text(num_clust1, z[::-1, 2][num_clust1-1], 'possible\n<- knee point')

    part1 = hac.fcluster(z, num_clust1, 'maxclust')
    part2 = hac.fcluster(z, num_clust2, 'maxclust')

    clr = ['#2200CC' ,'#D9007E' ,'#FF6600' ,'#FFCC00' ,'#ACE600' ,'#0099CC' ,
    '#8900CC' ,'#FF0000' ,'#FF9900' ,'#FFFF00' ,'#00CC01' ,'#0055CC']

    for part, ax in zip([part1, part2], axes[1:]):
        for cluster in set(part):
            ax.scatter(a[part == cluster, 0], a[part == cluster, 1], 
                       color=clr[cluster])

    m = '\n(method: {})'.format(method)
    plt.setp(axes[0], title='Screeplot{}'.format(m), xlabel='partition',
             ylabel='{}\ncluster distance'.format(m))
    plt.setp(axes[1], title='{} Clusters'.format(num_clust1))
    plt.setp(axes[2], title='{} Clusters'.format(num_clust2))

plt.tight_layout()
plt.show()

给出

票数 72
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21638130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档