聚类分析在客户细分中极为重要。有三类比较常见的聚类模型,K-mean聚类、层次(系统)聚类、最大期望EM算法。在聚类模型建立过程中,一个比较关键的问题是如何评价聚类结果如何,会用一些指标来评价。 文章目录
一、scikit-learn中的Kmeans介绍
官网scikit-learn案例地址:http://scikit-learn.org/stable/modules/clustering.html#k-means 各个聚类的性能对比:
1、相关理论参考:K-means算法及文本聚类实践
k-meams算法的能够保证收敛,但不能保证收敛于全局最优点,当初始中心点选取不好时,只能达到局部最优点,整个聚类的效果也会比较差。可以采用以下方法:k-means中心点 选择彼此距离尽可能远的那些点作为中心点;
k-means的误差函数有一个很大缺陷,就是随着簇的个数增加,误差函数趋近于0,最极端的情况是每个记录各为一个单独的簇,此时数据记录的误差为0,但是这样聚类结果并不是我们想要的,可以引入结构风险对模型的复杂度进行惩罚: λλ是平衡训练误差与簇的个数的参数,但是现在的问题又变成了如何选取λλ了,有研究[参考文献1]指出,在数据集满足高斯分布时,λ=2mλ=2m,其中m是向量的维度。 另一种方法是按递增的顺序尝试不同的k值,同时画出其对应的误差值,通过寻求拐点来找到一个较好的k值,详情见下面的文本聚类的例子。 2、主函数KMeans参考博客:python之sklearn学习笔记
参数的意义:
虽然有很多参数,但是都已经给出了默认值。所以我们一般不需要去传入这些参数,参数的。可以根据实际需要来调用。 3、简单案例一参考博客:python之sklearn学习笔记
estimator初始化Kmeans聚类;estimator.fit聚类内容拟合; 4、案例二案例来源于:使用scikit-learn进行KMeans文本聚类
km_cluster是KMeans初始化,其中用init的初始值选择算法用’k-means++’;
其中:
这是两种聚类结果标签输出的方式,结果貌似都一样。都需要先km_cluster.fit(data),然后再调用。 5、案例四——Kmeans的后续分析Kmeans算法之后的一些分析,参考来源:用Python实现文档聚类
分为五类,同时用%time来测定运行时间,把分类标签labels格式变为list。
选择更靠近质心的点,其中 km.cluster_centers_代表着一个 (聚类个数*维度数),也就是不同聚类、不同维度的均值。 类别内的组内平方和要参考以下公式:
. **公众号“素质云笔记”定期更新博客内容:** ![这里写图片描述](https://img-blog.csdn.net/20180226155348545?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 二、大数据量下的Mini-Batch-KMeans算法部分内容参考来源:scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法 MiniBatchKmeans 继承自Kmeans 因为MiniBathcKmeans 本质上还利用了Kmeans 的思想.从构造方法和文档大致能看到这些参数的含义,了解了这些参数会对使用的时候有很大的帮助。batch_size 是每次选取的用于计算的数据的样本量,默认为100. Mini Batch K-Means算法是K-Means算法的变种,采用小批量的数据子集减小计算时间,同时仍试图优化目标函数,这里所谓的小批量是指每次训练算法时所随机抽取的数据子集,采用这些随机产生的子集进行训练算法,大大减小了计算时间,与其他算法相比,减少了k-均值的收敛时间,小批量k-均值产生的结果,一般只略差于标准算法。 该算法的迭代步骤有两步: 来看一下 MiniBatchKMeans的python实现: 主函数 :
相关参数解释(来自博客:用scikit-learn学习K-Means聚类):
内容跟kmeans很像,只是一般多加一个参数,batch_size。 . 三、sklearn中的cluster进行kmeans聚类参考博客:python之sklearn学习笔记
四、分类变量聚类方法的K-modes与K-prototypeK-prototype与K-modes K-modes是K-means用在非数值集合上的一种方法,将原本K-means使用的欧式距离替换成字符间的汉明距离。 K-prototype是K-means与K-modes的一种集合形式,适用于数值类型与字符类型集合的数据。
code实现可参考:nicodv/kmodes **公众号“素质云笔记”定期更新博客内容:** ![这里写图片描述](https://img-blog.csdn.net/20180226155348545?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) . 延伸一:数据如何做标准化
. 延伸二:Kmeans可视化案例来源于博客:使用python-sklearn-机器学习框架针对140W个点进行kmeans基于密度聚类划分
延伸三:模型保存
延伸四:HDBSCAN与Kmeans的聚类的一些纪要如果输入数据的变量类型不同,部分是数值型(numerical),部分是分类变量(categorical),需要做特别处理。 方法1是将分类变量转化为数值型,但缺点在于如果使用独热编码(one hot encoding)可能会导致数据维度大幅度上升,如果使用标签编码(label encoding)无法很好的处理数据中的顺序(order)。方法2是对于数值型变量和分类变量分开处理,并将结果结合起来,具体可以参考Python的实现[1],如K-mode和K-prototype。 输出结果非固定,多次运行结果可能不同。 首先要意识到K-means中是有随机性的,从初始化到收敛结果往往不同。一种看法是强行固定随机性,比如设定sklearn中的random state为固定值。另一种看法是,如果你的K均值结果总在大幅度变化,比如不同簇中的数据量在多次运行中变化很大,那么K均值不适合你的数据,不要试图稳定结果 [2] 运行效率与性能之间的取舍。 但数据量上升到一定程度时,如>10万条数据,那么很多算法都不能使用。最近读到的一篇对比不同算法性能随数据量的变化很有意思 [Benchmarking Performance and Scaling of Python Clustering Algorithms]。在作者的数据集上,当数据量超过一定程度时仅K均值和HDBSCAN可用。
因此不难看出,K均值算法最大的优点就是运行速度快,能够处理的数据量大,且易于理解。但缺点也很明显,就是算法性能有限,在高维上可能不是最佳选项。 一个比较粗浅的结论是,在数据量不大时,可以优先尝试其他算法。当数据量过大时,可以试试HDBSCAN。仅当数据量巨大,且无法降维或者降低数量时,再尝试使用K均值。 一个显著的问题信号是,如果多次运行K均值的结果都有很大差异,那么有很高的概率K均值不适合当前数据,要对结果谨慎的分析。 此外无监督聚类的评估往往不易,基本都是基于使用者的主观设计,如sklearn中提供的Silhouette Coefficient和 Calinski-Harabaz Index [5]。更多关于无监督学习如何评估可以参考 [微调:一个无监督学习算法,如何判断其好坏呢?]。 |