k-means算法原理

K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,直到质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

聚类算法:是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。

聚类算法与分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习算法,分类是知道结果的。

在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

k-means算法流程

1.选择聚类的个数k(kmeans算法传递超参数的时候,只需设置最大的K值)

2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。

3.对每个点确定其聚类中心点。

4.再计算其聚类新中心。

5.重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。)

k-means优点与缺点

优点:

1、原理简单(靠近中心点) ,实现容易

2、聚类效果中上(依赖K的选择)

3、空间复杂度o(N)时间复杂度o(IKN,N为样本点个数,K为中心点个数,I为迭代次数)

缺点:

1、对离群点, 噪声敏感 (中心点易偏移)

2、很难发现大小差别很大的簇及进行增量计算

3、结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)

k-means的经典案例与适用范围

1.文档分类器:根据标签、主题和文档内容将文档分为多个不同的类别。这是一个非常标准且经典的K-means算法分类问题。

2.物品传输优化:使用K-means算法的组合找到无人机最佳发射位置和遗传算法来解决旅行商的行车路线问题,优化无人机物品传输过程。

3.识别犯罪地点:使用城市中特定地区的相关犯罪数据,分析犯罪类别、犯罪地点以及两者之间的关联,可以对城市或区域中容易犯罪的地区做高质量的勘察。

4.客户分类聚类能过帮助营销人员改善他们的客户群(在其目标区域内工作),并根据客户的购买历史、兴趣或活动监控来对客户类别做进一步细分。

5.球队状态分析:分析球员的状态一直都是体育界的一个关键要素。随着竞争越来愈激烈,机器学习在这个领域也扮演着至关重要的角色。如果你想创建一个优秀的队伍并且喜欢根据球员状态来识别类似的球员,那么K-means算法是一个很好的选择。

6.保险欺诈检测:利用以往欺诈性索赔的历史数据,根据它和欺诈性模式聚类的相似性来识别新的索赔。由于保险欺诈可能会对公司造成数百万美元的损失,因此欺诈检测对公司来说至关重要。

7.乘车数据分析:面向大众公开的Uber乘车信息的数据集,为我们提供了大量关于交通、运输时间、高峰乘车地点等有价值的数据集。分析这些数据不仅对Uber大有好处,而且有助于我们对城市的交通模式进行深入的了解,来帮助我们做城市未来规划。

8.网络分析犯罪分子:网络分析是从个人和团体中收集数据来识别二者之间的重要关系的过程。网络分析源自于犯罪档案,该档案提供了调查部门的信息,以对犯罪现场的罪犯进行分类。

9.呼叫记录详细分析:通话详细记录(CDR)是电信公司在对用户的通话、短信和网络活动信息的收集。将通话详细记录与客户个人资料结合在一起,这能够帮助电信公司对客户需求做更多的预测。

10.IT警报的自动化聚类:大型企业IT基础架构技术组件(如网络,存储或数据库)会生成大量的警报消息。由于警报消息可以指向具体的操作,因此必须对警报信息进行手动筛选,确保后续过程的优先级。对数据进行聚类可以对警报类别和平均修复时间做深入了解,有助于对未来故障进行预测。

sk-learns的参数详解与调优流程

不像监督学习的分类问题和回归问题,无监督聚类没有样本输出,也就没有比较直接的聚类评估方法。目前来讲有两种方法能够比较好的确定k的取值:

(1)惯性确定法,惯性只样本到其最近聚类中心的平方距离之和。 基于欧几里得距离,K-Means算法需要优化的问题就是,使得簇内误差平方和(within-cluster sum of squared errors,SSE)最小,也叫簇惯性(cluster intertia)。随着分类数量的增多,SE的数值也会变得越来越小,但并不是分类数量越多越好,在选择时就需要选择‘拐点处的k值’后边有详细介绍。

SSE

(2)另一种方法是从簇内的稠密程度和簇间的离散程度来评估聚类的效果。常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index。个人比较喜欢Calinski-Harabasz Index,这个计算简单直接,得到的Calinski-Harabasz分数值s越大则聚类效果越好。Calinski-Harabasz分数值s的数学计算公式是:

Calinski-Harabasz

其中m为训练集样本数,k为类别数。Bk为类别之间的协方差矩阵,Wk为类别内部数据的协方差矩阵。tr为矩阵的迹。也就是说,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabsaz_score.

实战案例-使用sk_learn里的KMeans模块进行演示:

import numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansfrom sklearn.datasets import make_blobs ##为聚类产生数据集from sklearn import metrics#以下利用sklearn的make_blobs生成k-means测试数据n_samples=5000 #样本数量:5000random_state=10 #随机种子centers=5 #分类数x, y = make_blobs(centers=centers,n_samples=n_samples, random_state=random_state) #生成随机数plt.figure(figsize=(25, 25))plt.subplot(4,3,1)plt.scatter(x[:,0],x[:,1],c=y)plt.title('initial data')

生成的测试数据如下:

原始数据

对数据进行计算,n_clusters的取值范围在2~9,并记录每一个n_clustrs取值时的SSE与calinski_harabaz_score取值:

