返回介绍

4.1 聚类分析

发布于 2024-01-27 22:54:28 字数 15940 浏览 0 评论 0 收藏 0

聚类是数据挖掘和计算的基本任务,是将大量数据集中具有“相似”特征的数据点或样本划分为一个类别。聚类分析的基本思想是“物以类聚、人以群分”,因此大量的数据集中必然存在相似的数据样本,基于这个假设就可以将数据区分出来,并发现不同类的特征。

聚类常用于数据探索或挖掘前期,在没有做先验经验的背景下做的探索性分析,也适用于样本量较大情况下的数据预处理工作。例如针对企业整体的用户特征,在未得到相关知识或经验之前先根据数据本身特点进行用户分群,然后针对不同群体做进一步分析;例如对连续数据做离散化,便于后续做分类分析应用。

常用的聚类算法分为基于划分、层次、密度、网格、统计学、模型等类型的算法,典型算法包括K均值(经典的聚类算法)、DBSCAN、两步聚类、BIRCH、谱聚类等。

聚类分析能解决的问题包括:数据集可以分为几类、每个类别有多少样本量、不同类别中各个变量的强弱关系如何、不同类别的典型特征是什么等;除了划分类别外,聚类还能用于基于类别划分的其他应用,例如图片压缩等。但是,聚类无法提供明确的行动指向,聚类结果更多是为后期挖掘和分析工作提供预处理和参考,无法回答“为什么”和“怎么办”的问题,更无法为用户提供明确的解决问题的规则和条件(例如决策树条件或关联规则)。因此,聚类分析无法真正解决问题。

4.1.1 当心数据异常对聚类结果的影响

K均值(K-Means)是聚类中最常用的方法之一,它基于点与点距离的相似度来计算最佳类别归属。但K均值在应用之前一定要注意两种数据异常:

1)数据的异常值。数据中的异常值能明显改变不同点之间的距离相似度,并且这种影响是非常显著的。因此基于距离相似度的判别模式下,异常值的处理必不可少。

2)数据的异常量纲。不同的维度和变量之间,如果存在数值规模或量纲的差异,那么在做距离之前需要先将变量归一化或标准化。例如跳出率的数值分布区间是[0,1],订单金额可能是[0,10000000],而订单数量则是[0,1000],如果没有归一化或标准化操作,那么相似度将主要受到订单金额的影响。

当然,K均值并不是唯一的聚类方法,如果上述两种条件受某些因素的限制无法实现,那么可以选择其他聚类方法,例如DBSCAN。DBSCAN的全称是Density-Based Spatial Clustering of Applications with Noise,中文含义是“基于密度的带有噪声的空间聚类”。DBSCAN是一个比较有代表性的基于密度的聚类算法,与基于划分和层次的聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据集中发现任意形状的聚类。

DBSCAN算法的出发点是基于密度寻找被低密度区域分离的高密度空间,以此来实现不同数据样本的聚类。跟K均值相比,它具有以下优点:

原始数据集的分布规律没有明显要求,能适应任意数据集分布形状的空间聚类,因此数据集适用性更广,尤其是对非凸装、圆环形等异形簇分布的识别较好。

无须指定聚类数量,对结果的先验要求不高。

由于DBSCAN可区分核心对象、边界点和噪音点,因此对噪声的过滤效果好,能有效应对数据噪点。

但是,由于它直接对整个数据集进行操作且聚类时使用了一个全局性的表征密度的参数,因此也存在几个比较明显的弱点:

对于高维问题,基于Eps(半径)和MinPts(密度)的定义是个很大问题。

当簇的密度变化太大时,聚类结果较差。

当数据量增大时,要求较大的内存支持,I/O消耗也很大。

4.1.2 超大数据量时应该放弃K均值算法

K均值在算法稳定性、效率和准确率(相对于真实标签的判别)上表现非常好,并且在应对大量数据时依然如此。它的算法时间复杂度上界为O(n*k*t),其中n是样本量、k是划分的聚类数、t是迭代次数。当聚类数和迭代次数不变时,K均值的算法消耗时间只跟样本量有关,因此会呈线性增长趋势。

