Python 无监督学习实用指南:1~5(2)

简介: Python 无监督学习实用指南:1~5(2)

Python 无监督学习实用指南:1~5(1)https://developer.aliyun.com/article/1426880

第一个结果是,如果我们选择N的值,则当p → ∞时,距离收缩并饱和。 这是 Minkowski 距离结构的正常结果,但敏锐的读者可能会注意到另一个特征。 让我们想象一下将1N向量的成分之一设置为等于0.0。 这等效于从N维超立方体的顶点移动到另一个顶点。 距离会怎样? 好吧,用一个例子很容易证明,当p → ∞时,两个距离收敛到相同的值。 特别是被 Aggarwal,Hinneburg 和 Keim(在《关于高度量空间中距离度量的惊人行为》中)证明是重要的结果。

假设我们有M个二元样本的分布p(x)x[i] ∈ (0, 1)^d。 如果采用 Minkowski 度量,则可以计算最大值(Dmax^p)和最小值(Dmin^p)从p(x)采样的两个点与原点之间的距离(通常,该距离可以通过解析来计算,但是也可以使用迭代程序持续采样,直到Dmax^pDmin^p停止更改)。 作者证明以下不等式成立:

在先前的公式中,C[p]是取决于p的常数。 当p → ∞时,期望值E[D[max]^p - D[min]^p] * i在边界k[1] C[p] d^(1 / p- 1/2)(M-1) C[p] d^(1 / p-1 / 2)。 当p > 2d → ∞时,项d^(1 / p-1 / 2) → 0,最大和最小距离之差的期望值收敛到0。 这意味着,独立于样本,当维数足够高且p > 2时,几乎不可能使用 Minkowski 距离来区分两个样本。 当我们发现距离函数的相似性时,该定理警告我们选择d >> 1时选择p较大的值。 当d >> 1(即使p = 1是最佳选择)时,欧几里德度量标准的常用选择也相当可靠,因为它对组件的权重产生最小的效果(可以假定它们具有相同的权重),并保证在高维空间中的可区分性。 相反,高维空间中的p >> 2对于所有最大分量保持固定而所有其他分量都被修改的样本,则产生无法区分的距离(例如,如果x = (5, 0) → (5, a),其中|a| < 5),如以下示例所示 :

import numpy as np
from scipy.spatial.distance import cdist
distances = []
for i in range(1, 2500, 10):
    d = cdist(np.array([[0, 0]]), np.array([[5, float(i/500)]]), metric='minkowski', p=15)[0][0]
    distances.append(d)
print('Avg(distances) = {}'.format(np.mean(distances)))
print('Std(distances) = {}'.format(np.std(distances)))

输出如下:

Avg(distances) = 5.0168687736484765
Std(distances) = 0.042885311128215066

因此,对于p = 15,对于x ∈ [0.002, 5.0)的所有样本(5, x),与原点之间的距离均值约为5.0并且标准差为0.04。 当p变大时,Avg(distances) = 5.0Std(distances) = 0.04

在这一点上,我们可以开始讨论一种最常见且被广泛采用的聚类算法:K-means。

K 均值

K 均值是最大分离和最大内部凝聚力原理的最简单实现。 假设我们有一个数据集X ∈ R^(M×N)(即MN维样本),我们希望将其拆分为K群集和一组K重心,它们对应于分配给每个群集K[j]的样本均值:

集合M和质心具有一个附加索引(作为上标),指示迭代步骤。 从初始猜测M^(0)开始,K 均值尝试最小化称为惯性的目标函数(即总平均集群内距离) 分配给群集K[j]和其质心μ[j]的样本之间):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBQ6qpor-1681652575093)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-unsup-learn-py/img/56a960f6-4a96-4e97-883e-17277d02904c.png)]

不难理解, S(t)不能被视为绝对度量,因为其值在很大程度上受样本方差的影响。 但是,S(t + 1) < S(t)表示质心正在靠近最佳位置,在最佳位置,分配给聚类的点与相应质心的距离最小。 因此,迭代过程(也称为 Lloyd 算法)开始于使用随机值初始化M^(0)。 下一步是将每个样本x[i] ∈ X分配给群集,其质心与x[i]距离最小:

完成所有分配后,将重新计算新的质心作为算术方法:

重复该过程,直到质心停止变化为止(这也意味着序列S(0) > S(1) > ... > S(t[end]))。 读者应该立即了解到,计算时间受初始猜测的影响很大。 如果M^(0)非常接近M^t[end],则可以找到一些迭代的最佳配置。 相反,当M^(0)纯粹是随机的时,无效初始选择的概率接近1(也就是说,每个初始的均匀随机选择,在计算复杂度方面几乎等价)。

