聚类分析:用于客户细分极为重要。三类常见的聚类模型,K-Means,层次聚类,最大期望EM算法,其他的还有密度聚类
如何评价聚类结果好坏,一些常用的指标又有哪些
聚类分析的目的:让类群内观测的距离最近,同时不同全体之间的距离最大
1.聚类分析的距离问题:样本聚类距离:欧式距离,绝对值距离,明式距离,马氏距离。概率分布的距离衡量:k_l代表P,Q概率分布差的期望
聚类分析一般要进行标准化,因为聚类数据收到量纲的影响
标准化 x-min(x) / max(x)-min(x) 最小最大规范化 也叫离差标准化,是对原始数据的线性变换,将数据映射到[0,1]之间,与功效系数法相同
正态标准差标准化、零均值规范化等方法,经过处理的数据均值为0,标准差为1。公式为:
x*=(x-均值)/标准差
因为均值受离群值影响较大,也可以将均值替换成变量的中位数。
2.群体聚类距离:
3.常见的聚类模型:
K_means:
1.将所有的点划分到k个群体,使得群体之间的距离尽量大,全体内部距离和最小,k均值是在每次迭代中只计算聚类分布的质心
2.k均值对离值点最敏感,因为她使用集群数据点的平均值来查找集群的中心。所有对包含异常值,数据密度不均匀,数据点为非凹的情况下,效果差
3.多次kmeans 结果会好点,kmeans聚类算法通常对局部最小值进行转换,个别时候这个局部最小值也是全集最小值,所有多运行几次进行推断,种子也都一样
4.初始化累中心很重要,不是花不良会降低受i按速度差,是聚类效果差,使用forgy和随机分区的方法
forgy 方法:从数据集中随机选择k个观测值,并将其作为初始值
随机分区方法是先随机为每个观测值分配一个簇,随后进行更新,簇的随机分配点的质心就是计算后得到的初始平均值
层次聚类:系统聚类法,是根据个体间距离将个体向上两两聚合,再将聚合的小群体两两聚合一直到聚为一个整体。计算所有个体之间的距离,最相近距离的个体合体,不断合体。
对于层次聚类的的群平均值,两个簇的接近度指的是不同集群中的每一对点对的近似值的平均值。这是最大值和最小值方法之间的中间方法。
Ward 方法是一种质心算法。质心方法通过计算集群的质心之间的距离来计算两个簇的接近度。对于 Ward 方法来说,两个簇的接近度指的是当两个簇合并时产生的平方误差的增量。在6%的样本数据集中,使用 Ward 方法产生的结果和使用最大值、最小值、组平均值的聚类结果会有所不同。
最大期望EM算法:在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。K-means可以看作是EM模型聚类的一个特例。
A、设定要分成的类的数目K以及每一个类的初始概率分布
B、E步:对每一个个体计算其属于每一类的后验概率
C、M步:基于极大似然估计更新每个类的概率分布函数
D、迭代执行以上E步和M步直至似然函数收敛
E、基于最大概率值确定每个个体所属的类
K-means(kmeans) 层次聚类(kmeans) EM模型聚类(mclust包)
优点 属于快速聚类,计算效率高 层次鲜明,易于理解,层次后选择累的个数 拟合多种形状的类
缺点 指定类个数,不稳定,容易 计算量大,不适合样本量大的情形,用于宏观 需要事先2指定类个数和初始分布
局部收敛 评价
应用中需要注意的:
1.要标准化,量纲归一。特征缩放保证了在聚类分析中每一个特征都有同样的权重
2. 聚类分群的数量如何确定?分群效果如何?
一般分为3-10群,或者使用一些指标评价,然后交叉验证不同群的分群指标
一般是指标:轮廓系数silhouette(-1,1之间,值越大,聚类效果越好),兰德系数rand,
商业上的指标:分群结果的覆盖率,分群结果的稳定性,恩群结果死否从商业上易于理解和执行
轮廓系数旨在将某个对象与自己的簇的相似程度和与其他簇的相似程度进行比较。轮廓系数最高的簇的数量表示簇的数量的最佳选择。
平均轮廓系数越高越好,也就是2时,但是2时她的SSE特别高,所以k=6,比较均衡,可以说是蛮不错的
4.聚类不是受到异方差,的影响,但是会收到多重共线性的负影响,因为相关的变量会在特征计算中占据很大的权重
问题1:假如kmeans出现的超级大群现象,怎么解决,也就是一类样本很多,其他类别很少.
1.有序变量:天气类型列入,和适合取均值,容易分类时候有分歧,而且一些数值大的要标准化
2.超大群/长尾特征:
解决办法:那么为了解决这个问题,一种可行的方法是是对特征取LOG,减轻长尾问题。经过这两种方法处理后,都能较好的对玩家进行分类。下图是上图中的数据点取LOG后得到的分布图。
缺点:取LOG的方法的缺点在于,会使数据变得不直观,不好理解。
**DBSCAN(密度聚类):**动态聚类,聚出来的点有点圆形或者椭圆形。思路:顶一个距离半径,定最少有多少个点,然后把可以到达的点都连起来,判定为同类。
任意形状都可以使用,而kmeans只能用于凸样本集,还可以找出异常点
从实践的效果来看,层次聚类一运行,大数据集因为内存问题就爆,动态聚类倒是可以运行,但是呢!!
消耗CPU较大,运行地起来,就是慢…
PYTHON中的分群质量:这三种比较好:Calinski-Harabaz Index(未知真实index的模型评估)、Homogeneity, completeness and V-measure(聚类数量情况)、Silhouette Coefficient 轮廓系数,其他的还有兰德系数,Fowlkes-Mallows scores
1.兰德指数
from sklearn import metrics
labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [0, 0, 1, 1, 2, 2]
metrics.adjusted_rand_score(labels_true, labels_pred)
0.24
2.Homogeneity, completeness and V-measure
同质性homogeneity:每个群集只包含单个类的成员。metrics.homogeneity_score(labels_true, labels_pred) 0.66
完整性completeness:给定类的所有成员都分配给同一个群集。metrics.completeness_score(labels_true, labels_pred) 0.42
两者的调和平均V-measure: metrics.v_measure_score(labels_true, labels_pred) 0.51
3.Fowlkes-Mallows scores
metrics.fowlkes_mallows_score(labels_true, labels_pred)
0.47140
4.Silhouette Coefficient 轮廓系数
metrics.silhouette_score(X, labels, metric=‘euclidean’) 0.55
5.Calinski-Harabaz Index
类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。
与轮廓系数的对比,笔者觉得最大的优势:快!相差几百倍!毫秒级
日推音乐一首 李常超《扇子舞》