4.K-MEANS聚类算法
Posted to.to
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.K-MEANS聚类算法相关的知识,希望对你有一定的参考价值。
4.K-MEANS聚类算法
4.1.概述
4.2.算法核心思想
4.3.K-Means原理初探
4.4.传统K-Means算法流程
4.5.K-Means初始化优化K-Means++
4.7.大样本优化Mini Batch K-Means
4.8.K-Means与KNN
4.9.KMEANS术语
4.10.KMEANS算法优缺点
4.11.K-Means算法API文档简介
4.12.K-MEANS算法样例演示
4.13.KMeans算法的十大应用
4.13.1.文档分类器
4.13.2.物品传输优化
4.13.3.识别犯罪地点
4.13.4.客户分类
4.13.5.球队状态分析
4.13.6.保险欺诈检测
4.13.7.乘车数据分析
4.13.8.网络分析犯罪分子
4.13.9.呼叫记录详细分析
4.13.10.IT警报的自动化聚类
4.14.参考文章
4.K-MEANS聚类算法
K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体方法。包括初始化优化K-Means++, 距离计算优化elkan K-Means算法和大数据情况下的优化Mini Batch K-Means算法。
4.1.概述
K-means聚类算法也称k均值聚类算法,是集简单和经典于一身的基于距离的聚类算法。它采用距离作为评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
4.2.算法核心思想
K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
4.3.K-Means原理初探
L-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为k个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
如果用数据表达式表示,假设簇划分为k个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法。
K-Means采用的启发方式很简单,用下面的一组图就可以形象的描述。
上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。
当然在实际的K-Means算法中,我们一般会多次运行图c和图d,才能达到最终的比较优的类别。
4.4.传统K-Means算法流程
在上一节我们对K-Means的原理做了初步的探讨,这里我们对K-Means的算法做一个总结。
首先我们看看K-Means算法的一些要点:
1)对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过交叉验证选择一个合适的k值。
2)在确定了k的个数后,我们需要选择k个初始化的质心,就像上图b中的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近。
好了,现在我们来总结下传统的K-Means算法流程。
总结:
1、首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。
2、从数据集中随机选择k个数据点作为质心。
3、对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。
4、把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。
5、如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
6、如果新质心和原质心距离变化很大,需要迭代3~5步骤。
4.5.K-Means初始化优化K-Means++
在上节我们提到,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心。如果仅仅是完全随机的选择,有可能导致算法收敛很慢。K-Means++算法就是对K-Means随机初始化质心的方法的优化。
K-Means++对于初始化质心的优化策略也很简单,如下:
4.7.大样本优化Mini Batch K-Means
在传统的K-Means算法中,要计算所有的样本点到所有质心的距离。如果样本量非常大,比如达到10万以上,特有的100万以上,此时用传统的K-Means算法非常的耗时,就算加上elkan K-Means优化也依旧。在大数据时代,这样的场景越来越多。此时Mini Batch K-Means应用而生。
顾名思义,Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。
在Mini Batch K-Means中,我们会选择一个合适的批样本大小batch size,我们仅仅用batch size个样本来做K-Means聚类。那么这batch size个样本怎么来的?一般是通过无放回的随机采样得到的。
为了增加算法的准确性,我们一般会多跑几次Mini K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。
4.8.K-Means与KNN
初学者很容易把K-Means和KNN搞混,两者其实差别还是很大的。
K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。
当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。
4.9.KMEANS术语
簇:所有数据的点集合,簇中的对象是相似的。
质心:簇中所有点的中心(计算所有点的中心而来)
4.10.KMEANS算法优缺点
优点:
1、原理比较简单,实现也是很容易,收敛速度快。
2、当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。
3、主要需要调参的参数仅仅是簇数k。
4、算法的可解释度比较强。
缺点:
1、K值需要预先给定,很多情况下K值的估计是非常困难的。
2、K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。
3、对噪音和异常点比较的敏感。用来检测异常值。
4、采用迭代方法,可能只能得到局部的最优解,而无法得到全局的最优解。
5、对于不是凸的数据集比较难收敛。
6、如果各类隐含类别的数据不均衡,比如隐含类别的数据严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
4.11.K-Means算法API文档简介
sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10,
max_iter=300, tol=1e-4, precompute_distances='deprecated',
verbose=0, random_state=None, copy_x=True,
n_jobs='deprecated', algorithm='auto')
参数介绍:
n_clusters : int, default=8
The number of clusters to form as well as the number of
centroids to generate.
init : {'k-means++', 'random', ndarray, callable}, default='k-means++'
Method for initialization:
'k-means++' : selects initial cluster centers for k-mean
clustering in a smart way to speed up convergence. See section
Notes in k_init for more details.
'random': choose `n_clusters` observations (rows) at random from data
for the initial centroids.
If an ndarray is passed, it should be of shape (n_clusters, n_features)
and gives the initial centers.
If a callable is passed, it should take arguments X, n_clusters and a
random state and return an initialization.
n_init : int, default=10
Number of time the k-means algorithm will be run with different
centroid seeds. The final results will be the best output of
n_init consecutive runs in terms of inertia.
max_iter : int, default=300
Maximum number of iterations of the k-means algorithm for a
single run.
tol : float, default=1e-4
Relative tolerance with regards to Frobenius norm of the difference
in the cluster centers of two consecutive iterations to declare
convergence.
precompute_distances : {'auto', True, False}, default='auto'
Precompute distances (faster but takes more memory).
'auto' : do not precompute distances if n_samples * n_clusters > 12
million. This corresponds to about 100MB overhead per job using
double precision.
True : always precompute distances.
False : never precompute distances.
.. deprecated:: 0.23
'precompute_distances' was deprecated in version 0.22 and will be
removed in 0.25. It has no effect.
verbose : int, default=0
Verbosity mode.
random_state : int, RandomState instance, default=None
Determines random number generation for centroid initialization. Use
an int to make the randomness deterministic.
See :term:`Glossary <random_state>`.
copy_x : bool, default=True
When pre-computing distances it is more numerically accurate to center
the data first. If copy_x is True (default), then the original data is
not modified. If False, the original data is modified, and put back
before the function returns, but small numerical differences may be
introduced by subtracting and then adding the data mean. Note that if
the original data is not C-contiguous, a copy will be made even if
copy_x is False. If the original data is sparse, but not in CSR format,
a copy will be made even if copy_x is False.
n_jobs : int, default=None
The number of OpenMP threads to use for the computation. Parallelism is
sample-wise on the main cython loop which assigns each sample to its
closest center.
``None`` or ``-1`` means using all processors.
.. deprecated:: 0.23
``n_jobs`` was deprecated in version 0.23 and will be removed in
0.25.
algorithm : {"auto", "full", "elkan"}, default="auto"
K-means algorithm to use. The classical EM-style algorithm is "full".
The "elkan" variation is more efficient on data with well-defined
clusters, by using the triangle inequality. However it's more memory
intensive due to the allocation of an extra array of shape
(n_samples, n_clusters).
For now "auto" (kept for backward compatibiliy) chooses "elkan" but it
might change in the future for a better heuristic.
.. versionchanged:: 0.18
Added Elkan algorithm
4.12.K-MEANS算法样例演示
import numpy as np
from sklearn.cluster import KMeans
随机构造部分数据
X = np.array([[1,2],[1,4],[1,0],
[10,2],[10,4],[10,0]])
构建模型
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
查看kmeans的分类结果
print(kmeans.labels_)
‘’’
输出结果:
[1 1 1 0 0 0]
‘’’
查看数据集的质心点位置
kmeans.predict([[0, 0], [12, 3]])
使用km模型对未知数据集进行预测
print(kmeans.cluster_centers_)
‘’’
输出结果:
[[10. 2.]
[ 1. 2.]]
‘’’
4.13.KMeans算法的十大应用
4.13.1.文档分类器
根据标签、主题和文档内容将文档分为多个不同的类别。这是一个非常标准且经典的K-means算法分类问题。首先,需要对文档进行初始化处理,将每个文档都用矢量来表示,并使用术语频率来识别常用术语进行文档分类,这一步很有必要。然后对文档向量进行聚类,识别文档组中的相似性。 这里(https://www.codeproject.com/Articles/439890/Text-Documents-Clustering-using-K-Means-Algorithm?spm=a2c4e.11153959.blogcont573745.5.60cf41e2xStlfr)是用于文档分类的K-means算法实现案例。
4.13.2.物品传输优化
使用K-means算法的组合找到无人机最佳发射位置和遗传算法来解决旅行商的行车路线问题,优化无人机物品传输过程。这是(https://upcommons.upc.edu/bitstream/handle/2117/88986/1929-8707-1-PB.pdf?spm=a2c4e.11153959.blogcont573745.6.60cf41e2xStlfr&sequence=1&isAllowed=y)该项目的白皮书。
4.13.3.识别犯罪地点
使用城市中特定地区的相关犯罪数据,分析犯罪类别、犯罪地点以及两者之间的关联,可以对城市或区域中容易犯罪的地区做高质量的勘察。这是(http://www.grdjournals.com/uploads/article/GRDJE/V02/I05/0176/GRDJEV02I050176.pdf?spm=a2c4e.11153959.blogcont573745.7.60cf41e2xStlfr&file=GRDJEV02I050176.pdf)基于德里飞行情报区犯罪数据的论文。
4.13.4.客户分类
聚类能过帮助营销人员改善他们的客户群(在其目标区域内工作),并根据客户的购买历史、兴趣或活动监控来对客户类别做进一步细分。这(https://www.researchgate.net/publication/268445170_Prepaid_Telecom_Customer_Segmentation_Using_the_K-Mean_Algorithm?spm=a2c4e.11153959.blogcont573745.8.60cf41e2xStlfr)是关于电信运营商如何将预付费客户分为充值模式、发送短信和浏览网站几个类别的白皮书。对客户进行分类有助于公司针对特定客户群制定特定的广告。
4.13.5.球队状态分析
分析球员的状态一直都是体育界的一个关键要素。随着竞争越来愈激烈,机器学习在这个领域也扮演着至关重要的角色。如果你想创建一个优秀的队伍并且喜欢根据球员状态来识别类似的球员,那么K-means算法是一个很好的选择。具体细节和实现请参照这篇文章(http://thespread.us/clustering.html?spm=a2c4e.11153959.blogcont573745.9.60cf41e2xStlfr)。
4.13.6.保险欺诈检测
机器学习在欺诈检测中也扮演着一个至关重要的角色,在汽车、医疗保险和保险欺诈检测领域中广泛应用。利用以往欺诈性索赔的历史数据,根据它和欺诈性模式聚类的相似性来识别新的索赔。由于保险欺诈可能会对公司造成数百万美元的损失,因此欺诈检测对公司来说至关重要。这是(http://www.aeuso.org/includes/files/articles/Vol8_Iss27_3764-3771_Fraud_Detection_in_Automobile_Insur.pdf?spm=a2c4e.11153959.blogcont573745.10.60cf41e2xStlfr&file=Vol8_Iss27_3764-3771_Fraud_Detection_in_Automobile_Insur.pdf)汽车保险中使用聚类来检测欺诈的白皮书。
4.13.7.乘车数据分析
面向大众公开的Uber乘车信息的数据集,为我们提供了大量关于交通、运输时间、高峰乘车地点等有价值的数据集。分析这些数据不仅对Uber大有好处,而且有助于我们对城市的交通模式进行深入的了解,来帮助我们做城市未来规划。这是(https://mapr.com/blog/monitoring-real-time-uber-data-using-spark-machine-learning-streaming-and-kafka-api-part-1/?spm=a2c4e.11153959.blogcont573745.11.60cf41e2xStlfr)一篇使用单个样本数据集来分析Uber数据过程的文章。
4.13.8.网络分析犯罪分子
网络分析是从个人和团体中收集数据来识别二者之间的重要关系的过程。网络分析源自于犯罪档案,该档案提供了调查部门的信息,以对犯罪现场的罪犯进行分类。这是(https://thesai.org/Downloads/Volume7No7/Paper_59-Cyber_Profiling_Using_Log_Analysis_And_K_Means_Clustering.pdf?spm=a2c4e.11153959.blogcont573745.12.60cf41e2xStlfr&file=Paper_59-Cyber_Profiling_Using_Log_Analysis_And_K_Means_Clustering.pdf)一篇在学术环境中,如何根据用户数据偏好对网络用户进行 cyber-profile的论文。
4.13.9.呼叫记录详细分析
通话详细记录(CDR)是电信公司在对用户的通话、短信和网络活动信息的收集。将通话详细记录与客户个人资料结合在一起,这能够帮助电信公司对客户需求做更多的预测。在这篇文章(https://www.kdnuggets.com/2017/06/k-means-clustering-r-call-detail-record-analysis.html?spm=a2c4e.11153959.blogcont573745.13.60cf41e2xStlfr)中,你将了解如何使用无监督K-Means聚类算法对客户一天24小时的活动进行聚类,来了解客户数小时内的使用情况。
4.13.10.IT警报的自动化聚类
大型企业IT基础架构技术组件(如网络,存储或数据库)会生成大量的警报消息。由于警报消息可以指向具体的操作,因此必须对警报信息进行手动筛选,确保后续过程的优先级。对数据进行聚类(https://content.pivotal.io/blog/using-data-science-techniques-for-the-automatic-clustering-of-it-alerts?spm=a2c4e.11153959.blogcont573745.14.60cf41e2xStlfr)可以对警报类别和平均修复时间做深入了解,有助于对未来故障进行预测。
4.14.参考文章
https://www.cnblogs.com/txx120/p/11487674.html
https://www.cnblogs.com/pinard/p/6164214.html
https://www.jianshu.com/p/27eaa18ca1db
https://www.jianshu.com/p/4f032dccdcef
https://www.biaodianfu.com/k-means.html
https://www.sohu.com/a/286841039_654419
关于KMeans和MiniBatchKMeans和案例介绍的比较好的一篇文章:
https://www.cnblogs.com/pinard/p/6169370.html
以上是关于4.K-MEANS聚类算法的主要内容,如果未能解决你的问题,请参考以下文章
机器学习之聚类算法(k-meansCanopy层次聚类谱聚类)
第二节4:K-Means算法及其Python实现(初始中心点的选择和K-Means++算法)