当真正面对海量数据时,使用K均值算法将面临严重的结果延迟,尤其是当K均值被用于做实时性或准实时性的数据预处理、分析和建模时,这种瓶颈效应尤为明显。到底K均值的时间随着样本量的增加会如何变化?笔者利用Python生成一个具有三个分类类别的样本集,每个样本都是二维空间分布(2个维度),样本量从100增长到1000000,步长为1000,我们用折线图来看一下计算时间与样本量的关系,结果如图4-1所示(这幅图耗时2个小时)。

图4-1 K均值算法样本量与计算时间的增长关系

从图4-1所示结果中发现,计算时间跟数据量基本成线性关系。在样本点为二维空间的前提下,当数据量在200000以下时,计算时间基本都在2秒以内;当数据量在1000000时耗时近16秒。由此可以试想,如果样本点有更多样本量或需要更多聚类类别,那么耗时将比上述场景大很多。

针对K均值的这一问题,很多延伸算法出现了,MiniBatchKMeans就是其中一个典型代表。MiniBatchKMeans使用了一个种名为Mini Batch(分批处理)的方法计算数据点之间的距离。

Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本(而非全部样本)作为代表参与聚类算法过程。由于计算样本量少,所以会相应减少运行时间;但另一方面,由于是抽样方法,抽样样本很难完全代表整体样本的全部特征,因此会带来准确度的下降。MiniBatchKMeans算法的准确度如何,请看下面的实验。在该实验中,我们对30000个样本点分别使用K-Means和Mini Batch KMeans进行聚类,然后对比两种方法得到结果的差异性,如图4-2所示。

图4-2 K-Means和Mini Batch KMeans聚类结果对比

由图4-2所示结果发现:在30000样本点的基础上,二者的运行时间K-Mean是0.44秒,Mini Batch KMeans是0.17秒,计算时间的差距为2倍多(当然这在预期之内),但聚类结果差异性却很小(右侧样本代表差异分类样本)。

我们看到Mini Batch KMeans在基本保持了K-Means原有较高类别识别率的前提下,其计算效率的提升非常明显。因此,Mini Batch KMeans是一种能有效应对海量数据,尽量保持聚类准确性并且大幅度降低计算耗时的聚类算法。

4.1.3 聚类不仅是建模的终点,更是重要的中间预处理过程

聚类分析的结果提供了样本集在非监督模式下的类别划分,这种划分得到的结果除了可以做群类别间的差异特征分析、群类别内的关键特征提取、样本群划分等分析功能外,还可以用于很多数据处理的中间过程。

1.图像压缩

图像压缩是用较少的数据量来表示原有的像素矩阵的过程,这个过程称为图像编码。数字图像的显著特点是数据量庞大,需要占用相当大的存储空间,这给图像的存储、计算、传输等带来了不便。因此,现在大多数数字网络下的图像都会经过压缩后再做进一步应用,图像压缩的方法之一便是聚类算法。

在使用聚类算法做图像压缩时,我们会先定义K个颜色数(例如128种颜色、256种颜色),颜色数就是聚类类别的数量;K均值聚类算法会把类似的颜色分别放在K个簇中,然后每个簇使用一种颜色来代替原始颜色,那么结果就是有多少个簇,就生成了由多少种颜色构成的图像,由此实现图像压缩。

2.图像分割

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣的目标技术和过程,这是图像处理和分析的关键步骤。图像分割后提取出的目标可以用于图像语义识别、图像搜索等领域。例如从图像中分割出前景人脸信息,然后做人脸建模和识别。

聚类算法是图像分割方法的一种,其实施的关键是通过不同区域间明显不同的图像色彩特征做聚类,聚类数量就是要分割的区域的数量。

3.图像理解

传统的图像理解大多借助于浅层的视觉特征,如颜色、纹理、形状、轮廓等形成所谓的内容理解,实质上这是计算机对图像内容的理解而非人类的理解。一幅图像中包含的信息和潜在语义远远比视觉特征所能表达的要丰富得多。图像理解就是要从图像中获得这些深层次的信息,既包括对图像中存在的对象及对象之间空间关系的理解,也包括对隐含在图像背后更为丰富的概念和内容的感受。

