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=8The number of clusters to form as well as the number ofcentroids to generate.init : {'k-means++', 'random', ndarray, callable}, default='k-means++'Method for initialization:'k-means++' : selects initial cluster centers for k-meanclustering in a smart way to speed up convergence. See sectionNotes in k_init for more details.'random': choose `n_clusters` observations (rows) at random from datafor 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 arandom state and return an initialization.n_init : int, default=10Number of time the k-means algorithm will be run with differentcentroid seeds. The final results will be the best output ofn_init consecutive runs in terms of inertia.max_iter : int, default=300Maximum number of iterations of the k-means algorithm for asingle run.tol : float, default=1e-4Relative tolerance with regards to Frobenius norm of the differencein the cluster centers of two consecutive iterations to declareconvergence.precompute_distances : {'auto', True, False}, default='auto'Precompute distances (faster but takes more memory).'auto' : do not precompute distances if n_samples * n_clusters > 12million. This corresponds to about 100MB overhead per job usingdouble precision.True : always precompute distances.False : never precompute distances... deprecated:: 0.23'precompute_distances' was deprecated in version 0.22 and will beremoved in 0.25. It has no effect.verbose : int, default=0Verbosity mode.random_state : int, RandomState instance, default=NoneDetermines random number generation for centroid initialization. Usean int to make the randomness deterministic.See :term:`Glossary <random_state>`.copy_x : bool, default=TrueWhen pre-computing distances it is more numerically accurate to centerthe data first. If copy_x is True (default), then the original data isnot modified. If False, the original data is modified, and put backbefore the function returns, but small numerical differences may beintroduced by subtracting and then adding the data mean. Note that ifthe original data is not C-contiguous, a copy will be made even ifcopy_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=NoneThe number of OpenMP threads to use for the computation. Parallelism issample-wise on the main cython loop which assigns each sample to itsclosest center.``None`` or ``-1`` means using all processors... deprecated:: 0.23``n_jobs`` was deprecated in version 0.23 and will be removed in0.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-definedclusters, by using the triangle inequality. However it's more memoryintensive due to the allocation of an extra array of shape(n_samples, n_clusters).For now "auto" (kept for backward compatibiliy) chooses "elkan" but itmight change in the future for a better heuristic... versionchanged:: 0.18Added 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聚类算法相关推荐

  1. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  2. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  3. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  4. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  5. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  6. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  7. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  8. 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

    一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...

  9. k均值聚类算法优缺点_Grasshopper实现K均值聚类算法

    本文很长很长,有很多很多图,包含以下部分: 1.算法简介 2.如何分类平面点 3.如何分类空间点 4.如何分类多维数据 5.后记 提醒:以下内容包括:智障操作,无中生友,重复造轮子 等 1.算法简介 ...

  10. K均值聚类算法(HCM,K-Means)

    K均值聚类核心思想如下: 算法把n个向量分为个组,并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小.当选择欧几里德距离为组j中向量与相应聚类中心间的非相似性指标时,价值函 ...

最新文章

  1. apache禁止访问html,apache 限制目录访问
  2. 【Spring注解驱动开发】自学java和三大框架要多久
  3. CTF web题总结--http header 修改、cookie注入
  4. mybatis出现 Parameter '__frch_excelModel_0' not found.
  5. SpringBoot AOP完全讲解二:统一处理请求日志
  6. GitHub 标星 32.7 k!一行命令下载全网视频,这个项目牛逼了!
  7. 跟我学 Java 8 新特性之 Stream 流(五)映射
  8. python学生管理系统类图_类图 python
  9. C++字符串完全指南(2) - 各种字符串类- CRT类
  10. zookeeper安装_【Zookeeper】zookeeper的安装与调试
  11. Linux下编译运行Go程序
  12. android 4g获取mac地址,Android手机获取Mac地址的几种方法
  13. 手动打开与关闭软键盘
  14. 实验室主机Ubuntu远程控制+自动开关机
  15. mysql 某个日期加七天_Mysql时间操作(当天,昨天,7天,30天,半年,全年,季度)...
  16. 利用LORA无线信号接入数据的手持PDA装置
  17. libxml2的安装和使用
  18. Excel导出模板加数据时,下拉框丢失解决方案
  19. 在调试器下理解RK3588和LINUX5.10
  20. 线性规划Matlab程序(小白向)

热门文章

  1. 数组中的元素赋值给元素_漫画:寻找无序数组的第k大元素
  2. Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数)
  3. Java8 EnumMap 源码分析
  4. JavaScript实现图像处理----resizeImageWidth调整图像宽度算法(附完整源码)
  5. boost::range模块transformed相关的测试程序
  6. boost::mpl模块实现sort相关的测试程序
  7. boost::mp11::mp_power_set相关用法的测试程序
  8. boost::lambda::ret用法的测试程序
  9. boost::hana::none用法的测试程序
  10. boost::geometry::within用法的测试程序