聚类分析是一种研究分类问题的一种统计分析方法,同时也是数据挖掘的一个重要算法。聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,或者是多维空间中的一个点。常见的聚类算法分为基于划分、层次、密度、网格、统计学、模型等类型的算法,典型算法包括K均值(经典的聚类算法)、DBSCAN、两步聚类、BIRCH、谱聚类等 。
其中,K-means是最常使用的方法之一,但是k-means要注意数据异常:数据异常值和数据的异常量纲。数据中的异常值能明显改变不同点之间的距离相识度,并且这种影响是非常显著的。因此基于距离相似度的判别模式下,异常值的处理必不可少。不同的维度和变量之间,如果存在数值规模或量纲的差异,那么在做距离之前需要先将变量归一化或标准化。例如跳出率的数值分布区间是[0,1],订单金额可能是[0,10000 000],而订单数量则是[0,1000],如果没有归一化或标准化操作,那么相似度将主要受到订单金额的影响。DBSCAN有异常的数据可以使用DBSCAN聚类方法进行处理,DBSCAN的全称是Density-Based Spatial Clustering of Applications with Noise,中文含义是“基于密度的带有噪声的空间聚类”。跟K均值相比,它具有以下优点:原始数据分布规律没有明显要求,能适应任意数据集分布形状的空间聚类,因此数据集适用性更广,尤其是对非凸装、圆环形等异性簇分布的识别较好。无需指定聚类数量,对结果的先验要求不高 。
DBSCAN和MiniBatchKMeans是两种常用的聚类算法,它们都有各自的优缺点。DBSCAN可以区分核心对象、边界点和噪点,对噪声过滤效果好,能有效应对数据噪点。但是对于高纬度问题,基于半径和密度的定义成问题。当簇的密度变化太大时,聚类结果较差。当数据量增大时,要求较大的内存支持,I/O消耗也很大。
MiniBatchKMeans在算法稳定性、效率和准确率(相对于真实标签的判别)上表现非常好,并且在应对大量数据时依然如此。它的算法时间复杂度上界为O(n k t),其中n是样本量、k是划分的聚类数、t是迭代次数。当聚类数和迭代次数不变时,K均值的算法消耗时间只跟样本量有关,因此会呈线性增长趋势。但是当面对海量数据时,k均值算法计算速度慢会产生延时,尤其算法被用于做实时性处理时这种弊端尤为明显。针对K均值的这一问题,很多延伸算法出现了,MiniBatchKMeans就是其中一个典型代表。MiniBatchKMeans使用了一个种名为Mini Batch(分批处理)的方法计算数据点之间的距离。Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本(而非全部样本)作为代表参与聚类算法过程。由于计算样本量少,所以会相应减少运行时间;但另一方面,由于是抽样方法,抽样样本很难完全代表整体样本的全部特征,因此会带来准确度的小幅度下降,但是并不明显。
谱聚类是一种子空间聚类方法,在高维数据空间中对传统聚类算法进行扩展。它选取与给定簇密切相关的维,然后在对应的子空间进行聚类。由于选择相关维的方法以及评估子空间的方法需要自定义,因此这种方法对操作者的要求较高。
使用聚类分析中间预处理可以对图像进行压缩。
图像编码:
图像编码是将原始像素矩阵用较少的数据量表示的过程,这对于存储、计算和传输图像数据非常方便。为了实现这一目标,许多数字网络下的图像都会经过压缩处理。其中一种常用的方法是使用聚类算法进行图像压缩。通过定义K个颜色数(例如128种颜色),K均值聚类算法会将类似的颜色分别放在K个簇中,然后每个簇使用一种颜色来代替原始颜色。这样,结果就是有多少个簇就生成了多少种颜色构成的图像,从而实现图像压缩。
图像分割:
图像分割是将图像分成若干个特定且具有独特性质的区域,并提取出感兴趣的目标。这是图像处理和分析的关键步骤。例如,从图像中分割出前景人脸信息,然后做人脸识别。聚类算法是图像分割方法的一种,其实施的关键是通过不同区域间明显不同的图像色彩特征做聚类,聚类数量即为要分割的区域的数量。
图像理解:
在图像理解中,有一种称为基于区域的提取方法。这种方法是在图像分割和对象识别的前提下进行的,利用对象模板、场景分类器等,通过识别对象及对象之间的拓扑关系挖掘语义,生成对应的场景语义信息。例如,先以颜色、形状等特征对分割后的图像区域进行聚类,形成少量BLOB;然后通过CMRM模型计算出BLOB与某些关键词共同出现的概率。
异常检测:
异常检测有多种实施方法,其中常用的方法是基于距离的异常检测方法。即使数据集不满足任何特定分布模型,它仍能有效地发现离群点。特别是当空间维度较高时,算法的效率比基于密度的方法要高得多。具体实现时,首先算出数据样本间的距离(如曼哈顿距离、欧氏距离等),然后对数据做预处理后就可以根据距离的定义来检测异常值。例如,可以使用K-means的聚类将离中心店最远的类或者不属于任何一个类的数据点提取出来,然后将其定义为异常值。
聚类算法的选择:
根据不同的数据特点和需求,可以选择不同的聚类算法。例如:
1. 当数据为高维数据时,可以选择子空间聚类(如谱聚类)。
2. 当数据量在100万条以内时,可以使用k均值聚类;如果数据量超过100万条,可以考虑使用Mini Batch KMeans。
3. 如果数据中存在噪点,可以使用基于密度的DBSCAN。
4. 如果追求更高的分类准确度,可以选择谱聚类,它的准确度通常比K均值更高。
Python代码实现:
```python
from sklearn.cluster import KMeans, MiniBatchKMeans, DBSCAN
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
import numpy as np
# 假设X是一个二维数组,表示图像数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
# 对数据进行标准化处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 使用K-means聚类算法进行聚类
kmeans = KMeans(n_clusters=2)
kmeans_labels = kmeans.fit_predict(X_scaled)
print("K-means聚类结果:", kmeans_labels)
# 使用MiniBatchKMeans聚类算法进行聚类
minibatch_kmeans = MiniBatchKMeans(n_clusters=2)
minibatch_kmeans_labels = minibatch_kmeans.fit_predict(X_scaled)
print("MiniBatchKMeans聚类结果:", minibatch_kmeans_labels)
# 使用DBSCAN聚类算法进行聚类
dbscan = DBSCAN(eps=0.5, min_samples=2)
dbscan_labels = dbscan.fit_predict(X_scaled)
print("DBSCAN聚类结果:", dbscan_labels)
```
以下是重构后的内容:
K均值模型对象的属性之一是inertias,它表示样本距离最近的聚类中心的总和。在没有真实分类结果标签的情况下,这个属性可以作为非监督式评估指标。inertias的值越小越好,因为它表明样本在类间的分布越集中,即类内的距离越小。
另一个属性是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)和Calinski-Harabasz指数是聚类分析中常用的非监督式评估指标。它们用于衡量聚类效果,但在计算方式上有所不同。
首先,我们来看轮廓系数(Silhouette)。轮廓系数是一种用来计算所有样本的平均轮廓系数的方法,它使用平均群内距离和每个样本的平均最近簇距离来计算。轮廓系数的值范围为-1到1之间。其中,值越接近1表示样本被正确地分配到了对应的簇中;值越接近-1表示样本位于错误的簇中且与其他簇有较大的重叠区域;值接近0表示样本处于一种“困惑”的状态,既不在任何簇中也不与其他簇有较大的重叠区域。因此,通过调整不同参数可以优化算法的性能。
其次是Calinski-Harabaz指数(Calinski-Harabasz Index),也称为方差比值(Variance Ratio)。该指标定义为群内离散与簇间离散的比值。它的值范围也是-1到1之间,同样可以用来评估聚类效果。通常情况下,较高的Calinski-Harabaz指数表示较好的聚类效果。与轮廓系数相比,Calinski-Harabaz指数对异常值更加敏感,因为它考虑了每个簇内部的离散程度以及不同簇之间的离散程度。
总结来说,轮廓系数和Calinski-Harabaz指数都是非监督式评估指标,用于评估聚类效果并指导聚类算法的选择和调优。它们的计算方式略有不同,但都可以提供有用的信息来帮助我们判断聚类结果的质量。