2015-12-02 44 views
2

我正在使用sklearn.mixtureGaussian Mixture Model (GMM)来执行我的数据集的聚类。Python集群'纯度'度量

我可以使用函数score()来计算模型下的对数概率。

但是,我正在寻找一种称为'纯度'的度量标准,它在​​中定义。

我该如何在Python中实现它?我当前的实现看起来是这样的:

from sklearn.mixture import GMM 

# X is a 1000 x 2 array (1000 samples of 2 coordinates). 
# It is actually a 2 dimensional PCA projection of data 
# extracted from the MNIST dataset, but this random array 
# is equivalent as far as the code is concerned. 
X = np.random.rand(1000, 2) 

clusterer = GMM(3, 'diag') 
clusterer.fit(X) 
cluster_labels = clusterer.predict(X) 

# Now I can count the labels for each cluster.. 
count0 = list(cluster_labels).count(0) 
count1 = list(cluster_labels).count(1) 
count2 = list(cluster_labels).count(2) 

但我可以通过每个集群,以计算混淆矩阵不是循环(根据本question

+1

该论文是相当不透明。 [这个答案](http://stats.stackexchange.com/a/154379/89612)上的交叉验证简化了一下程序。 – kdbanman

+0

请发布您到目前为止的代码,并告诉我们所涉及的数据结构。 – kdbanman

+0

目前,我的代码是: '从sklearn.mixture进口GMM 人聚类= GMM(5 '诊断') clusterer.fit(X) cluster_labels = clusterer.predict(X)' 我看到,在为了计算纯度我需要混淆矩阵。现在,我的问题是,我无法遍历每个群集,并计算每个类别分为多少个对象。 – Kuka

回答

2

sklearn没有实现集群纯度指标。您有2个选项:

  1. 您自己使用sklearn数据结构实施测量。 Thisthis有一些用于测量纯度的python源代码,但是您的数据或函数体需要适应彼此的兼容性。

  2. 使用(不太成熟的)PML库,它实现了簇的纯度。

0

一个很晚的贡献。

你可以尝试实现它这个样子,很像在这个gist

from sklearn.metrics import accuracy_score 
import numpy as np 

def purity_score(y_true, y_pred): 
    # matrix which will hold the majority-voted labels 
    y_labeled_voted = np.zeros(y_true.shape) 
    labels = np.unique(y_true) 
    # We set the number of bins to be n_classes+2 so that 
    # we count the actual occurence of classes between two consecutive bin 
    # the bigger being excluded [bin_i, bin_i+1[ 
    bins = np.concatenate((labels, [np.max(labels)+1]), axis=0) 

    for cluster in np.unique(y_pred): 
     hist, _ = np.histogram(y_true[y_pred==cluster], bins=bins) 
     # Find the most present label in the cluster 
     winner = np.argmax(hist) 
     y_labeled_voted[y_pred==cluster] = winner 

    return accuracy_score(y_true, y_labeled_voted)