小白学(Python数据分析与数据运营)的日常杂记16(聚类分析)

本文探讨了聚类分析在数据探索和预处理中的作用,重点介绍了K均值和DBSCAN算法。K均值易受数据异常值和量纲影响,适合大规模数据,但对高维数据效率较低。DBSCAN则适用于处理异常点和任意形状的聚类,且无需指定类别数量。此外,聚类可用于图像压缩、分割、理解和异常检测。在大数据量时,MiniBatch KMeans能提高效率。聚类选择应考虑数据规模、维度和噪声。示例代码展示了Python中使用sklearn进行聚类分析的过程。
摘要由CSDN通过智能技术生成


聚类是数据挖掘和计算的基本任务,是将大量数据集中具有“相似”特征的数据点或样本划分为一个类别。

聚类分析的基本思想:“物以类聚、人以群分”。

因此大量的数据集中必然存在相似的数据样本,基于这个假设就可以将数据区分出来,并发现不同类的特征。

聚类常用于数据探索或挖掘前期,在没有做先验经验的背景下做的探索性分析,也适用于样本量较大情况下的数据预处理工作。

例如针对企业整体的用户特征,在未得到相关知识或经验之前先根据数据本身特点进行用户分群,然后针对不同群体做进一步分析;例如对连续数据做离散化,便于后续做分类分析应用。

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

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

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

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

1.1 数据的异常值

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

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消耗也很大。

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

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

当真正面对海量数据时,使用K均值算法将面临严重的结果延迟,尤其是当K均值被用于做实时性或准实时性的数据预处理、分析和建模时,这种瓶颈效应尤为明显。到底K均值的时间随着样本量的增加会如何变化?利用Python生成一个具有三个分类类别的样本集,每个样本都是二维空间分布(2个维度),样本量从100增长到1000000,步长为1000,我们用折线图来看一下计算时间与样本量的关系(耗时2个小时)
在这里插入图片描述
计算时间跟数据量基本成线性关系。在样本点为二维空间的前提下,当数据量在200000以下时,计算时间基本都在2秒以内;当数据量在1000000时耗时近16秒。由此可以试想,如果样本点有更多样本量或需要更多聚类类别,那么耗时将比上述场景大很多。

针对K均值的这一问题,很多延伸算法出现了,MiniBatchKMeans就是其中一个典型代表。MiniBatchKMeans使用了一个种名为MiniBatch(分批处理)的方法计算数据点之间的距离。
Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本(而非全部样本)作为代表参与聚类算法过程。由于计算样本量少,所以会相应减少运行时间;但另一方面,由于是抽样方法,抽样样本很难完全代表整体样本的全部特征,因此会带来准确度的下降。MiniBatchKMeans算法的准确度如何,请看下面的实验。在该实验中,我们对30000个样本点分别使用K-Means和MiniBatch KMeans进行聚类,然后对比两种方法得到结果的差异性。
在这里插入图片描述
在30000样本点的基础上,二者的运行时间K-Mean是0.44秒,Mini Batch KMeans是0.17秒,计算时间的差距为2倍多(当然这在预期之内),但聚类结果差异性却很小(右侧样本代表差异分类样本)。我们看到Mini Batch KMeans在基本保持了K-Means原有较高类别识别率的前提下,其计算效率的提升非常明显。因此,Mini Batch KMeans是一种能有效应对海量数据,尽量保持聚类准确性并且大幅度降低计算耗时的聚类算法。

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

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

3.1 图像压缩

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

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

3.2 图像分割

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

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

3.3 图像理解

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

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

3.4 异常检测

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

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

3.5 数据离散化

聚类算法可以用于数据离散化

4. 高维数据上无法应用聚类吗?

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

为什么在高维空间下聚类会出现这种问题?
·在面对高维数据时,基于距离的相似度计算效率极低;
·高维空间的大量属性特征使得在所有维上存在簇的可能性非常低;
·由于稀疏性及近邻特性,基于距离的相似度几乎都为0,导致高维的空间中很难存在数据簇。

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

  • 降维是应对高维数据的有效办法,通过特征选择法或维度转换法将高维空间降低或映射到低维空间,直接解决了高维问题。
  • 子空间聚类算法是在高维数据空间中对传统聚类算法的一种扩展,其思想是选取与给定簇密切相关的维,然后在对应的子空间进行聚类。比如谱聚类就是一种子空间聚类方法,由于选择相关维的方法以及评估子空间的方法需要自定义,因此这种方法对操作者的要求较高。

5. 如何选择聚类分析算法

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

  • 如果数据集是高维的,那么选择谱聚类,它是子空间划分的一种。
  • 如果数据量为中小规模,例如在100万条以内,那么K均值将是比较好的选择;如果数据量超过100万条,那么可以考虑使用Mini Batch KMeans。
  • 如果数据集中有噪点(离群点),那么使用基于密度的DBSCAN可以有效应对这个问题。
  • 如果追求更高的分类准确度,那么选择谱聚类将比K均值准确度更好,在Docu-ment clustering using locality preserving indexing中关于K-means和Spectral Clustering应用到TDT2和Reuters-21578两组数据的准确率对比结果证明了这个结论。

6. 代码实操:Python聚类分析

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

本示例模拟的是对一份没有任何标签的数据集做聚类分析,以得到不用类别的特征和分布状态等,主要使用Sklearn做聚类、用Matplotlib做图形展示。数据源文件clustring.txt位于“附件-chapter4”中,如需下载数据文件,请参见小白学…的日常杂记3中的下载地址。·

# -*-coding:utf-8-*-
#@Author: Songzq
#@Time: 2019072316时
#说明:
#总结:

#导入库
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('D:/jupter_workspace/chapter4/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)
-----------------------------------
执行结果:
samples: 1000 	 features: 2
----------------------------------------------------------------------
ine	ARI	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
cluster of new data point is: 1

打印的图像
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值