首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从SciPy的分层凝聚聚类中获得质心?

如何从SciPy的分层凝聚聚类中获得质心?
EN

Stack Overflow用户
提问于 2012-02-20 21:56:33
回答 2查看 9.2K关注 0票数 15

我正在使用SciPy的分层凝聚聚类方法对特征的m x n矩阵进行聚类,但在聚类完成后,我似乎找不出如何从得到的聚类中获得质心。下面是我的代码:

代码语言:javascript
运行
复制
Y = distance.pdist(features)
Z = hierarchy.linkage(Y, method = "average", metric = "euclidean")
T = hierarchy.fcluster(Z, 100, criterion = "maxclust")

我使用我的特征矩阵,计算它们之间的欧几里德距离,然后将它们传递给层次聚类方法。从那里,我创建了扁平集群,最多有100个集群

现在,基于扁平簇T,我如何获得代表每个扁平簇的1 x n质心?

EN

回答 2

Stack Overflow用户

发布于 2013-11-12 01:46:59

一种可能的解决方案是一个函数,它像scipy.cluster.vq中的kmeans一样返回带有质心的码本。您只需要使用平面聚类part和原始观察值X将分区划分为向量

代码语言:javascript
运行
复制
def to_codebook(X, part):
    """
    Calculates centroids according to flat cluster assignment

    Parameters
    ----------
    X : array, (n, d)
        The n original observations with d features

    part : array, (n)
        Partition vector. p[n]=c is the cluster assigned to observation n

    Returns
    -------
    codebook : array, (k, d)
        Returns a k x d codebook with k centroids
    """
    codebook = []

    for i in range(part.min(), part.max()+1):
        codebook.append(X[part == i].mean(0))

    return np.vstack(codebook)
票数 2
EN

Stack Overflow用户

发布于 2012-06-30 20:55:15

您可以这样做(D=维度的数量):

代码语言:javascript
运行
复制
# Sum the vectors in each cluster
lens = {}      # will contain the lengths for each cluster
centroids = {} # will contain the centroids of each cluster
for idx,clno in enumerate(T):
    centroids.setdefault(clno,np.zeros(D)) 
    centroids[clno] += features[idx,:]
    lens.setdefault(clno,0)
    lens[clno] += 1
# Divide by number of observations in each cluster to get the centroid
for clno in centroids:
    centroids[clno] /= float(lens[clno])

这将为您提供一个字典,其中簇编号作为关键字,特定簇的质心作为值。

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

https://stackoverflow.com/questions/9362304

复制
相关文章

相似问题

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