KMeans++

找到最佳的初始配置等同于最小化惯性。 但是, Arthur 和 Vassilvitskii(在《KMeans++:精心播种的优势》中)提出了另一种初始化方法(称为 KMeans++),该方法可以通过选择初始质心的可能性大得多,从而提高收敛速度,而初始质心的概率接近最终质心。 完整的证明非常复杂,可以在前述论文中找到。 在这种情况下,我们直接提供最终结果和一些重要后果。

让我们考虑定义为的函数D(·)

D(·)表示样本x ∈ X与已选择的质心之间的最短距离。 一旦函数被计算,就可以如下确定概率分布G(x)

从均匀分布中采样第一个质心μ[1]。 此时,可以为所有样本x ∈ X计算D(·),因此,可以计算出分布G(x)。 直截了当,如果我们从G(x)进行采样,那么在稠密区域中选择值的概率要比在均匀区域中均匀采样或选取质心的概率大得多。 因此,我们继续从G(x)中采样μ[2]。 重复该过程,直到确定所有K重心。 当然,由于这是一种概率方法,因此我们无法保证最终配置是最佳的。 但是,使用 K-means++ 是具有竞争力的O(log K)。 实际上,如果S[opt]S的理论最优值,则作者证明存在以下不等式:

由于通过更好的选择降低了S,因此先前的公式设置了与log K大致成比例的期望值E[S]的上限。 例如,对于K = 10E[S] <= S [opt],并且对于K = 3E[S] <= 12.87 * S[opt]K = 3。 该结果揭示了两个重要因素。 第一个是当K不太大时,KMeans++ 的表现会更好;第二个(可能也是最重要的)是,单个 KMeans++ 初始化不足以获取最佳配置。 因此,常见的实现(例如 scikit-learn)执行可变数量的初始化,并选择初始惯量最小的初始化。

乳腺癌威斯康星州数据集分析

在本章中,我们使用著名的乳腺癌威斯康星州数据集进行聚类分析。 最初,提出数据集是为了训练分类器。 但是,这对于非平凡的聚类分析非常有帮助。 它包含由 32 个属性(包括诊断和标识号)组成的 569 条记录。 所有属性都与肿瘤的生物学和形态学特性严格相关,但是我们的目标是考虑基本事实(良性或恶性)和数据集的统计特性来验证通用假设。 在继续之前,弄清楚一些要点很重要。 数据集是高维的,聚类是非凸的(因此我们不能期望有完美的分割)。 此外,我们的目标不是使用聚类算法来获得分类器的结果; 因此,必须仅将真实情况作为潜在分组的一般指示。 该示例的目的是演示如何执行简短的初步分析,选择最佳数量的聚类以及验证最终结果。

下载后(如技术要求部分所述),CSV 文件必须放在我们通常表示为的文件夹中。 第一步是加载数据集,并通过 Pandas DataFrame暴露的函数describe()进行全局统计分析,如下所示:

import numpy as np
import pandas as pd
bc_dataset_path = '<data_path>\wdbc.data'
bc_dataset_columns = ['id','diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean', 
 'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean', 
 'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',
 'radius_se','texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 
 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se', 
 'fractal_dimension_se', 'radius_worst', 'texture_worst', 'perimeter_worst', 
 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst',
 'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst']
df = pd.read_csv(bc_dataset_path, index_col=0, names=bc_dataset_columns).fillna(0.0)
print(df.describe())

我强烈建议使用 Jupyter 笔记本(在这种情况下,命令必须仅是df.describe()),所有命令都将产生内联输出。 出于实际原因,在以下屏幕截图中,显示了表格输出的第一部分(包含八个属性):

数据集前八个属性的统计报告

当然,即使我们仅将注意力集中在子集上,我也请读者检查所有属性的值。 特别是,我们需要观察前八个属性之间存在的不同尺度。 标准差的范围是 0.01 到 350,这意味着仅由于一个或两个属性,许多向量可能极其相似。 另一方面,使用方差缩放对值进行归一化将赋予所有属性相同的责任(例如143.52501之间的界限为area_mean,而0.05smoothness_mean之间的界限为smoothness_mean。 强迫它们具有相同的方差会影响因素的生物学影响,并且由于我们没有任何具体的指示,因此我们没有授权做出这样的选择)。 显然,某些属性在聚类过程中将具有更高的权重,我们将它们的主要影响视为与上下文相关的条件。