在图像理解中,有一种称为基于区域的提取方法。基于区域的提取方法是在图像分割和对象识别的前提下进行的,利用对象模板、场景分类器等,通过识别对象及对象之间的拓扑关系挖掘语义,生成对应的场景语义信息。例如,先以颜色、形状等特征对分割后的图像区域进行聚类,形成少量BLOB;然后通过CMRM模型计算出BLOB与某些关键词共同出现的概率。

4.异常检测

异常检测有多种实施方法,其中常用的方法是基于距离的异常检测方法。该方法包含并拓展了基于统计的思想,即使数据集不满足任何特定分布模型,它仍能有效地发现离群点,特别是当空间维数比较高时,算法的效率比基于密度的方法要高得多。算法具体实现时,首先算出数据样本间的距离(如曼哈顿距离、欧氏距离等),然后对数据做预处理后就可以根据距离的定义来检测异常值。

例如,基于K-Means的聚类可以将离中心点最远的类或者不属于任何一个类的数据点提取出来,然后将其定义为异常值。基于距离的离群检测方法不需要用户拥有任何领域的先验知识,且具有比较直观的识别意义,算法比较容易理解,因此在实际中应用得比较多。

5.数据离散化

聚类算法可以用于数据离散化,该部分内容请查看3.10.3节。

4.1.4 高维数据上无法应用聚类吗

在大数据背景下,数据获取难度和成本非常低,很多高维数据场景,例如电子商务交易数据、Web文本数据日益丰富。在做高维数据聚类时,传统的在低维空间通用的聚类方法运用到高维空间时,通常不能取得令人满意的聚类结果,这主要表现在聚类计算耗时太长、聚类结果相对于真实标签分类的准确性和稳定性都大大降低。

为什么在高维空间下聚类会出现这种问题?

在面对高维数据时,基于距离的相似度计算效率极低;

高维空间的大量属性特征使得在所有维上存在簇的可能性非常低;

由于稀疏性及近邻特性,基于距离的相似度几乎都为0,导致高维的空间中很难存在数据簇。

应对高维数据的聚类主要有2种方法:降维、子空间聚类。

降维是应对高维数据的有效办法,通过特征选择法或维度转换法将高维空间降低或映射到低维空间,直接解决了高维问题。有关降维的内容请参照3.3节。

子空间聚类算法是在高维数据空间中对传统聚类算法的一种扩展,其思想是选取与给定簇密切相关的维,然后在对应的子空间进行聚类。比如谱聚类就是一种子空间聚类方法,由于选择相关维的方法以及评估子空间的方法需要自定义,因此这种方法对操作者的要求较高。

4.1.5 如何选择聚类分析算法

聚类算法有几十种之多,聚类算法的选择,主要参考以下因素:

如果数据集是高维的,那么选择谱聚类,它是子空间划分的一种。

如果数据量为中小规模,例如在100万条以内,那么K均值将是比较好的选择;如果数据量超过100万条,那么可以考虑使用Mini Batch KMeans。

如果数据集中有噪点(离群点),那么使用基于密度的DBSCAN可以有效应对这个问题。

如果追求更高的分类准确度,那么选择谱聚类将比K均值准确度更好,在Docu-ment clustering using locality preserving indexing中关于K-means和Spectral Clustering应用到TDT2和Reuters-21578两组数据的准确率对比结果证明了这个结论。

4.1.6 代码实操:Python聚类分析

Sklearn中有专门的聚类库cluster,在做聚类时只需导入这个库,便可使用其中多种聚类算法,例如K均值、DBSCAN、谱聚类等。

本示例模拟的是对一份没有任何标签的数据集做聚类分析,以得到不用类别的特征和分布状态等,主要使用Sklearn做聚类、用Matplotlib做图形展示。数据源文件clustring.txt位于“附件-chapter4”中,默认工作目录为“附件-chapter4”(如果不是,请切换到该目录下,否则会报“IOError:File clustring.txt does not exist”)。完整代码如下:

