sklearn.cluster
对未标记的数据进行聚类。 每个聚类算法都有两种变体:一个是类(class)实现的
fit
方法来学习训练数据上的聚类;另一个是函数(function)实现,给定训练数据,返回不同聚类对应的整数标签数组。对于类,可以在
labels_
属性中找到训练数据上的标签。
输入数据 需要注意的一点是,该模块中实现的算法可以将不同类型的矩阵作为输入。所有方法都接受形状为
[n_samples, n_features]
的标准数据矩阵。这些可以从
sklearn.feature_extraction
模块的类中获取。对于
仿射投影(AffinityPropagation)
,
谱聚类(SpectralClustering)
和
DBSCAN
,还可以输入形状为
[n_samples, n_samples]
的相似矩阵。这些可以从
sklearn.metrics.pairwise
模块中的函数获得。
KMeans
算法通过尝试在n组等方差的样本中分离样本来对数据进行聚类,最小化称为
惯量(inertia)或簇内平方和(within-cluster sum-of-squares)的标准(见下文)。此算法要求指定簇的数量。它可以很好地扩展到大量的样本,已在许多不同领域得到了广泛应用。 k-means算法将一组N个样本X划分为k个不相交的簇C,每个簇用该簇中样本的平均
init='k-means++'
参数)。如参考文献中所示,这会将质心初始化为(通常)彼此距离较远,从而产生比随机初始化更好的结果。 该算法支持样本加权,样本权重可以由
sample_weight
参数给出。这允许在计算簇中心和惯性值时为一些样本分配更多的权重。例如,为一个样本指定2的权重相当于将该样本的副本添加到数据集X。 可以给出一个允许K-means并行运行的参数,称为
n_jobs
。给这个参数赋予一个正值,表示使用指定数量的处理器(默认值:1)。值-1表示使用所有可用的处理器,-2表示使用所有可用处理器数量减一个的数量处理器,依此类推。并行化通常以消耗内存为代价加快计算速度(在这种情况下,需要存储多个质心副本,每个作业(job)一个副本)。 **警告:**当
numpy
使用
Accelerate(加速)
框架时,K-Means的并行版本在OS X上被破坏。可以在fork之后调用
Accelerate
,但您需要使用Python二进制文件执行子进程(在posix下,多进程不执行此操作)。 K-means可用于矢量量化(vector quantization)。这是使用
KMeans
训练模型的转换方法(transform method)实现的。
示例:
MiniBatchKMeans
是
KMeans
算法的一个变种,它使用小批量(mini-batches)来减少计算时间,同时仍然试图优化相同的目标函数。小批量是输入数据的子集,在每次训练迭代中随机抽样。这些小批量极大地减少了收敛到局部解所需的计算量。与其他减少k-means收敛时间的算法相比,小批量k-means算法的结果通常只比标准算法稍差。 该算法在两个主要步骤之间迭代,类似于vanilla k-means。在第一步中,从数据集中随机抽取b个样本,形成一个小批量。然后这些样本被分配到最近的质心。在第二步中,质心被更新。与k-means不同的是,k-means是在每个样本(per-sample)的基础上完成的。对于小批量中的每个样本,通过获取该样本和分配给该质心的所有先前样本的流平均值来更新指定的质心,这会降低质心随时间的变化率。执行这些步骤直到收敛或达到预定的迭代次数。
MiniBatchKMeans
的收敛速度比
KMeans
快,但结果的质量会降低。在实践中,这种质量差异可以很小,如示例和引用的参考文献所示。
AffinityPropagation
通过在样本对之间发送消息直到收敛来创建簇(clusters),然后使用少量的示例来描述数据集,这些示例被标识为最具代表性的其他示例。在样本对之间发送的消息表示一个样本作为另一个样本的范例样本的合适程度,合适程度值根据其他样本对的值进行迭代更新,直到收敛,完成最终聚类中心的选取,从而给出最终的聚类。
MeanShift
聚类的目的是在光滑的样本密度中发现
斑点(blobs)。这是一种基于质心的算法,其工作原理是将质心的候选值更新为给定区域内点的平均值。然后,在后处理阶段对这些候选对象进行过滤,以消除近重复项(near-duplicates),形成最终的质心集。 给定第t次迭代的候选质心
bandwidth
,该参数决定了要搜索的区域的大小。此参数可以手动设置,但可以使用提供的
estimate_bandwidth
函数进行估计,如果未设置参数
bandwidth
,则调用此函数。 该算法的可扩展性不高,因为在算法执行过程中需要多次近邻搜索。该算法当质心变化较小时,算法将停止迭代。 通过找到给定样本的最近质心来标记新样本。
amg
求解器用于特征值问题(注意,
amg
解算器要求安装pyamg模块),那么计算将会非常高效。 当前版本的谱聚类要求预先指定簇的数量。它在簇比较少的情况下运行良好,但在簇比较多的情况下不建议使用。 对于两个簇,谱聚类解决了相似图上归一化切割的凸松弛问题:将图一分为二,使得切割的边缘权重比簇内边缘权重小。当处理图像时,这个标准特别有趣,其中图形顶点是像素,并且使用图像的梯度函数计算相似度图的边权重。
similarity = np.exp(-beta * distance / distance.std())
请参阅此类应用程序的示例。
示例:SpectralClustering
的
assign_labels
参数。
"kmeans"
的策略可以匹配更精细的细节,但可能不稳定。特别是,除非您控制
random_state
,否则它可能无法从一次运行复现到另一次运行,因为它取决于随机初始化值。另一种
"discretize"
策略是100%可复现的,但往往会产生相当均匀和几何形状的块(parcels)。
affinity='precomputed'
进行初始化:
>>> from sklearn.cluster import SpectralClustering
>>> sc = SpectralClustering(3, affinity='precomputed', n_init=100,
... assign_labels='discretize')
>>> sc.fit_predict(adjacency_matrix)
参考文献:
sklearn.neighbors.kneighbors_graph
将合并限制为最近的邻居(如本例),或使用
sklearn.feature_extraction.image.grid_to_graph
启用图像上相邻像素的合并(如 硬币 示例)。
示例:
sklearn.neighbors.kneighbors_graph
构建时。在少数簇的限制下,它们倾向于给出一些宏观上占据的簇(occupied clusters)和几乎为空的簇(empty clusters)。(见有无结构的凝聚聚类中的讨论)。在这个问题上,Single linkage是最脆弱的 linkage 选择。
DBSCAN
算法将簇视为被低密度区域分隔的高密度区域。由于这个相当普遍的观点,DBSCAN发现的集群可以是任何形状,而k-means假设集群是凸形的(convex shaped)。DBSCAN的核心部分是
核心样本 的概念,核心样本位于高密度区域。因此,一个簇是一组核心样本,每个样本彼此靠近(通过某种距离度量方法进行测量)和一组靠近核心样本(但本身不是核心样本)的非核心样本。该算法有两个参数,
min_samples
和
eps
,它们正式定义了
稠密 的含义。较大的
min_samples
或较小的
eps
表示形成簇所需的较高密度。 更正式地说,我们将核心样本定义为数据集中的一个样本,使得在
eps
的一段距离范围内存在
min_samples
个其他样本,这些样本被定义为核心样本的
邻居。这告诉我们核心样本在向量空间的密集区域。一个簇是一组核心样本,可以通过递归地获取核心样本、查找邻居中的所有核心样本、查找新获取的核心样本的所有邻居中的所有核心样本等方式来构建。一个簇还会有一组非核心样本,这些样本是簇中核心样本的邻居,但它们本身不是核心样本。直观地说,这些样本位于一个簇的边缘。 根据定义,任何核心样本都是簇的一部分。该算法将非核心样本,且与核心样本的距离至少为
eps
的样本视为离群值(outlier)。 虽然参数
min_samples
主要控制算法对噪声的容忍程度(在有噪声和较大数据集上,可能需要增加此参数),但参数
min_samples
对于数据集和距离函数的
适当选择至关重要,并且通常不能保留默认值。它控制点的局部邻域。当选择的值太小时,大多数数据根本不会被聚类(并标记为-1表示“噪声”)。当选择的值太大时,它会导致相近的聚类合并到一个簇中,并最终将整个数据集作为单个簇返回。文献中已经讨论了一些选择该参数的启发式(heuristics)方法,例如基于最近邻距离图中的knee(如下面的参考文献中所讨论)。 在下图中,颜色表示簇成员属性,大圆圈表示算法找到的核心样本。较小的圆是簇的一部分的非核心样本。此外,离群值(outliers)用下面的黑点表示。
eps
时,就会发生这种情况。根据三角不等式,这两个核样本之间的距离必须大于
eps
,否则它们将在同一个簇中。非核心样本被分配给在数据传递过程中首先生成的集群,因此结果将取决于数据顺序。 This implementation is by default not memory efficient because it constructs a full pairwise similarity matrix in the case where kd-trees or ball-trees cannot be used (e.g., with sparse matrices). This matrix will consume n^2 floats. A couple of mechanisms for getting around this are: 当前的实现使用 ball-trees 和 kd-trees 来确定点的邻域,这避免了计算全距离矩阵(full distance matrix)(如0.14之前的scikit-learn版本中所实现的)。保留使用自定义度量(custom metrics)的可能性;有关详细信息,请参阅
NearestNeighbors
。
大样本的内存消耗 默认情况下,此实现是在无法使用 ball-trees 或 kd-trees (例如,使用稀疏矩阵)的情况下构造完整的成对相似矩阵(full pairwise similarity matrix),因此,该实现内存利用率低。这个矩阵将消耗n^2个浮点数。解决这一问题的两种机制是:
extract_dbscan
方法结合使用。OPTICS聚类计算完整的成对矩阵(pairwise matrix),但一次只在内存中保留一行(内存复杂性n)。metric='precomputed'
运行dbscan。请参见sklearn.neighbors.NearestNeighbors.radius_neighbors_graph
。sample_weight
参数。OPTICS
算法与
DBSCAN
算法有许多相似之处,可以认为是DBSCAN的一个推广,DBSCAN 将
eps
需求从单个值放宽到一个值范围。DBSCAN与OPTICS的关键区别在于,OPTICS算法建立了一个*可达(reachability)*图,该图为每个样本分配了一个
reachability_
距离和一个簇-
ordering_
属性内的点;这两个属性是在模型拟合时分配的,用于确定簇成员。如果OPTICS运行时的
inf 默认值设置为
max_eps
,则可以使用
cluster_optics_dbscan
方法在线性时间内对任何给定的
eps
值重复执行DBSCAN类型的簇提取。将
max_eps
设置为较低的值将导致较短的运行时间,并且可以认为是从每个点距离其他潜在可达点的最大邻域半径(maximum neighborhood radius)。
ordering_
属性,生成可达性图,其中点密度表示在Y轴上,并按顺序排列点,以使附近的点相邻。在单个值上“切割”可达图会产生类似DBSCAN的结果;“切割”上方的所有点都被归类为噪声,每次从左到右读取时出现中断都表示新的簇。默认使用OPTICS的簇提取会查看图中的陡坡(steep slopes)来查找簇,用户可以使用参数
xi
定义什么是陡坡。对图本身的分析也有其他的可能性,例如通过可达图的树状图来生成数据的层次表示,并且该算法检测到的簇的层次可以通过
cluster_hierarchy_
参数来访问。上面的图已经进行了颜色编码(color-coded),使得平面空间中(planar space)的簇颜色与可达图的线性段簇(linear segment clusters)相匹配。请注意,蓝色和红色簇在可达图中相邻,并且可以分层表示为较大父簇的子簇。
示例:
cluster_optics_dbscan
方法和DBSCAN 的结果非常相似,但并不总是完全相同,具体地说,是在标记离群点和噪声点(periphery and noise points)方面。这部分是因为OPTICS 处理的每个密集区域的第一个样本在接近其区域中的其他点时具有很大的可达值,因此有时会标记为噪声点而不是离群点(periphery)。当相邻点被视为可标记为离群点(periphery)或噪声点的候选点时,这会影响相邻点。 注意,对于
eps
的任何单个值,DBSCAN 的运行时间往往比 OPTICS 短,但是在不同
eps
值下重复运行,单个OPTICS运行所需的累计运行时间可能比DBSCAN少。还需要注意的是,只有当
eps
和
max_eps
接近时,OPTICS的输出才接近DBSCAN。
计算复杂度: 空间索引树(Spatial indexing trees)用于避免计算全距离矩阵(full distance matrix),并允许在大样本集上高效使用内存。可以通过
metric
关键字提供不同的距离度量。 对于大型数据集,可以通过HDBSCAN获得相似(但不完全相同)的结果。HDBSCAN实现是多线程的,与OPTICS相比具有更好的算法运行复杂度,但代价是内存扩展性较差。对于使用HDBSCAN耗尽系统内存的超大数据集,OPTICS 将保持n(而不是
max_eps
参数,以便在合理的时间内给出解决方案。
参考文献:
Birch
为给定的数据构建了一种名为聚类特征树(Clustering Feature Tree,简称CFT)的树。数据本质上是有损压缩到一组聚类特征节点(Clustering Feature nodes,即CF Nodes)。CF Nodes 有许聚类特征子簇(Clustering Feature subclusters,即CF subclusters),这些位于非终端CF Nodes中的CF subclusters可以将CF Nodes作为子结点。 CF子簇保存簇的必要信息,从而避免将整个输入数据保存在内存中。这些信息包括:
n_clusters
参数来设置。如果将
n_clusters
设置为None,则直接读取叶中的子簇,否则全局聚类步骤会将这些子簇标记为全局簇(标签),并将样本映射到最近子簇的全局标签。
算法描述:
如何使用 partial_fit? 为了避免全局聚类(global clustering)的计算,建议用户每次调用
- Birch不能很好地适应高维数据。根据经验,如果
n_features
大于20,通常最好使用MiniBatchKMeans。- 如果需要减少数据实例的数量,或者需要大量子簇作为预处理步骤或其他步骤,那么Birch比MiniBatchKMeans更有用。
partial_fit
- 初始设置
n_clusters=None
。- 通过多次调用 partial_fit 来训练所有数据。
- 使用
brc.set_params(n_clusters=n_clusters)
将n_clusters
设置为所需值。- 最后调用不带参数的
partial_fit
,即brc.partial_fit()
,它执行全局聚类。
labels_true
和我们的聚类算法对同样的样本集预测出的类分配:
labels_pred
,
adjusted Rand index是一个用来度量上述两种分配的
相似度(similarity)的函数,而忽略排列和归一化:
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24...
可以在预测的标签中排列(permute)0和1,将2改为3,得到相同的分数:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24...
此外,
adjusted_rand_score
是
对称的:交换参数不会更改得分。因此,它可以作为
共识度量(consensus measure):
>>> metrics.adjusted_rand_score(labels_pred, labels_true)
0.24...
完美标签得分为1.0:
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
1.0
坏的标签(例如独立标签)具有负值或接近0.0的得分:
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
-0.12...
n_clusters
和n_samples
的任何值(这不是未经过调整的Rand index或者V-measure的情况)。labels_true
和我们的聚类算法对同样的样本集预测出的类分配:
labels_pred
,
互信息(Mutual Information)是一个函数,用于度量两个分配集合的一致性,忽略了排列组合。目前可以用这种度量方法的两个不同的归一化版本:规范化互信息(Normalized Mutual Information)(NMI)和调整后的互信息(Adjusted Mutual Information)(AMI)。NMI在文献中可以经常看到,并且针对偶然性进行了标准化:
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504...
可以在预测出的标签中排列0和1,将2改为3,并得到相同的得分:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504...
所有函数,
mutual_info_score
,
adjusted_mutual_info_score
和
normalized_mutual_info_score
都是对称的:交换函数的参数不会改变得分。因此,它们可以用作
共识度量(consensus measure):
>>> metrics.adjusted_mutual_info_score(labels_pred, labels_true)
0.22504...
完美标签分配(Perfect labeling)的得分是1.0:
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
1.0
>>> metrics.normalized_mutual_info_score(labels_true, labels_pred)
1.0
这对于
mutual_info_score
是不成立的,因此该得分更难于判断:
>>> metrics.mutual_info_score(labels_true, labels_pred)
0.69...
坏的标签分配(例如,独立标签)具有负的得分:
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
-0.10526...
n_clusters
和n_samples
的任何值(这不是未经过调整的 互信息(Mutual Information)或者V-measure的情况)。然而,基于互信息的度量还可以在纯粹无监督的设置中作为可用于聚类模型选择的共识索引的构建模块。
NMI和MI不会机会调整。
示例:
聚类算法性能评估中的机会调整:分析数据集大小对随机分配的聚类度量值的影响。此示例还包括Adjusted Rand Index。
假定我们有两个标签分配集合(具有相同N个对象),U和V。它们的熵是划分集的不确定性量,定义如下:
其中是从U集合中随机挑选的一个对象落到
集合中的概率。对于V集合也是一样的:
其中是随机选择的对象落到这两类集合
和
中的概率。
互信息还可以用集合基数(set cardinality)的形式来表示:
归一化的互信息定义为
不管两个标签分配集合之间的互信息实际量有多大,互信息的值包括归一化互信息的值没有针对偶然性进行调整,而且倾向于随着不同标签(聚类)数量的增加而增加。
互信息的期望值可以用等式[VEB2009]。在这个等式中,(
集合中的元素数量)和
(
集合中的元素数量)。
使用了互信息期望值后,经过调整的互信息的计算将使用与ARI(adjusted Rand index)类似的形式进行 :
对于归一化互信息和调整后的互信息,归一化值通常是每个聚类的熵的某个广义均值。有各种广义均值存在,并没有明确的规则说某一个优先于其他的。这个决定很大程度上是取决于各个领域的基础;例如,在社区检测中,算术平均值是最常见的。每一种归一化方法提供“定性相似的行为(qualitatively similar behaviours)” [YAT2016]。在我们的实现中,由 average_method
参数控制。
Vinh et al. (2010)对各种NMI和AMI的变体用它们使用的平均方法进行了命名[VEB2010]。他们在论文里说的‘sqrt’和‘sum’ 平均分别是几何和算数平均;我们使用这些更广泛的通用名称。
参考文献
Strehl, Alexander, and Joydeep Ghosh (2002). “Cluster ensembles – a knowledge reuse framework for combining multiple partitions”. Journal of Machine Learning Research 3: 583–617. doi:10.1162/153244303321897735.
Wikipedia entry for the (normalized) Mutual Information
Wikipedia entry for the Adjusted Mutual Information
[VEB2009] Vinh, Epps, and Bailey, (2009). “Information theoretic measures for clusterings comparison”. Proceedings of the 26th Annual International Conference on Machine Learning - ICML ‘09. doi:10.1145/1553374.1553511. ISBN 9781605585161.
[VEB2010] Vinh, Epps, and Bailey, (2010). “Information Theoretic Measures for Clusterings Comparison: Variants, Properties, Normalization and Correction for Chance”. JMLR http://jmlr.csail.mit.edu/papers/volume11/vinh10a/vinh10a.pdf
[YAT2016] Yang, Algesheimer, and Tessone, (2016). “A comparative analysis of community detection algorithms on artificial networks”. Scientific Reports 6: 30750. doi:10.1038/srep30750.
homogeneity_score
和
completeness_score
函数。这两个函数的返回值都是介于0到1之间(返回值越高越好):
>>> from sklearn import metrics>>> labels_true = [0, 0, 0, 1, 1, 1]>>> labels_pred = [0, 0, 1, 1, 2, 2]>>> metrics.homogeneity_score(labels_true, labels_pred)0.66...>>> metrics.completeness_score(labels_true, labels_pred)0.42...
他们调和平均数称为
V-度量(V-measure),通过函数
v_measure_score
来计算:
>>> metrics.v_measure_score(labels_true, labels_pred)0.51...
该函数的公式如下:
beta
默认值为1.0,但可以给beta传入小于1的值:
>>> metrics.v_measure_score(labels_true, labels_pred, beta=0.6)0.54...
更多权重将归因于同质性,并且给beta传入大于1的值:
>>> metrics.v_measure_score(labels_true, labels_pred, beta=1.8)0.48...
更多权重将归因于完整性。 如果使用聚合函数是算术平均值[B2011],V-度量实际上等效于上面讨论的互信息(NMI)。 同质性,完备性和V-度量可使用以下方法
homogeneity_completeness_v_measure
一次性计算出来 :
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
(0.66..., 0.42..., 0.51...)
下面的聚类分配稍微好一点,因为它是同质的,但却不是完整的:
>>> labels_pred = [0, 0, 0, 1, 2, 2]>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
(1.0, 0.68..., 0.81...)
注意:
v_measure_score
是
对称的:可用于评估同一数据集上两个独立分配(independent assignments)的
一致性。
completeness_score
和
homogeneity_score
的情况并非如此:两者都受以下关系约束:
homogeneity_score(a, b) == completeness_score(b, a)
sklearn.metrics.fowlkes_mallows_score
)。Fowlkes-Mallows得分FMI,定义为成对精度(pairwise precision)和成对召回率(pairwise recall)的几何平均值:
TP
是
True Positive的数量(例如,在真实标签集中和预测标签集中属于相同聚类的点对的数量),
FP
是
False Positive的数量(例如,在真实标签集中但不在预测标签集中属于相同聚类的点对的数量),
FN
是
False Negative的数量(例如,不在真实标签集中但在预测标签集中属于相同簇的点对的数量)。 FMI得分取值范围在0到1之间。取值越高表明两个聚类之间的相似性越好。
>>> from sklearn import metrics>>> labels_true = [0, 0, 0, 1, 1, 1]>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)0.47140...
可以在预测出的标签中重新排列0和1,将2改为3,并得到相同的得分:
>>> labels_pred = [1, 1, 0, 0, 3, 3]>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)0.47140...
完美标记的得分是1.0:
>>> labels_pred = labels_true[:]
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)
1.0
坏的标记(例如,独立标签)的得分是0:
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)0.0
n_clusters
和 n_samples
的任何值(这不是未处理的互信息(raw Mutual Information)或者V-度量的情况)。
sklearn.metrics.silhouette_score
)就是这样一种评估的指标,其中较高的轮廓系数得分对应于具有更好的聚类能力的模型。轮廓系数定义在每个样本上,并且由两个得分组成:
>>> from sklearn import metrics>>> from sklearn.metrics import pairwise_distances>>> from sklearn import datasets>>> X, y = datasets.load_iris(return_X_y=True)
在正常使用中,轮廓系数将应用于聚类结果的分析中。
>>> import numpy as np
>>> from sklearn.cluster import KMeans
>>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans_model.labels_
>>> metrics.silhouette_score(X, labels, metric='euclidean')
0.55...
参考文献
sklearn.metrics.calinski_harabasz_score
)来评估模型,其中较高的Calinski-Harabasz分数与具有更好定义的簇的模型相关。 此指数(index)是所有簇的簇间色散(between-clusters dispersion)和簇内色散(inter-cluster dispersion)之和的比率(其中色散(dispersion)定义为距离的平方和):
>>> from sklearn import metrics
>>> from sklearn.metrics import pairwise_distances
>>> from sklearn import datasets
>>> X, y = datasets.load_iris(return_X_y=True)
在常规用法中,Calinski-Harabasz指数应用于聚类分析的结果:
>>> import numpy as np
>>> from sklearn.cluster import KMeans
>>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans_model.labels_
>>> metrics.calinski_harabasz_score(X, labels)
561.62...
sklearn.metrics.davies_bouldin_score
) 来评估模型,其中较低的Davies-Bouldin index与聚类之间分离较好的模型相关。 此指数(index)表示集群之间的平均“相似性”,其中相似性是比较集群之间的距离和集群本身大小的度量。 零是可能的最低分。接近零的值表示更好的分区。 在正常使用中,Davies-Bouldin index应用于聚类分析的结果,如下所示:
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> X = iris.data
>>> from sklearn.cluster import KMeans
>>> from sklearn.metrics import davies_bouldin_score
>>> kmeans = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans.labels_
>>> davies_bouldin_score(X, labels)
0.6619...
sklearn.metrics.cluster.contingency_matrix
)报告每个真实/预测的簇对的交集基数(intersection cardinality)。列联矩阵为所有的聚类度量(clustering metrics)提供了足够的统计信息,其中样本是独立的、相同分布的,并且不需要考虑一些没有被聚类的实例。 下面是一个例子:
>>> from sklearn.metrics.cluster import contingency_matrix
>>> x = ["a", "a", "a", "b", "b", "b"]
>>> y = [0, 0, 1, 1, 2, 2]
>>> contingency_matrix(x, y)
array([[2, 1, 0],
[0, 1, 2]])
输出数组的第一行表示有三个样本的真实簇是“a”。其中,两个在预测簇(predicted cluster) 0中,一个在1中,没有一个在2中。第二行表示有三个样本的真实簇为“b”。其中,没有一个在预测的集群0中,一个在1中,两个在2中。 分类的混淆矩阵(confusion matrix)是一个平方列联矩阵,其中行和列的顺序对应于类的列表。 10.8.1. 优点
文壹由“伴编辑器”提供技术支持
☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:
欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler,备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)