Как получить центроиды из иерархической агломерационной кластеризации SciPy? - PullRequest
13 голосов
/ 20 февраля 2012

Я использую методы иерархической агломеративной кластеризации SciPy для кластеризации матрицы функций amxn, но после завершения кластеризации я не могу понять, как получить центроид из полученных кластеров.Ниже следует мой код:

Y = distance.pdist(features)
Z = hierarchy.linkage(Y, method = "average", metric = "euclidean")
T = hierarchy.fcluster(Z, 100, criterion = "maxclust")

Я беру свою матрицу функций, вычисляю евклидово расстояние между ними, а затем передаю их в метод иерархической кластеризации.Оттуда я создаю плоские кластеры, максимум 100 кластеров

Теперь, основываясь на плоских кластерах T, как мне получить 1 xn центроид, который представляет каждый плоский кластер?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2013

Возможным решением является функция, которая возвращает кодовую книгу с центроидами, как kmeans в scipy.cluster.vq.Единственное, что вам нужно, это разбиение как вектор с плоскими кластерами part и исходные наблюдения X

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)
0 голосов
/ 30 июня 2012

Вы можете сделать что-то вроде этого (D = количество измерений):

# 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])

Это даст вам словарь с номером кластера в качестве ключа и центроид конкретного кластера в качестве значения.

...