# 导入库
import numpy as np  # 导入Numpy库
import matplotlib.pyplot as plt  # 导入Matplotlib库
from sklearn.cluster import KMeans  # 导入sklearn聚类模块
from sklearn import metrics  # 导入sklearn效果评估模块
# 数据准备
raw_data = np.loadtxt('cluster.txt')  # 导入数据文件
X = raw_data[:, :-1]  # 分割要聚类的数据
y_true = raw_data[:, -1]

# 训练聚类模型
n_clusters = 3  # 设置聚类数量
model_kmeans = KMeans(n_clusters=n_clusters, random_state=0)  # 建立聚类模型对象
model_kmeans.fit(X)  # 训练聚类模型
y_pre = model_kmeans.predict(X)  # 预测聚类模型

# 模型效果指标评估
n_samples, n_features = X.shape  # 总样本量,总特征数
inertias = model_kmeans.inertia_  # 样本距离最近的聚类中心的总和
adjusted_rand_s = metrics.adjusted_rand_score(y_true, y_pre)  # 调整后的兰德指数
mutual_info_s = metrics.mutual_info_score(y_true, y_pre)  # 互信息
adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y_true, y_pre)  # 调整后的互信息
homogeneity_s = metrics.homogeneity_score(y_true, y_pre)  # 同质化得分
completeness_s = metrics.completeness_score(y_true, y_pre)  # 完整性得分
v_measure_s = metrics.v_measure_score(y_true, y_pre)  # V-measure得分
silhouette_s = metrics.silhouette_score(X, y_pre, metric='euclidean')  # 平均轮廓系数
calinski_harabaz_s = metrics.calinski_harabaz_score(X, y_pre)  # Calinski和Harabaz得分
print ('samples: %d \t features: %d' % (n_samples, n_features))  # 打印输出样本量和特征数量
print (70 * '-')  # 打印分隔线
print ('ine\tARI\tMI\tAMI\thomo\tcomp\tv_m\tsilh\tc&h')  # 打印输出指标标题
print ('%d %.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d' % (
inertias, adjusted_rand_s, mutual_info_s, adjusted_mutual_info_s, homogeneity_s, completeness_s, v_measure_s,
silhouette_s, calinski_harabaz_s))  # 打印输出指标值
print (70 * '-')  # 打印分隔线
print ('short name \t full name')  # 打印输出缩写和全名标题
print ('ine \t inertias')
print ('ARI \t adjusted_rand_s')
print ('MI \t mutual_info_s')
print ('AMI \t adjusted_mutual_info_s')
print ('homo \t homogeneity_s')
print ('comp \t completeness_s')
print ('v_m \t v_measure_s')
print ('silh \t silhouette_s')
print ('c&h \t calinski_harabaz_s')

# 模型效果可视化
centers = model_kmeans.cluster_centers_  # 各类别中心
colors = ['#4EACC5', '#FF9C34', '#4E9A06']  # 设置不同类别的颜色
plt.figure()  # 建立画布
for i in range(n_clusters):  # 循环读类别
    index_sets = np.where(y_pre == i)  # 找到相同类的索引集合
    cluster = X[index_sets]  # 将相同类的数据划分为一个聚类子集
    plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], marker='.')  # 展示聚类子集内的样本点
    plt.plot(centers[i][0], centers[i][1], 'o', markerfacecolor=colors[i], markeredgecolor='k', markersize=6)  # 展示各聚类子集的中心
plt.show()  # 展示图像

# 模型应用
new_X = [1, 3.6]
cluster_label = model_kmeans.predict(new_X)
print ('cluster of new data point is: %d' % cluster_label)

上述代码用空行分为6部分。

第一部分导入库。示例中用到了Numpy导入文件、Sklearn做聚类模型应用以及效果评估、Matplotlib展示聚类结果。

第二部分数据准备。使用Numpy的loadtxt方法导入数据文件。数据文件包含1000条样本,3列维度,其中第3列为目标分类标签;在获取原始数据后,使用索引切片对矩阵做切分,将数据分为输入X和标签y_true。