inertia=[]calinski_harabaz_score=[]a=2for i in range(2,10): km = KMeans(n_clusters=i,n_init=10,init='k-means++').fit(x) y_pred=km.predict(x) center_=km.cluster_centers_ inertia.append([i,km.inertia_]) z=metrics.calinski_harabaz_score(x, y_pred)  calinski_harabaz_score.append([i,z]) plt.subplot(4,3,a) a=a+1 plt.scatter(x[:,0],x[:,1],c=y_pred) plt.scatter(center_[:,0],center_[:,1],color='red') plt.title('n_clusters=%s'%i)inertia=np.array(inertia)plt.subplot(4,3,10)plt.plot(inertia[:, 0], inertia[:, 1])plt.title('SSE - n_clusters')plt.subplot(4,3,11)calinski_harabaz_score=np.array(calinski_harabaz_score)plt.plot(calinski_harabaz_score[:, 0], calinski_harabaz_score[:, 1])plt.title('calinski_harabaz_score - n_clusters')plt.show()

最终结果如下:n_clusters=2

n_clusters=2

n_clusters=5

n_clusters=5

n_clusters=9

n_clusters=9

在不同的n_clusters取值情况下,SSE与calinski_harabaz_score的取值情况:

SSE随n_clusters变化

metrics.calinski_harabsaz_score随n_clusters的变化

通过SSE的定义可知,SSE随着n_clusters的增大是会变小的,一般会在SSE出现拐点的地方取值,同时还需要参考calinski_harabaz_score的取值。在此案例中能够看出,SSE在n_clusters=5的时候出现较大的拐点,calinski_harabaz_score在n_clusters=5的时候取得最大值。

kmeans聚类算法_k-means聚类算法原理与参数调优详解相关推荐

  1. k-means聚类算法原理与参数调优详解

    https://www.toutiao.com/a6690435044869145101/ k-means算法原理 K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初 ...

  2. Golang 侧数据库连接池原理和参数调优

    Golang 侧数据库连接池原理和参数调优 文章目录 Golang 侧数据库连接池原理和参数调优 数据库连接池 数据库连接池的设计 Go 的数据库连接池 Go 数据库连接池的设计 建立连接 释放连接 ...

  3. 粒子群算法原理|python实现|参数调优

    粒子群算法是比较有名的群体智能算法之一,其他群体智能算法还包括蚁群算法.鱼群算法.人工蜂群算法等.今天学习一下粒子群算法. 文章目录 算法原理(Inspiration) 优化过程 python实现 参 ...

  4. DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优

    DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优 目录 基于keras对LSTM算法进行超参数调优 1.可视化LSTM模型的loss和acc曲线

  5. 22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制

    这篇文章不少地方都截图了宋红康老师的课件,实在他jvm这块讲的真好.连接地址如下: 尚硅谷宋红康JVM全套教程(详解java虚拟机)_哔哩哔哩_bilibili JVM入门 1.JVM结构图 JVM是 ...

  6. elasticsearch原理_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

  7. elasticsearch最大节点数_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

  8. Feign原理以及feign调优

    Feign原理以及feign调优 1. Feign原理 Feign是一个轻量级的HTTP客户端库,它可以用来进行RESTful API的调用.在Feign中,你只需要定义一个接口,然后就可以使用这个接 ...

  9. SVM(支持向量机)原理及数学推导全过程详解

    由于格式问题,为方便阅读,请点击下方链接访问原文 点击此处访问原文 点击此处访问原文 点击此处访问原文 点击此处访问原文 关于SVM网上已经有很多很多的前辈有过讲解,这两天自己在网上看了看资料,结合前 ...

  10. 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】

    卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...

最新文章

  1. java中ofd文件转pdf_word文件转pdf怎么转?这一招轻松搞定Word转PDF
  2. mq多个消费者消费一个消息_ActiveMQ多个消费者消费不均匀问题
  3. java中bean的定义有哪些_详解Java的Spring框架中bean的定义以及生命周期
  4. xbox360链接pc_如何将实时电视从Xbox One流式传输到Windows PC,iPhone或Android Phone
  5. bootstrap css选择不同的宽度
  6. mschart 控件
  7. 最新 Hostinger域名转出教程 (2019年6月版本)
  8. mysql数据库更新数据库语句_详解MySQL数据库之更新语句
  9. 什么是token/token如何使用
  10. lilo.conf - lilo 配置文件
  11. SSL常见错误及解决方法
  12. 运动竞技类图文展示片头fcpx插件
  13. 装linux系统的工具箱,PE,Dos工具箱,自动安装linux的U盘制作
  14. Nofollow标签是什么,使用Nofollow标签有哪些好处?
  15. JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇
  16. Allegro 16.6尺寸标注以及删除操作记录
  17. 230 SQL语句‘order by’ 后面直接加数字的含义
  18. java基因序列个数_Java语言 DNY基因序列所含GC最多的子串
  19. 8种将pdf转化成excel的方法,亲测实用又有效!
  20. 4.uniapp如何引入iconfont图标

热门文章

  1. 在兼容系统上升级DELL SATA硬盘的固件
  2. 百度离线地图JS API V3.0
  3. android用讯飞实现TTS语音合成 实现中文版
  4. adb 静默安装_Android静默安装与静默卸载(系统应用)
  5. 使用outlook邮件服务器,使用OUTLOOK配置邮件服务
  6. 用python写了个简单的178漫画下载器
  7. nodejs中使用nodemon加载文件报错
  8. linux系统维护篇:centos7.9桌面环境安装百度网盘客户端(libstdc++.so.6: version `GLIBCXX_3.4.20‘ not found)
  9. 在线解答:怎么拥有TrustedInstaller权限?
  10. 基于华为eNSP的企业网络规划