一、聚类定义
- 聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使
类别内的数据相似度较大
而类别间的数据相似度较小
,即高类间聚,低类内聚。 - 相似度怎么衡量呢?
- 相似度与距离成负相关 ,所以我们通常用样本间的距离来衡量其相似度。
- 不同的场景,有不同的样本内容,但最终都会把样本表示成向量。
- 向量的距离怎么表示呢?(假设空间内有两个n维(n>=2)向量
(x1,x2,....,xn)和(y1,y2,...,yn)
)
- 欧式距离(euclidean): ∑i=1n(xi−yi)2−−−−−−−−−−√
- 曼哈顿距离(manhattan): ∑i=1n|xi−yi|
- 核函数映射后距离: d(x,y)=∥f(x)−f(y)∥
- 闵可夫斯基距离(minkowski): ∑i=1n(|xi−yi|)p−−−−−−−−−−−√p ,p=1为曼哈顿距离, p=2为欧式距离。
- 带权重闵可夫斯基距离(wminkowski): ∑i=1n(w∗|xi−yi|)p−−−−−−−−−−−−−−√p
- 标准化欧式距离(seuclidean):即对于各特征维度做了归一化以后的欧式距离。此时各样本特征维度的均值为0,方差为1.
- 相关系数: ρ=cov(X,Y)D(X)√D(Y)√
- 余弦相似度
二、K-Means 聚类
K-Means can be seen as a special case of Gaussian mixture model with equal covariance per component.
K-Means is equivalent to the expectation-maximization algorithm with a small, all-equal, diagonal covariance matrix.
算法步骤
迭代收敛的终止条件怎么定义?
- 聚类中心不再变化(或者变化小于某阈值)
- 损失函数小于某阈值
- 达到指定的迭代次数
- 损失函数(Coordinate descent)
- K 值的选择?
- 初始聚类中心的选择?
- 优化的初始化聚类方法(Arthur 和 Vassilvitskii 提出的Kmeans++)
- 多初始化几遍((适用于 k=2→10 ),选所有这些聚类中损失函数(到聚类中心和)最小的。
- 初始第一个聚类中心为某个样本点,初始第二个聚类中心为离它最远的点,第三个为离它俩最远…
K-Means 的局限性以及解决办法
- 若存在一个没有样本点分配给它的聚类中心,我们通常会直接移除那个聚类中心,由
K
个簇变为
K−1 个簇 - K-Means 算法可能收敛到局部最小值,且在大规模数据集上收敛较慢,解决办法:二分K-Means
- 若存在一个没有样本点分配给它的聚类中心,我们通常会直接移除那个聚类中心,由
K
个簇变为
二分K-Means(最大程度的降低误差平方和)
- 首先,将所有点作为一个簇,然后使用 K-Means 算法该簇一分为二
- 下次迭代时,选择有最大误差的簇使用 K-Means 算法(k=2)继续进行划分
- 重复该过程,直至 k 个簇创建成功为止
scikit-learn中的KMeans类
- 主要参数
- n_clusters:聚类数量,默认为8
- init: 初始值选择的方式,默认为
k-means++
,可以为完全随机选择random
或者ndarray
- n_init:用
不同的初始化质心
运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10。 - max_iter:最大的迭代次数,默认300次。
- tol :容忍的最小误差(默认为0.0001),当误差小于tol就会退出迭代。
- algorithm:默认为
auto
,不用更改。 - random_state:The generator used to initialize the centers. If an integer is given, it fixes the seed(即:给定一个整数后,每次运行的结果都是一致的,否则是随机的)
常用方法及属性
from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 随机变量标准化,使其服从标准正态分布 # Standardize features by removing the mean and scaling to unit variance X_Norm = StandardScaler.fit_transform(X) # 返回一个簇对象,包含属性cluster_centers_、labels_、 # inertia_(Sum of distances of samples to their closest cluster center) cls_object = KMeans(n_clusters=4).fit(X_Norm) # 预测新数据的类别 label_new = KMeans(n_clusters=4).predict(new_data)
plt 绘图中文显示参数设置
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号 # 有中文出现的情况,需要加上u'content',使用 unicode 编码
- 主要参数
三、密度聚类
该聚类算法假设
:聚类结构能够通过样本分布的紧密程度确定。通常聚类算法从样本密度的角度来考察样本之间的可连续性,并基于可连续性样本不断扩展聚类簇以获得最终的聚类结构。
指导思想
:只要样本点的密度大于某阈值,则将该样本添加到最近的簇中。
优缺点
:该算法可发现任意形状的聚类,且对噪声不敏感;但计算复杂度大,需要建立空间索引来降低计算量。
1. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
DBSCAN算法的若干概念
- 对象的ε-邻域:给定对象在半径
ε
内的区域。 - 核心对象:对于给定的数目
m
,如果一个对象的ε-邻域至少包含 m 个对象,则称该对象为核心对象。 - 直接密度可达:给定一个对象集合
D
,如果 p 是在核心对象 q 的ε-邻域内,我们说从对象 q 出发到对象p是直接密度可达的。 - 密度可达:如果存在一个对象链
p1、p2…pn,p1=q,pn=p
,对
pi∈D,(1≤i≤n)
,
pi+1
是从
pi
(核心对象) 关于 ε 和 m 直接密度可达的,则对象
p
是从核心对象
q 关于 ε 和 m 密度可达的。 - 密度相连:如果对象集合D中存在一个核心对象
o
,使得对象 p 和 q 是从 o 关于 ε 和 m 密度可达的,那么对象 p 和 q 是关于 ε 和 m 密度相连的。 - 簇:
密度相连的点
的最大集合。 - 噪声:不包含在任何簇中的对象称为噪声。
- 对象的ε-邻域:给定对象在半径
DBSCAN算法流程
- 如果一个点 p 的ε-邻域包含多于 m 个对象,则创建一个 p 作为核心对象的新簇
- 寻找并合并核心对象直接密度可达的对象
- 没有新点可以更新簇时,算法结束
- 由上述算法可知:
- 每个簇至少包含一个核心对象
- 非核心对象可以是簇的一部分,构成了簇的边缘(edge)
- 包含过少对象的簇被认为是噪声
scikit-learn中的DBSCAN类
主要参数(本身的参数+最近邻度量的参数)
- eps:
DBSCAN算法参数
,即我们的ϵ-邻域的距离阈值,默认值是0.5。一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。 - min_samples:
DBSCAN算法参数
,即样本点要成为核心对象所需要的ϵ-邻域的样本数阈值,默认值是5。一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点。反之min_samples过小的话,则会产生大量的核心对象。 - metric:
最近邻距离度量参数
。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离
)就可以满足我们的需求 algorithm:
最近邻搜索算法参数
,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。
需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用”auto”建树时间可能会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。leaf_size:
最近邻搜索算法参数
,为使用KD树或者球树时, 停止建子树的叶子节点数量的阈值。这个值越小,则生成的KD树或者球树就越大,层数越深,建树时间越长,反之,则生成的KD树或者球树会小,层数较浅,建树时间较短。默认是30. 因为这个值一般只影响算法的运行速度和使用内存大小,因此一般情况下可以不管它。p:
最近邻距离度量参数
。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。- 以上就是DBSCAN类的主要参数介绍,其实需要调参的就是两个参数
eps
和min_samples
,这两个值的组合对最终的聚类效果有很大的影响。
- eps:
常用方法及属性
from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler # 随机变量标准化,使其服从标准正态分布 # Standardize features by removing the mean and scaling to unit variance X_Norm = StandardScaler.fit_transform(X) params = ((0.2, 5), (0.2, 10), (0.2, 15), (0.3, 5), (0.3, 10), (0.3, 15)) # 返回一个簇对象,包含属性core_sample_indices_、labels_(Noisy samples label -1)、 # components_(Copy of each core sample found by training) eps, min_samples = params[i] cls_object = DBSCAN(eps=eps, min_samples=min_samples).fit(X_Norm)
2. 密度最大值聚类(Density-Peek Clustering)
四、层次聚类、谱聚类、高斯混合模型聚类
五、聚类的衡量指标
- 均一性、完整性、V-measure(均一性和完整性的加权平均)
- ARI & AMI
- 轮廓系数 Silhouette Coefficient 和 Calinski-Harabasz Index
- 可通过
from sklearn import metrics
调用