第三部分训练聚类模型。先设置聚类数量为3,并建立聚类模型对象,然后通过fit方法训练模型,通过predict方法做聚类应用得到原始训练集的聚类标签集y_pre(也可以在应用fit方法后直接从聚类对象的labels_属性获得训练集的聚类标签);从得到的聚类模型中,通过其cluster_centers_属性和inertia_属性得到各类别中心以及样本距离最近的聚类中心的总和。

在sklearn中,几乎所有的算法类库都使用相同的模式做算法训练:①通过算法函数建立算法模型对象,②对模型对象使用fit方法做模型训练,③对模型对象应用predict方法做模型预测。虽然聚类属于非监督式算法,但也使用这种模式,这种通用用法使得sklearn具有极好的易用性。除了fit和predict方法外,算法类库的其他方法还有:score、get_params、set_parames等通用方法;另外,不同的算法库还有特定的方法函数,例如SVM的decision_function、KMeans的transform、PCA的inverse_transform、DecisionTreeClassifier的predict_proba等。

相关知识点:将算法对象保存到硬盘

在某些情况下,我们可能需要将算法对象保存到硬盘,以方便日后再次做模型应用和预测时无需重新训练模型,并且可以保持相同的模型参数和实例来应用到新的数据集,这种用法也称为对象持久化。Python内置标准库cPickle是实现这一过程的有效方法库。

cPickle可以将任意一种类型的Python对象进行序列化/持久化操作,算法模型对象也不例外。cPickle的主要应用方法是dump和load。

dump:将Python对象序列化保存到本地的文件,方法如下:

import cPickle
cPickle.dump(model_name,open("my_model_object.pkl","wb"))

load:从本地文件读取Python对象并恢复实例对象,方法如下:

model_name = cPickle.load(open("my_model_object.pkl","rb"))

上述方法中,model_name就是模型的实例化名称,例如本节代码中的model_kmeans,而扩展名为.pkl的文件名称则自定义即可。

第四部分模型效果指标评估。本部分将通过不同的指标来做聚类效果评估。

inertias:inertias是K均值模型对象的属性,表示样本距离最近的聚类中心的总和,它是作为在没有真实分类结果标签下的非监督式评估指标。该值越小越好,值越小证明样本在类间的分布越集中,即类内的距离越小。

adjusted_rand_s:调整后的兰德指数(Adjusted Rand Index),兰德指数通过考虑在预测和真实聚类中在相同或不同聚类中分配的所有样本对和计数对来计算两个聚类之间的相似性度量。调整后的兰德指数通过对兰德指数的调整得到独立于样本量和类别的接近于0的值,其取值范围为[-1,1],负数代表结果不好,越接近于1越好意味着聚类结果与真实情况越吻合。

mutual_info_s:互信息(Mutual Information,MI),互信息是一个随机变量中包含的关于另一个随机变量的信息量,在这里指的是相同数据的两个标签之间的相似度的量度,结果是非负值。

adjusted_mutual_info_s:调整后的互信息(Adjusted Mutual Information,AMI),调整后的互信息是对互信息评分的调整得分。它考虑到对于具有更大数量的聚类群,通常MI较高,而不管实际上是否有更多的信息共享,它通过调整聚类群的概率来纠正这种影响。当两个聚类集相同(即完全匹配)时,AMI返回值为1;随机分区(独立标签)平均预期AMI约为0,也可能为负数。

homogeneity_s:同质化得分(Homogeneity),如果所有的聚类都只包含属于单个类的成员的数据点,则聚类结果将满足同质性。其取值范围[0,1]值越大意味着聚类结果与真实情况越吻合。

completeness_s:完整性得分(Completeness),如果作为给定类的成员的所有数据点是相同集群的元素,则聚类结果满足完整性。其取值范围[0,1],值越大意味着聚类结果与真实情况越吻合。

v_measure_s:它是同质化和完整性之间的谐波平均值,v=2*(均匀性*完整性)/(均匀性+完整性)。其取值范围[0,1],值越大意味着聚类结果与真实情况越吻合。

