k-均值聚类算法

Kmeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。

K-Means算法如何工作?

输入:样本集D,簇的数目k,最大迭代次数N;

输出:簇划分(k个簇,使平方误差最小);

算法步骤:

(1)为每个聚类选择一个初始聚类中心;

(2)将样本集按照最小距离原则分配到最邻近聚类;

(3)使用每个聚类的样本均值更新聚类中心;

(4)重复步骤(2)、(3),直到聚类中心不再发生变化;

(5)输出最终的聚类中心和k个簇划分;

原理

1.随机选取K个点为分类中心点;

2.将每个点分配到最近的类,这样形成了K个类;

3.重新计算每个类的中心点。比如都属于同一个类别里面有10个点,那么新的中心点就是这10个点的中心点,一种简单的方式就是取平均值。

比喻说明

1.选老大

大家随机选K个老大,谁离得近,就是那个队列的人(计算距离,距离近的人聚合在一起)。

随着时间的推移,老大的位置在变化(根据算法,重新计算中心点),直到选出真正的中心老大(重复,直到准确率最高)

2.Kmeans和Knn的区别

Kmeans开班选老大,风水轮流转,直到选出最佳中心老大;

优点:容易实现

缺点:k值的选择是用户指定的,不同的k得到的结果会有挺大的不同,对k个初始质心的选择比较敏感,容易陷入局部最小值

适用数据类型:数值型数据

其工作流程:首先,随机确定k个初始点作为质心,然后将数据集中的每个点分配到一个簇中,具体来讲,为每个点找距离其最近的质心,并将其分配给该质心所对应的簇。完成之后,每个簇的质心更新为该簇所有点的平均值。

K-means是一个聚类算法,是无监督学习,生成指定K个类,把每个对象分配给距离最近的聚类中心。

代码实现:

 1 import numpy as np
2 import matplotlib.pyplot as plt
3 %matplotlib inline
4 from sklearn.datasets.samples_generator import make_blobs
5 # X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2]
6 X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.2, 0.2, 0.2],
7 random_state =9)
8 plt.scatter(X[:, 0], X[:, 1], marker='o')
9 plt.show()
10
11 #用K-Means聚类方法来做聚类,首先选择k=2
12 from sklearn.cluster import KMeans
13 y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)
14 plt.scatter(X[:, 0], X[:, 1], c=y_pred)
15 plt.show()
16
17 #用Calinski-Harabasz Index评估的聚类分数
18 from sklearn import metrics
19 metrics.calinski_harabaz_score(X, y_pred)
20
21
22 #k=3来看看聚类效果
23 from sklearn.cluster import KMeans
24 y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X)
25 plt.scatter(X[:, 0], X[:, 1], c=y_pred)
26 plt.show()  
27
28 #用Calinski-Harabaz Index评估的k=3时候聚类分数
29 metrics.calinski_harabaz_score(X, y_pred)
30
31 #看看k=4时候的聚类效果
32 from sklearn.cluster import KMeans
33 y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X)
34 plt.scatter(X[:, 0], X[:, 1], c=y_pred)
35 plt.show()
36
37 metrics.calinski_harabaz_score(X, y_pred)
38
39 #看看用MiniBatchKMeans的效果,我们将batch size设置为200. 由于我们的4个簇都是凸
40 #的,所以其实batch size的值只要不是非常的小,对聚类的效果影响不大。
41 for index, k in enumerate((2,3,4,5)):
42 plt.subplot(2,2,index+1)
43 y_pred = MiniBatchKMeans(n_clusters=k, batch_size = 200, random_state=9).fit_predict(X)
44 score= metrics.calinski_harabaz_score(X, y_pred)
45 plt.scatter(X[:, 0], X[:, 1], c=y_pred)
46 plt.text(.99, .01, ('k=%d, score: %.2f' % (k,score)),
47 transform=plt.gca().transAxes, size=10,
48 horizontalalignment='right')
49 plt.show()

参考资料:

1、https://www.cnblogs.com/chenqionghe/p/12301905.html

2、https://www.cnblogs.com/pinard/p/6164214.html

3、https://www.cnblogs.com/pinard/p/6169370.html

4、https://www.zhihu.com/question/29208148/answer/2061775028

