最近机器学习、人工智能很火热,今天向大家介绍一个聚类分析中的经典算法——K-means算法(K均值算法)。
01 聚类分析简介
所谓的聚类分析,就是发现数据对象之间的关系,将数据进行分组(目的),组内的相似性越大,组间的差别越大,则聚类效果越好(评价标准)。
同样是分组,那聚类和分类有什么区别呢?聚类是无监督的学习算法,分类是有监督的学习算法。
所谓有监督就是有已知标签的训练集(也就是说提前知道训练集里的数据属于哪个类别),机器学习算法在训练集上学习到相应的参数,构建模型,然后应用到测试集上。而聚类算法是没有标签的,聚类的时候,我们并不关心某一类是什么,我们需要实现的目标只是把相似的东西聚到一起。
聚类分析能够应用在哪些场景下呢?在我熟悉的金融领域,聚类分析主要应用在客户细分,信贷风控和反欺诈中。
以“客户细分”为例,银行一般都有CRM系统(客户关系管理系统),CRM中一般根据客户资产或者贡献度把客户分成私行客户、钻石客户、白金客户和普通客户。但是这种根据单一维度细分客户的方法并不能全面反映出客户的特点,有时候我们需要根据多个维度(基本信息、产品配置情况、风险偏好、征信情况等)细分客户,比如可以把客户分成高价值客户、成长型客户和普通客户。
然后针对不同类型的客户指定个性化营销方案:针对高价值客户,做好流失预警;针对成长型客户,深入挖掘客户需求;针对普通客户,由外呼团队批量营销。
刚才提到聚类分析的概念是将“相似度”接近的样本放入一个簇中,那么如何衡量“相似度”呢?在聚类分析中,一般用聚类表示“相似度”。常用的距离计算公式是闵可夫斯基距离:
考虑一种特殊情况,当P=2时,闵式距离就是我们常说的“欧几里得距离”,也就是后面要介绍的K-means算法中用到的距离计算公式。
02 K-means算法简介
K-means算法,是一种典型的基于距离的聚类算法。为什么叫K-means呢?
K值:簇的个数,需提前指定。
均值向量:迭代时,选择簇内样本的均值向量作为簇的中心。
评价K-means算法性能的方式有很多种,下面介绍一种简单的、基于平法误差的计算公式:x为簇内样本,u为簇的中心,E值越小,说明簇内样本距离越小,相似度越高。
K-means算法的流程如下:
首先,给定样本集D和预先指定的簇数K(也就是分类的个数),从D中随机选取K个样本作为初始向量。
然后进入迭代,第一步循环,计算每个样本属于哪个簇;第二部循环,更新均值向量。
迭代结束的条件有两种:可以设置迭代次数,比如5次、10次,也可以判断均值向量是否还更新,如不再更新(每次更新之间的差距小于一个足够小的数),则终止迭代。
K-means算法优点:简单,易于理解和实现;收敛快,一般仅需5-10次迭代即可;高效,时间复杂度为O(T*K*N)。
当然K-means算法也有很多缺点:K值需预先给定,而很多情况下K值得估计是很困难的;对初始点的选取敏感,不同的随机初始点得到的聚类结果可能完全不同;对噪点过于敏感,因为算法是基于均值的,均值有些时候是不靠谱的;对球形簇的分组效果较好,对非球型簇、不同尺寸、不同密度的簇分组效果不好。
举个例子,还是上面的案例,如果初始点选择不合适,最终的分组效果较上面有很大的差异。
03 如何改进K-means算法
针对K值需事先给定的问题,在没有先验经验的情况下,我们不妨多尝试几种不同的K值,然后分别计算E值(平方误差),找到“拐点”。如下图这种情况,当K=5时,聚类性能基本达到最优效果,当K继续增加,性能并没有明显的提升,那么最终的聚类算法K值即可选择为5。
针对算法对初始点敏感的问题,我们可以选择距离尽可能远的点作为初始点。
针对算法对初始点敏感的问题,我们在预处理阶段,对数据进行归一化处理时可考虑剔除噪点。如果99%的客户收入为10-20万,只有1%的客户收入为200万以上,那么我们在做归一化处理时,不妨选取99%客户收入的最大值为最大值,那1%的收入直接置为1即可。
针对近期对K-means算法的学习,简单总结,后续继续完善~