silhouette_s:轮廓系数(Silhouette),它用来计算所有样本的平均轮廓系数,使用平均群内距离和每个样本的平均最近簇距离来计算,它是一种非监督式评估指标。其最高值为1,最差值为-1,0附近的值表示重叠的聚类,负值通常表示样本已被分配到错误的集群。

calinski_harabaz_s:该分数定义为群内离散与簇间离散的比值,它是一种非监督式评估指标。

Sklearn中算法效果评估一共有3种方式:一是算法模型对象的score方法,在创建的算法对象中可直接使用该方法,例如model_tree.score(X_test,y_test);二是使用交叉验证的模型评估工具的评分参数,例如使用sklearn.model_selection.cross_val_score()方法返回的得分为交叉检验得分数组;三是metrics库的评估指标,该库可用来对模型选择、分类算法、聚类算法、回归算法、多标签学习、双聚类、配对(Pairwise)算法等主题进行评估,本章用到的大量的算法评估指标都来源于此。

在本部分功能中,先通过shape方法获得输入训练集的形状,包括样本量和特征数量;然后通过模型的inertia_属性获得样本距离最近的聚类中心的总和;接着通过一系列Sklearn中的指标评估模块的函数,对真实类别结果和预测类别结果做对比评估,最后打印输出上述指标。

在打印过程中,通过print方法结合占位符打印输出不同的字段以及对应值,这种方法对于值特别多、且打印值是变量的场景下尤其有效;另外也应用了tab分隔符(\t)来分隔字段内容、使用不同的占位符类型做内容限制(例如浮点型f、整数型d)使内容格式化效果更好;为了区分不同的打印内容,例如总描述、各评估指标、指标缩写,使用分割线来让内容逻辑上更清晰。输出结果如下:

samples: 1000       features: 2
--------------------------------------------------------------------------
ineARI        MI       AMI     homo     comp      v_m     silh     c&h
300 0.96     1.03      0.94      0.94      0.94       0.94       0.63       2860
--------------------------------------------------------------------------
short name       full name
ine       inertias
ARI       adjusted_rand_s
MI            mutual_info_s
AMI       adjusted_mutual_info_s
homo       homogeneity_s
comp       completeness_s
v_m       v_measure_s
silh       silhouette_s
c&h       calinski_harabaz_s

相关知识点:字符串格式化

在使用print打印方法中,经常会用到字符串格式化操作。常用的格式化符号如表4-1所示:

表4-1 常用格式化符号

在使用print输出时同时输出多个字符串的方法如下:

输入:print ('the score is %d ad result is %f' % (1298,1.314))
输出:the score is 1298 ad result is 1.314000

对于浮点型数据,如果要保留特定位数的小数,方法如下:

输入:print ('the score is %d ad result is %.2f' % (1298,1.314))
输出:the score is 1298 ad result is 1.31

其中.2f表示输出的浮点数保留2位四舍五入的小数。

通过上述各个指标,发现K均值的预测结果跟实际结果相似度非常高,证明算法本身的拟合度非常符合实际情况。

第五部分模型效果可视化。先通过K均值模型对象的cluster_centers_方法获得类别中心点;然后定义一个颜色集用来显示不同类别样本的颜色;通过Matplotlib的figure方法建立一块画布,再通过for循环读出每个类别,使用Numpy的where方法得到不同分类下的数据集索引并建立各聚类数据子集,最后使用atplotlib的scatter方法和plot方法做散点图展示聚类子集内的样本点以及中心,如图4-3所示。

相关知识点:scatter和plot方法

scatter方法主要用来做散点图展示,而plot方法主要用来做折线图展示,也可以用于散点图的展示。两个方法的参数基本是通用的。以scatter方法为例,常用参数包括:

scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax
=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data
=None, **kwargs)

x,y:具有相同长度的一维数据,散点的X和Y轴对应的数据。

s:数值型,控制点的大小。

c:字符串,控制点的颜色,常用的颜色字符串为b(blue,蓝色)、c(cyan,品红)、g(green,绿色)、k(black,黑色)、m(magenta,红色)、w(white,白色)、y(yellow,黄色)。