让我们现在开始考虑perimeter_meanarea_meansmoothness_meanconcavity_meansymmetry_mean的对图的初步分析。 该图显示在以下屏幕截图中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UpUCek57-1681652575095)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/handson-unsup-learn-py/img/547f2d24-2fa1-442a-9fae-48d8f2101df3.png)]

周边平均值,面积平均值,平滑度平均值,凹度平均值和对称平均值的成对图

该图将每个非对角线属性绘制为其他所有属性的函数,而对角线图则表示每个属性分为两个部分的分布(在这种情况下,这就是诊断)。 因此,第二个非对角线图(左上图)是perimeter_mean作为area_mean的函数的图,依此类推。 快速分析突出了一些有趣的元素:

  • area_meanperimeter_mean具有明确的相关性,并确定了清晰的间隔。 当area_mean大于约 1,000 时,显然周长也会增加,并且诊断会从良性突然转变为恶性。 因此,这两个属性是最终结果的决定因素,并且其中之一很可能是多余的。
  • 其他图(例如perimeter_mean / area_meansmoothness_meanarea_meansymmetry_meanconcavity_meansmoothness_meanconcavity_meansymmetry_mean)具有水平间距( 变为垂直反转轴)。 这意味着,对于独立变量(x轴)假定的几乎所有值,都有一个阈值将另一个变量的值分成两组(良性和恶性)。
  • 一些图(例如perimeter_mean / area_meanconcavity_mean / concavity_meansymmetry_mean)显示了略微负的斜对角线间距。 这意味着,当自变量较小时,诊断几乎对因变量的所有值均保持不变,而另一方面,当自变量变得越来越大时,诊断将按比例切换为相反的值。 例如,对于较小的perimeter_mean值,concavity_mean可以达到最大值而不影响诊断(良性),而perimeter_mean > 150总是独立于concavity_mean进行恶性诊断。

当然,我们不能轻易地从拆分分析中得出结论(因为我们需要考虑所有交互作用),但是此活动将有助于为每个群集提供语义标签。 此时,通过 T 分布随机邻居嵌入t-SNE)变换(对于进一步的细节,请查看《使用 t-SNE 可视化数据》)。 可以按照以下步骤进行:

import pandas as pd
from sklearn.manifold import TSNE
cdf = df.drop(['diagnosis'], axis=1)
tsne = TSNE(n_components=2, perplexity=10, random_state=1000)
data_tsne = tsne.fit_transform(cdf)
df_tsne = pd.DataFrame(data_tsne, columns=['x', 'y'], index=cdf.index)
dff = pd.concat([df, df_tsne], axis=1)

生成的绘图显示在以下屏幕截图中:

乳腺癌威斯康星州数据集的二维 t-SNE 图