5、https://zhuanlan.zhihu.com/p/75477709

聚类算法之k-均值聚类的更多相关文章

  1. 机器学习理论与实战(十)K均值聚类和二分K均值聚类

    接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...

  2. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  3. 【转】算法杂货铺——k均值聚类(K-means)

    k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...

  4. 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

    k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...

  5. (ZT)算法杂货铺——k均值聚类(K-means)

    https://www.cnblogs.com/leoo2sk/category/273456.html 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先 ...

  6. 聚类之K均值聚类和EM算法

    这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...

  7. 5-Spark高级数据分析-第五章 基于K均值聚类的网络流量异常检测

    据我们所知,有‘已知的已知’,有些事,我们知道我们知道:我们也知道,有 ‘已知的未知’,也就是说,有些事,我们现在知道我们不知道.但是,同样存在‘不知的不知’——有些事,我们不知道我们不知道. 上一章 ...

  8. 机器学习之K均值聚类

      聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离.马氏距离.相关系数.余弦定理.层次聚类和K均值聚类等 1. K均值聚类思想   K均值聚类的基本思想是,通过迭代的方法寻找K个 ...

  9. ML: 聚类算法-K均值聚类

    基于划分方法聚类算法R包: K-均值聚类(K-means)                   stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...

  10. 机器学习算法与Python实践之(六)二分k均值聚类

    http://blog.csdn.net/zouxy09/article/details/17590137 机器学习算法与Python实践之(六)二分k均值聚类 zouxy09@qq.com http ...

随机推荐

  1. System类&StringBuilder类

    System类 1.currentTimeMillis()方法 作用:获取当前系统时间的毫秒值[注意:从现在到1970年1月1日 00:00:00] 2.arraycopy(...)方法 作用:复制数 ...

  2. django开发最完美手机购物商城APP带前后端源码

    后端和数据接口,全采用django开发 从0到大神的进阶之路 一句话,放弃单文件引用vue.js练手的学习方式 马上从vue-cli4练手,要不然,学几年,你也不懂组件式开发,不懂VUEX,不懂路由, ...

  3. react中this.setState的理解

    this.setState作用? 在react中要修改this.state要使用this.setState,因为this.state只是一个对象,单纯的修改state并不会触发ui更新.所以我们需要用 ...

  4. 【Hadoop离线基础总结】工作流调度器azkaban

    目录 Azkaban概述 工作流调度系统的作用 工作流调度系统的实现 常见工作流调度工具对比 Azkaban简单介绍 安装部署 Azkaban的编译 azkaban单服务模式安装与使用 azkaban ...

  5. JAVA知识总结(二):封装

    时隔近一年,我突然想起来这个文章还没有发完,所以就继续开始写.也不知道自己上次写到哪里了,不管了这里从面向对象的三个特性说起. 类和对象 在这之前,我们先了解什么是对象,已经什么是面向对象?对象:万物 ...

  6. STM32 Cube之旅-尝试新的开发方式

    尝试使用Cube进行一些开发学习,这里对此做一个梗概,先有一个全面的了解. 文章目录 Cube全家桶 CubeMX CubeIDE CubeProg 结语 Cube全家桶 曾几何时,ST刚推出Cube ...

  7. 关于proteus仿真的串口问题

    以下四幅图都是关于串口中断的问题,串口中断需要一个接收或者发送数据的触发. 图一:因为由串口小助手发送的数据达到了单片机串口,所以引起了串口的中断. 图二:图一的大图. 图三:因为由串口小助手发送的数 ...

  8. python100例 11-20

    011 兔子问题 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? f1=1 f2=1 for i ...

  9. SQLServer用with temptb AS临时表查询或者更新字段,将某个字段赋值成某个字段的值

    with temptb AS(SELECT sl.CompanyID,info.BID FROM dbo.TableXXXXX   slLEFT JOIN dbo.Tableinfo  infoON ...

  10. kafka消费者重试逻辑的实现

    背景 在kafka的消费者中,如果消费某条消息出错,会导致该条消息不会被ack,该消息会被不断的重试,阻塞该分区的其他消息的消费,因此,为了保证消息队列不被阻塞,在出现异常的情况下,我们一般还是会ac ...