marker:字符串,控制点的样式,样式列表如表4-2所示。

图4-3 聚类结果展示

表4-2 常用marker值列表

在plot方法的marker值中,还可设定为线条的样式'-'为实线、'--'为虚线、'-.'为点虚线、':'为点虚线。

norm:float型,控制点图的数据亮度,取值范围[0,1]。

alpha:float型,控制点图透明度,取值范围[0,1]。

另外,在plot方法中,经常会用到label参数,用来实现多个线条的标签。

从聚类图可以看出,聚类结果点分布跟类别的分布基本一致,表现出了较好的类别间的区隔。如果要做进一步的各类别内的特征分析,可以基于各类别的数据集(在模型可视化部分有“将相同类的数据划分为一个聚类子集”,其中可以直接划分聚类子集),做特征的分析,例如均值、极值、方差、偏度、峰度、异常值、众数、中位数等不同角度的分析。

第六部分模型应用。假如新给到一个数据样本[1,3.6],我们可以基于训练好的聚类模型预测该样本的类别归属,使用模型的predict方法进行预测。结果如下:

cluster of new data point is: 1

当然,这个类别的索引值本身没有多大意义,有意义的是,我们可以基于这个索引,提取出对应的类别的所有特征,然后基于这些特征或这个类别下的其他样本来对该样本做分析和应用。例如,当一个用户刚到达网站时,我们会这个用户了解非常少,无法具体给出最合适的信息,此时可以基于聚类算法将这个用户所属的类别进行推测,然后基于类别中的特征(其他用户喜欢的内容、经常浏览的帖子、TOP购买商品等)来给该用户做推荐。

上述过程中,主要需要考虑的关键点是:如何在不确定样本分类数的前提下定义K值,这也是K均值算法的关键问题之一。除此之外还有一个重要的话题是如何对聚类结果进行评估,对于聚类结果的评估主要考虑三个方面:

一是对于没有任何聚类真实结果指标的,由于无法使用真实数据作对比,只能使用聚类距离指标做评估;

二是对于有分类真实结果可做对照的(例如本示例),则可以使用真实标签与预测标签的相似、重复、完整性等度量计算,需要注意的是,聚类结果的标签值与其真实类别的标签值没有关系,结果只关注数据点是否属于同一类,而对于类的标签值是1还是2则不关注;

三是业务类的评估,包括不同类别间的特征是否有显著差异,类内部是否具有能代表类别的显著性特征,不同类别内的样本量分布是否相对均匀等。另外,也可以通过可视化的形式,从聚类结果中发现是否存在异常的类别点等。

在本示例中(也包括本章的其他所有内容)没有涉及到数据预处理的知识,并且笔者也没打算这么做,原因是如果每次都演示从数据读取、预处理、建模、分析、应用、展示等所有场景,那么这本书就真的太厚了,并且知识也会过于重复。笔者更倾向于在不同的章节中介绍不同的内容,即使是完成同一件事情,也尽量通过不同的方法和思路实现,这样可以尽量提供更多的技巧和方法,读者在应用时选择自己最熟悉并且感兴趣的方法使用。

代码实操小结:本小节示例中,主要应用了以下几个知识点:

通过Numpy的loadtxt读取数据文件。

对矩阵做切片操作。

使用sklearn.cluster的KMeans算法完成模型训练,并通过其cluster_centers_、inertia_属性输出聚类结果的中心和总距离。

使用模型的predict方法做聚类预测并得到聚类类别索引值。

使用sklearn.metrics中的adjusted_rand_score、mutual_info_score、adjusted_mutual_info_score、homogeneity_score、completeness_score、v_measure_score、silhouette_score、calinski_harabaz_score做基于真实数据结果标签的型效果评估。

使用matplotlib.pyplot的scatter方法和plot方法展示图形,并设置不同的展示样式。前者主要用来展示散点图,后者主要用来展示趋势图,使用plot方法也可以做散点图展示,而且如果不设置颜色和图形大小,plot方法的展示速度会更快。

使用print配合占位符输出变量,并使用不同的占位符类型(d/f等)并指定宽度做打印数据格式化。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文