该图是高度非线性的(别忘了这是从ℜ^30ℜ^2的投影),恶性样本中的一半在半平面y < 0中。 不幸的是,在该区域中也有适度的良性样本,因此我们不期望使用K = 2进行完美分离(在这种情况下,很难理解真实的几何形状,但是 t- SNE 保证二维分布的 Kullback-Leibler 散度与原始高维散度最小。 现在,我们以K = 2进行初始聚类。 我们将使用n_clusters=2max_iter=1000创建KMeans scikit-learn 类的实例(random_state始终设置为等于1000)。

其余参数为默认参数(使用 10 次尝试的 KMeans++ 初始化),如下所示:

import pandas as pd
from sklearn.cluster import KMeans
km = KMeans(n_clusters=2, max_iter=1000, random_state=1000)
Y_pred = km.fit_predict(cdf)
df_km = pd.DataFrame(Y_pred, columns=['prediction'], index=cdf.index)
kmdff = pd.concat([dff, df_km], axis=1)

生成的绘图显示在以下屏幕截图中:

乳腺癌威斯康星州数据集的 K 均值聚类(K = 2

毫不奇怪,该结果对于y < -20相当准确,但该算法无法同时包含边界点(y≈0)进入主要恶性集群。 这主要是由于原始集合的非凸性,并且使用 K 均值很难解决问题。 此外,在投影中,大多数y ≈ 0的恶性样本与良性样本混合在一起,因此,使用基于接近度的其他方法的错误概率也很高。 正确分离这些样本的唯一机会来自原始分布。 实际上,如果可以通过ℜ^30中的不相交球捕获属于同一类别的点,则 K 均值也可以成功。 不幸的是,在这种情况下,混合集看起来非常具有内聚性,因此我们不能指望不进行转换就可以提高性能。 但是,出于我们的目的,此结果使我们可以应用主要评估指标,然后从K > 2移到更大的值。 我们将使用K > 2分析一些聚类,并将它们的结构与配对图进行比较。

评估指标

在本节中,我们将分析一些可用于评估聚类算法表现并帮助找到最佳聚类数量的常用方法。

最小化惯性

K 均值和类似算法的最大缺点之一是对群集数的明确要求。 有时,这条信息是由外部约束施加的(例如,在乳腺癌的情况下,只有两种可能的诊断),但是在许多情况下(需要进行探索性分析时),数据科学家必须检查不同的配置并评估它们。 评估 K 均值表现并选择适当数量的聚类的最简单方法是基于不同最终惯性的比较。

让我们从下面的简单示例开始,该示例基于 scikit-learn 函数make_blobs()生成的 12 个非常紧凑的高斯 Blob:

from sklearn.datasets import make_blobs
X, Y = make_blobs(n_samples=2000, n_features=2, centers=12, 
                  cluster_std=0.05, center_box=[-5, 5], random_state=100)

以下屏幕快照中显示了斑点。

数据集由 12 个不相交的二维 Blob 组成

现在让我们计算K ∈ [2, 20]的惯性(在经过训练的KMeans模型中作为实例变量inertia_可用),如下所示:

from sklearn.cluster import KMeans
inertias = []
for i in range(2, 21):
    km = KMeans(n_clusters=i, max_iter=1000, random_state=1000)
    km.fit(X)
    inertias.append(km.inertia_)

结果图为,如下所示 :

惯性与群集数的关系

上图显示了一种常见行为。 当团群集的数量非常小时,密度成比例地降低,因此内聚降低,结果,惯性也高。 群集数的增加会迫使模型创建更多的内聚组,并且惯性开始突然减小。 如果继续此过程,并且M > > K ,我们将观察到非常慢的方法,接近与K = M的配置对应的值(每个样本都是群集)。 通用启发式规则(在没有外部约束的情况下)是选择与将高变化区域与几乎平坦区域分开的点相对应的聚类数目。 这样,我们可以确保所有群集都达到了最大的凝聚力,而没有内部碎片。 当然,在这种情况下,如果我们选择K = 15,则将九个斑点分配给不同的群集,而其他三个斑点将分为两部分。 显然,当我们划分一个高密度区域时,惯性仍然很低,但是不再遵循最大分离的原理。

现在,我们可以使用K ∈ [2, 50],的乳腺癌威斯康星数据集重复该实验,如下所示:

from sklearn.cluster import KMeans
inertias = []
for i in range(2, 51):
    km = KMeans(n_clusters=i, max_iter=1000, random_state=1000)
    km.fit(cdf)
    inertias.append(km.inertia_)

生成的绘图显示在以下屏幕截图中:

惯性,作为乳腺癌威斯康星州数据集的群集数的函数

在这种情况下,基本事实表明,我们应该根据诊断将其分为两组。 但是,该图显示了急剧下降,下降到K = 8并以较低的斜率继续,直到大约K = 40为止。 在初步分析过程中,我们已经看到二维投影由具有相同诊断的许多孤立的斑点组成。 因此,我们可以决定采用例如K = 8并分析与每个群集相对应的特征。 由于这不是分类任务,因此可以将真实情况用作主要参考,但是正确的探索性分析可以尝试理解子结构的组成,以便为技术人员(例如,医生)提供更多详细信息。

现在,我们在乳腺癌威斯康星州数据集上对八个聚类进行 K 均值聚类,以描述两个样本组, 的结构,如下所示

import pandas as pd
from sklearn.cluster import KMeans
km = KMeans(n_clusters=8, max_iter=1000, random_state=1000)
Y_pred = km.fit_predict(cdf)
df_km = pd.DataFrame(Y_pred, columns=['prediction'], index=cdf.index)
kmdff = pd.concat([dff, df_km], axis=1)

生成的绘图显示在以下屏幕截图中:

乳腺癌威斯康星州数据集的 K 均值聚类(K = 8)结果

现在,让我们考虑位于图底部的子群集(-25 < x < 30-60 < y < -40) , 如下:

sdff = dff[(dff.x > -25.0) & (dff.x < 30.0) & (dff.y > -60.0) & (dff.y < -40.0)]
print(sdff[['perimeter_mean', 'area_mean', 'smoothness_mean', 
            'concavity_mean', 'symmetry_mean']].describe())

以下屏幕截图显示了统计表的打印友好版本:

恶性群集的统计描述

根据事实,我们知道所有这些样本都是恶性的,但是我们可以尝试确定一个规则。 area_mean / perimeter_mean之比约为9.23,相对于平均值,相对标准差非常小。 这意味着这些样本在非常狭窄的范围内代表了扩展的肿瘤。 而且,concavity_meansymmetry_mean均大于总值。 因此(在不进行科学合理分析的前提下),我们可以得出结论,分配给这些群集的样本代表了已经进入晚期的非常糟糕的肿瘤。

为了与良性样本进行比较,现在考虑由x > -1020 < y < 50界定的区域如下:

sdff = dff[(dff.x > -10.0) & (dff.y > 20.0) & (dff.y < 50.0)]
print(sdff[['perimeter_mean', 'area_mean', 'smoothness_mean',
            'concavity_mean', 'symmetry_mean']].describe())

结果显示在以下屏幕截图中:

良性群集的统计描述

在这种情况下,比 area_mean / perimeter_mean 约为4.89,但是area_mean具有较大的标准差(实际上,其最大值约为410)。 concavity_mean相对于前一个非常小(即使具有近似相同的标准差),而symmetry_mean几乎相等。 从这个简短的分析中,我们可以推断出symmetry_mean不是判别特征,而concavity_mean的比值area_mean / perimeter_mean小于5.42(考虑最大值)。 小于或等于0.04应当保证良性结果。 由于concavity_mean可以达到非常大的最大值(大于与恶性样本相关的最大值),因此有必要考虑其他特征,以便确定是否应将其值视为警报。 但是,我们可以得出结论,说属于这些群集的所有样本都是良性的,错误概率可以忽略不计。 我想重复一遍,这不是真正的分析,而是更多的练习,在这种情况下,数据科学家的主要任务是收集可以支持结论的上下文信息。 即使存在基本事实,该验证过程也始终是强制性的,因为根本原因的复杂性可能导致完全错误的陈述和规则。

轮廓分数

在不了解基本事实的情况下评估聚类算法表现的最常见方法是轮廓分数。 它既提供了每个样本的索引,又提供了整体的图形表示,显示了群集的内部一致性和分离程度。 为了计算分数,我们需要引入两个辅助措施。 第一个是x[i] ∈ K[j]的平均群内距离,假设|K[j]| = n(j)

对于 K 均值,假定距离为欧几里得,但没有特定限制。 当然, d(·)必须与聚类过程中使用的距离函数相同。

给定样本x[i] ∈ K[j],让我们将最近的群集表示为K[c]。 这样,我们还可以定义最小最近集群距离(作为平均最近集群距离):

通过这两个度量,我们可以定义x[i] ∈ X的轮廓分数:

分数s(•) ∈ (-1, 1)。 当s(•) → -1时,意味着b(·) << a(·),因此样本x[i] ∈ K[j]比分配到K[j]的其他样本更接近最近的群集K[c]。 此情况表示分配错误。 相反,当s(·) → 1时,b(·) >> a(·),因此样本x[i]比分配给最近群集的任何其他点更接近其邻居(属于同一群集)。 显然,这是最佳条件,也是微调算法时要采用的参考。 但是,由于该索引不是全局索引,因此引入轮廓图很有帮助,该轮廓图显示每个样本所获得的得分,按聚类分组并以降序排序。

让我们考虑K = {2, 4, 6, 8}的乳腺癌威斯康星州数据集的轮廓图(完整代码包含在存储库中):

乳腺癌威斯康星州数据集的轮廓图

第一张图显示了K = 2自然聚类。 第一个轮廓非常清晰,表明平均群集间距离具有较大的差异。 而且,一个集群比另一个集群具有更多的分配(即使它不那么尖锐)。 从数据集描述中,我们知道这两个类别是不平衡的(357 良性与 212 恶性),因此,不对称是部分合理的。 但是,一般而言,当数据集平衡时,良好的轮廓图的特征是具有均匀轮廓的均质群集,其圆形轮廓应接近 1.0。 实际上,当形状类似于长雪茄时,这意味着群集内距离非常接近其平均值(高内聚),并且相邻群集之间存在明显的分隔。 对于K = 2,我们拥有合理的分数,因为第一个群集达到 0.6,而第二个群集具有约 0.8 的峰值。 但是,尽管后者的大多数样本的特征是s(•) > 0.75,但在前一种样本中,约有一半的样本低于 0.5。 分析表明,较大的聚类更均匀,并且 K 均值更易于分配样本(即,就度量而言,x[i] ∈ K[2]的方差较小,在高维空间中,代表K[2]的球比代表K[1]的球更均匀。)。

其他图显示了类似的情况,因为已检测到非常紧密的聚类以及一些尖锐的聚类。 这意味着宽度差异非常一致。 但是,随着K的增加,由于分配的样本数趋于变得相似,因此我们获得了更加均一的群集。 具有s(·) > 0.75的非常圆形(几乎矩形)的群集的存在证实了数据集至少包含一组非常有凝聚力的样本,相对于分配给其他群集的任何其他点的距离都非常接近。 我们知道,恶性类(即使其基数更大)更为紧凑,而良性类则分布在更宽的子空间中。 因此,我们可以假设,对于所有K来说,最圆的群集是由恶性样本组成的,而其他所有群集都可以根据其清晰度进行区分。 例如,对于K = 8,第三群集很可能对应于第一图中第二群集的中心部分,而较小的群集包含属于良性子集的孤立区域的样本。

如果我们不了解基本事实,则应同时考虑K = 2K = 8(甚至更大)。 实际上,在第一种情况下,我们可能会丢失许多细粒度的信息,但是我们正在确定一个强大的细分领域(假设由于问题的性质,一个集群的凝聚力不是很高)。 另一方面,在K > 8的情况下,群集明显更小,具有适度的内聚性,它们代表具有某些共同特征的亚组。 正如我们在上一节中讨论的那样,最终的选择取决于许多因素,这些工具只能提供一般的指示。 此外,当聚类是非凸的或它们的方差未在所有特征之间均匀分布时,K 均值将始终产生次优表现,因为所得聚类将包含较大的空白空间。 如果没有特定的方向,则群集的最佳数量与包含均匀(宽度大致相同)的圆形图的图相关联。 如果形状对于任何K值仍然保持清晰,则意味着几何形状与对称度量不完全兼容(例如,群集非常拉伸),应考虑其他方法。

完整性分数

此措施(以及从现在开始讨论的所有其他措施)是基于对基本事实的了解。 在引入索引之前,定义一些常用值会很有帮助。 如果我们用Y[true]表示包含真实分配的集合,而Y[pred]则表示预测的集合(均包含M个值和K个群集),我们可以估计以下概率:

在先前的公式中,n [true/pred](k)代表属于群集k ∈ K的真实/预测样本数。 在这一点上,我们可以计算Y[true]Y[pred]的熵:

考虑到熵的定义, H(·)通过均匀分布最大化,而均匀分布又对应于每个分配的最大不确定性。 出于我们的目的,还必须引入Y[true]的条件熵(表示已知另一个变量的分布的不确定性),前提是Y以及其他方法:

在第一种情况下,函数n(i, j)表示具有分配给K[j]的真标签i的样本数 ],在第二种情况下,将分配给K[i]的真标签j的样本数。

完整性分数定义为:

很容易理解,当H(Y[pred] | Y[true]) → 0时, Y[true]减少了预测的不确定性,因此,c → 1。 这等同于说所有具有相同真实标签的样本都分配给同一群集。 相反,当H(Y[pred] | Y[true]) → H(Y[pred]),这意味着真实情况没有提供任何信息,可以减少预测的不确定性,c → 0

当然,良好的聚类的特征是c → 1。 对于乳腺癌威斯康星州数据集,使用 scikit-learn 函数completenss_score()(也适用于文本标签)和K = 2计算完整性评分( 与地面真相相关的唯一配置)如下:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import completeness_score
km = KMeans(n_clusters=2, max_iter=1000, random_state=1000)
Y_pred = km.fit_predict(cdf)
df_km = pd.DataFrame(Y_pred, columns=['prediction'], index=cdf.index)
kmdff = pd.concat([dff, df_km], axis=1)
print('Completeness: {}'.format(completeness_score(kmdff['diagnosis'], kmdff['prediction'])))

上一个代码段的输出如下:

Completeness: 0.5168089972809706

该结果证实,对于K = 2,K 均值不能完美地分离群集,因为如我们所见,因为某些恶性样本被错误地分配给包含大多数良性样本的群集。 但是,由于c并不是非常小,因此我们可以确保将这两个类别的大多数样本分配给了不同的群集。 邀请读者使用其他方法(在第 3 章,“高级聚类”中讨论)检查该值,并提供不同结果的简要说明。

同质性得分

同质性得分是对先前得分的补充,它基于以下假设:聚类必须仅包含具有相同真实标记的样本。 它定义为:

与完整性得分类似,当H(Y[true] | Y[pred]) → H(Y[true])时,表示分配对条件熵没有影响,因此在聚类(例如,每个聚类包含属于所有类别的样本)并且h → 0之后,不确定性不会降低。 相反,当H(Y[true] | Y[pred]) → 0h → 1,因为对预测的了解减少了关于真实分配的不确定性,并且群集几乎只包含带有相同标签的样本。 重要的是要记住,仅靠这个分数是不够的,因为它不能保证一个群集包含所有带有相同真实标签的样本x[i] ∈ X。 这就是为什么同质性分数总是与完整性分数一起评估的原因。

对于乳腺癌威斯康星州数据集,K = 2,我们获得以下信息:

from sklearn.metrics import homogeneity_score print('Homogeneity: {}'.format(homogeneity_score(kmdff['diagnosis'], kmdff['prediction'])))

相应的输出如下:

Homogeneity: 0.42229071246999117

这个值(特别是K = 2)证实了我们的初步分析。 至少一个聚类(具有大多数良性样本的聚类)不是完全同质的,因为它包含属于这两个类别的样本。 但是,由于该值不是非常接近0,因此我们可以确保分配部分正确。 考虑到hc这两个值,我们可以推断出 K 均值的效果不是很好(可能是由于非凸性),但同时正确分离所有最近群集距离在特定阈值以上的样本。 毋庸置疑,在掌握基本事实的情况下,我们不能轻易接受 K 均值,我们应该寻找另一种能够同时产生hc → 1的算法 。

使用 V 度量在同质性和完整性之间进行权衡

熟悉监督学习的读者应该知道 F 分数(或 F 度量)的概念,它是精确度和查全率的谐调平均值。 在给出基本事实的情况下评估聚类结果时,也可以采用相同的权衡方法。

实际上,在许多情况下,有一个同时考虑同质性和完整性的度量是有帮助的。 使用 V 度量(或 V 分数)可以很容易地获得这样的结果,其定义为:

对于乳腺癌威斯康星州数据集,V 度量如下:

from sklearn.metrics import v_measure_score
print('V-Score: {}'.format(v_measure_score(kmdff['diagnosis'], kmdff['prediction'])))

上一个代码段的输出如下:

V-Score: 0.46479332792160793

不出所料,V 分数是一种平均度量,在这种情况下,它受到较低同质性的负面影响。 当然,该索引不会提供任何不同的信息,因此仅在单个值中综合完整性和同质性很有帮助。 但是,通过一些简单但乏味的数学操作,有可能证明 V 度量也是对称的(即V(Y[pred] | V[true]) = V(Y[true] | Y[pred])); 因此,给定两个独立的分配Y[1]Y[2]V(Y[1] | Y[2]),这是衡量它们之间一致性的标准。 这种情况不是很普遍,因为其他措施可以取得更好的结果。 但是,例如,可以使用这种分数来检查两种算法(可能基于不同的策略)是否倾向于产生相同的分配,或者它们是否不一致。 在后一种情况下,即使未知的基础事实,数据科学家也可以理解,一种策略肯定不如另一种策略有效,因此可以开始探索过程以找出最佳的聚类算法。

调整后的互信息(AMI)得分

该分数的主要目标是评估Y[true]Y[pred]之间的一致性水平 。 可以通过采用互信息MI)的信息论概念来衡量这一目标; 在我们的例子中,它定义为:

