聚类:
相似度与距离度量:
定义距离来度量表示相似度:欧式距离,曼哈顿距离( D i j = ∣ x i − x j ∣ + ∣ y i − y j ∣ D_{ij}=|x_i-x_j|+|y_i-y_j| Dij=∣xi−xj∣+∣yi−yj∣),闵可夫斯基距离(n次欧式距离),切比雪夫距离( D i j = m a x ∣ x i − x j ∣ D_{ij}=max|x_i-x_j| Dij=max∣xi−xj∣)
1.基于划分
给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K
算法:K-means算法、K-medians算法、CLARANS算法
2.基于层次
对给定的数据集进行层次似的分解,直到某种条件满足为止。具体又可分为“自底向上”和“自顶向下”两种方案。
特点:较小的计算开销。然而这种技术不能更正错误的决定。
算法:BIRCH算法、CURE算法、CHAMELEON算法
3.基于密度
只要一个区域中的点的密度大过某个阈值,就把它加到与之相近的聚类中去。
特点:能克服基于距离的算法只能发现“类圆形”的聚类的缺点。
算法:DBSCAN算法、OPTICS算法、DENCLUE算法
4.基于网格
将数据空间划分成为有限个单元(cell)的网格结构,所有的处理都是以单个的单元为对象的。
特点:处理速度很快,通常这是与目标数据库中记录的个数无关的,只与把数据空间分为多少个单元有关。
算法:STING算法、CLIQUE算法、WAVE-CLUSTER算法
硬聚类和软聚类
硬聚类(hard clustering)是指数据集中的样本只能划分到一个簇中,如k-means算法。软聚类(soft clustering)或模糊聚类(fuzzy clustering)可以将一个样本划分到多个不同的簇中,如C-means(FCM)算法,FCM的计算步骤与k-means相似,只是FCM是使用样本属于不同簇的概率来代替k-means中的类标。样本属于不同簇的概率之和为1。
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
迭代收敛定义:
(1)聚类中心不再有变化
(2)每个样本到对应聚类中心的距离之和不再有很大变化
损失函数:
假定 u 1 , u 2 , . . . , u k u_1,u_2,...,u_k u1,u2,...,uk 为K个聚类中心,用 r n k ∈ 0 , 1 r_{nk}\in{0,1} rnk∈0,1 表示 x n x_n xn 是否属于聚类K,则损失函数定义如下(簇内误差平方和SSE): S S E = J ( u , r ) = ∑ n = 1 N ∑ k = 1 K r n k ∣ x n − u k ∣ 2 SSE = J(u,r) = \sum_{n=1}^N \sum_{k=1}^K r_{nk}|x_n-u_k|^2 SSE=J(u,r)=n=1∑Nk=1∑Krnk∣xn−uk∣2由于SSE是一个非凸函数(non-convex function),所以SSE不能保证找到全局最优解,只能确保局部最优解。但是可以重复执行几次kmeans,选取SSE最小的一次作为最终的聚类结果。
K-means算法优点:
K-means算法缺点:
注意:由于k-means算法是基于欧式距离来计算的,所以k-means算法对于数据的范围比较敏感,所以在使用k-means算法之前,需要先对数据进行标准化,保证k-means算法不受特征量纲的影响。
K均值算法的调优一般可以从以下几个角度出发。
K-Means算法需要随机选择初始化的中心点,如果中心点选择不合适,可能会导致簇的效果不好或产生收敛速度慢等问题。解决这个问题一个比较合适的方法就是,在数据集上多次运行K-Means算法,根据簇内误差平方和(SSE)来选择性能最好的模型。除此之外,还可以通过K-Means++算法,让初始的中心点彼此的距离尽可能的远,相比K-Means算法,它能够产生更好的模型。
K-Means++有下面几个步骤组成:
elkan K-Means算法的目标是减少不必要的距离的计算,利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。
利用上边的两个规律,elkan K-Means比起传统的K-Means迭代速度有很大的提高。但是如果我们的样本的特征是稀疏的,有缺失值的话,这个方法就不使用了,此时某些距离无法计算,则不能使用该算法。
如果样本量非常大,比如达到10万以上,特征有100以上,此时用传统的K-Means算法非常的耗时,就算加上elkan K-Means优化也依旧。Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means(一般是通过无放回的随机采样得到的),这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。
K-Medians是K-Means的一种变体,是用数据集的中位数而不是均值来计算数据的中心点。
K-Medians的优势是使用中位数来计算中心点不受异常值的影响;缺点是计算中位数时需要对数据集中的数据进行排序,速度相对于K-Means较慢。
当K值的大小不确定时,可以使用ISODATA算法,全称是迭代自组织数据分析法。ISODATA算法的思想很直观,当属于某个类别的样本数过少时,把该类别去除;当属于某个类别的样本数过多、分散程度较大时,把该类别分为两个子类别。ISODATA算法在K均值算法的基础之上增加了两个操作,一是分裂操作,对应着增加聚类中心数;二是合并操作,对应着减少聚类中心数。ISODATA算法是一个比较常见的算法,其缺点是需要指定的参数比较多,不仅仅需要一个参考的聚类数量K,还需要制定3个阈值。下面介绍ISODATA算法的各个输入参数。
肘部法则(Elbow method):找到随着K值变大,损失函数的拐点。
手肘法是一个经验方法,缺点就是不够自动化。Gap Statistic方法的优点是,不再需要肉眼判断,而只需要找到最大的Gap statistic所对应的K即可,因此该方法也适用于批量化作业。在这里我们继续使用上面的损失函数,当分为K簇时,对应的损失函数记为 D k D_k Dk。Gap Statistic定义为 G a p ( K ) = E ( l o g D k ) − l o g D k Gap(K)=E(logD_k)−logD_k Gap(K)=E(logDk)−logDk 其中 E ( l o g D k ) E(logD_k) E(logDk) 是 l o g D k logD_k logDk 的期望,一般通过蒙特卡洛模拟产生。我们在样本所在的区域内按照均匀分布随机地产生和原始样本数一样多的随机样本,并对这个随机样本做K均值,得到一个 D k D_k Dk;重复多次就可以计算出 E ( l o g D k ) E(logD_k) E(logDk)的近似值。
那么Gap(K)有什么物理含义呢?它可以视为随机样本的损失与实际样本的损失之差。试想实际样本对应的最佳簇数为K,那么实际样本的损失应该相对较小,随机样本损失与实际样本损失之差也相应地达到最小值,从而Gap(K)取得最大值所对应的K值就是最佳的簇数。
sklearn.cluster.KMeans(
n_clusters = 8, #聚类个数,K值,默认8
init = 'k-means++',
n_init = 10,
max_iter = 300,
tol = 0.0001,
precompute_distances = 'auto',
verbose = 0,
random_state = None,
copy_x = True,
n_jobs = 1,
algorithm = 'auto'
)
# 一些重要的参数:
n_clusters = 8, #聚类个数,K值,默认8
init = 'k-means++', #初始化类中心点选择方法,可选:
{
'k-means++', #是一种优化选择方法,比较容易收敛
'random', #随机选择
an ndarray #可以通过输入ndarray数组手动指定中心点
}
max_iter: #最大迭代数
precompute_distances: #预计算距离,计算速度更快但占用更多内存。auto True
copy_x # True,原始数据不变,False直接在原始数据上做更改
轮廓分析(silhouette analysis),使用图形工具来度量簇中样本的聚集程度,除k-means之外也适用于其他的聚类算法。通过三个步骤可以计算出当个样本的轮廓系数(silhouette coefficient)
1、将样本x与簇内的其他点之间的平均距离作为簇内的内聚度a
2、将样本x与最近簇中所有点之间的平均距离看作是与最近簇的分离度b
3、将簇的分离度与簇内聚度之差除以二者中比较大的数得到轮廓系数,计算公式如下: S i = b i − a i m a x ( b i , a i ) S^i = \frac{b^i-a^i}{max(b^i,a^i)} Si=max(bi,ai)bi−ai轮廓系数的取值在-1到1之间。当簇内聚度与分度离相等时,轮廓系数为0。当b>>a时,轮廓系数近似取到1,此时模型的性能最佳。计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数