函数与先前定义的相同。 当MI → 0时, n(i, j) → n[true](i) n[pred](j),其项分别与p(i, j)p[true](i)p[pred](j)成正比。 因此,此条件等同于说Y[true]Y[pred]在统计上是独立的,没有共识。 另一方面,通过一些简单的操作,我们可以将 MI 重写为:

因此,当H(Y[pred] | Y[true]) ≤ H(Y[pred])时,当基础事实的知识减少了Y[pred]的不确定性时,得出H(Y[pred] | Y[true]) → 0,并且 MI 最大化。 就我们的目的而言,最好考虑同时针对偶然性进行调整的规范化版本(在01之间界定)(即,考虑正确分配是由于偶然的概率)。 AMI 分数的完整推导是不平凡的,并且超出了本书的范围,其定义为:

在完全不一致的情况下,此值等于0;当Y[true]时,该值等于1Y[pred]完全一致(也存在置换)。 对于乳腺癌威斯康星州数据集和K = 2,我们获得以下信息:

from sklearn.metrics import adjusted_mutual_info_score
 print('Adj. Mutual info: {}'.format(adjusted_mutual_info_score(kmdff['diagnosis'], kmdff['prediction'])))

输出如下:

Adj. Mutual info: 0.42151741598216214

该协议是适度的,并且与其他措施兼容。 假设存在置换和机会分配的可能性,Y[true]Y[pred]共享中等级别的信息,因为我们已经讨论过,K 均值能够正确分配重叠概率可忽略不计的所有样本,同时它倾向于考虑良性地位于两个聚类边界上的许多恶性样本(相反,良性样本的分配没有错)。 没有任何进一步的指示,该索引还建议检查其他可以管理非凸群集的聚类算法,因为缺少共享信息主要是由于无法使用标准球(尤其是在重叠区域更显著的子空间)捕获复杂的几何图形。

调整后的兰德分数

调整后的兰德评分是真实标签分布与预测标签之间差异的度量。 为了对其进行计算,必须按以下方式定义数量:

  • a:表示带有相同的真实标签(y[i], y[j])的样本对(x[i], x[j])的数量:y[i] = y[j]并分配给同一集群K[c]
  • bR代表样本对的数量(x[i], x[j]),带有不同的真实标签(y[i], y[j])y[i] ≠ y[j]并分配给不同的集群K[c]K[d]c ≠ d

如果存在M个值,则使用具有k = 2的二项式系数获得二进制组合的总数,因此,差异的初始度量为:

显然,该值可以由ab主导。 在这两种情况下,较高的分数表示作业与基本事实相符。 但是,ab都可能因机会分配而产生偏差。 这就是引入调整后的兰德分数的原因。 更新的公式为:

该值限制在-11之间。 当R[A] → -1时,ab都非常小,并且绝大多数分配都是错误的。 另一方面,当R[A] →1时,预测分布非常接近真实情况。 对于乳腺癌威斯康星州数据集和K = 2,我们获得以下信息:

from sklearn.metrics import adjusted_rand_score
print('Adj. Rand score: {}'.format(adjusted_rand_score(kmdff['diagnosis'], kmdff['prediction'])))

上一个代码段的输出如下:

Adj. Rand index: 0.49142453622455523

由于该值大于-1(负极值),因此该结果优于其他指标。 它确认分布之间的差异不是很明显,这主要是由于样本的子集有限所致。 该分数非常可靠,也可以用作评估聚类算法表现的单个指标。 接近 0.5 的值确认 K 均值不太可能是最佳解,但与此同时,数据集的几何形状几乎可以被对称球完全捕获,除了某些重叠可能性高的非凸区域。

Python 无监督学习实用指南:1~5(3)https://developer.aliyun.com/article/1426882

相关文章
|
机器学习/深度学习 运维 算法
Python 无监督学习实用指南:6~10(1)
Python 无监督学习实用指南:6~10(1)
267 0
Python 无监督学习实用指南:6~10(1)
|
机器学习/深度学习 存储 算法
Python 无监督学习实用指南:1~5(3)
Python 无监督学习实用指南:1~5(3)
308 0
Python 无监督学习实用指南:1~5(3)
|
机器学习/深度学习 算法 关系型数据库
Python 无监督学习实用指南:6~10(4)
Python 无监督学习实用指南:6~10(4)
356 0
|
机器学习/深度学习 存储 算法
Python 无监督学习实用指南:1~5(5)
Python 无监督学习实用指南:1~5(5)
249 0
|
机器学习/深度学习 存储 算法
Python 无监督学习实用指南:1~5(1)
Python 无监督学习实用指南:1~5(1)
380 0
Python 无监督学习实用指南:1~5(1)
|
机器学习/深度学习 移动开发 算法
Python 无监督学习实用指南:6~10(5)
Python 无监督学习实用指南:6~10(5)
149 0
|
机器学习/深度学习 自然语言处理 算法
Python 无监督学习实用指南:6~10(3)
Python 无监督学习实用指南:6~10(3)
293 0
|
机器学习/深度学习 移动开发 运维
Python 无监督学习实用指南:6~10(2)
Python 无监督学习实用指南:6~10(2)
367 0
|
机器学习/深度学习 存储 算法
Python 无监督学习实用指南:1~5(4)
Python 无监督学习实用指南:1~5(4)
318 0
|
机器学习/深度学习 算法 Python
【机器学习算法-python实现】K-means无监督学习实现分类
1.背景         无监督学习的定义就不多说了,不懂得可以google。因为项目需要,需要进行无监督的分类学习。         K-means里面的K指的是将数据分成的份数,基本上用的就是算距离的方法。         大致的思路就是给定一个矩阵,假设K的值是2,也就是分成两个部分,那么我们首先确定两个质心。一开始是找矩阵每一列的最大值max,最小值min,算出range=max-
1373 0

推荐镜像

更多