【Python学习笔记】使用python进行kmeans聚类
K-Means 聚类是最常用的一种聚类算法,它的思想很简单,对于给定的样本集和用户事先给定的 K 的个数,将数据集里所有的样本划分成 K 个簇,使得簇内的点尽量紧密地连在一起,簇间的距离尽量远。由于每个簇的中心点是该簇中所有点的均值计算而得,因此叫作 K-Means 聚类。
算法过程
(1)从所有样本中随机选择 K 个样本作为初始的聚类中心。
(2)计算每个样本到各个初始聚类中心的距离,将样本分配到距离最近的类中(通常使用欧氏距离)。
(3)将所有样本都分配完毕后,重新计算 K 个聚类的中心,新的聚类中心即是该簇所有点的平均值。
(4)重复步骤(2)~(3)。
(5)当聚类中心不再发生变化或满足一定条件后,结束聚类。
算法的优缺点
优点:
(1)需要调节的参数只有聚类数目 K。
(2)对于大数据集,算法相对可伸缩和高效,计算的复杂度较低。
缺点:
(1)K-Means 聚类的结果很大程度上依赖于一开始随机选择的聚类中心,可能会导致最终的结果只是局部最优。为了获得最理想的结果,通常需要多次运行 K-Means 算法,选择不同的随机初始聚类中心,观察结果。
(2)K 值需要事先指定,但一般很难选择,需要多次尝试。
(3)对噪声点和异常值十分敏感。
(4)只适用于数值类型的样本数据,不适用于名义类型的样本数据。
使用python进行kmeans聚类
假设我们要解决一个这样的问题。
以下是一些同学,大萌是一个学霸,而我们想要找到这些人中的潜在学霸,所以我们要把这些人分为两类——学霸与非学霸。
| 高数 | 英语 | Python | 音乐 | |
|---|---|---|---|---|
| 小明 | 88 | 64 | 96 | 85 |
| 大明 | 92 | 99 | 95 | 94 |
| 小朋 | 91 | 87 | 99 | 95 |
| 大朋 | 78 | 99 | 97 | 81 |
| 小萌 | 88 | 78 | 98 | 84 |
| 大萌 | 100 | 95 | 100 | 92 |
1 方法一:使用scipy
那么使用scipy的Python实现的代码如下:
import numpy as np
from scipy.cluster.vq import vq,kmeans,whiten
list1=[88.0,74.0,96.0,85.0]
list2=[92.0,99.0,95.0,94.0]
list3=[91.0,87.0,99.0,95.0]
list4=[78.0,99.0,97.0,81.0]
list5=[88.0,78.0,98.0,84.0]
list6=[100.0,95.0,100.0,92.0]
data=np.array([list1, list2, list3, list4, list5, list6])
whiten=whiten(data) # 算出各列元素的标准差,形成一个新的数组
centroids,_=kmeans(whiten,2)
result,_=vq(whiten,centroids)
print(result)
其中,kmeans()函数的功能是对数据进行聚类,返回结果是一个元组,其中我们只需要它的第一个值,这是一个聚类中心数组。vq()函数的功能是矢量量化数据,它可以对每一个数据,也就是对我们这边的每一个人进行归类。
结果如下:
[1 0 0 1 1 0]
说明大明、小朋和大萌都是学霸组的。
需要说明的是,kmeans找到的只是一个局部最优解,而不是全局。
2 方法二:使用sklearn
那么使用sklearn的Python实现的代码如下:
import numpy as np
from sklearn.cluster import KMeans
list1=[88.0,74.0,96.0,85.0]
list2=[92.0,99.0,95.0,94.0]
list3=[91.0,87.0,99.0,95.0]
list4=[78.0,99.0,97.0,81.0]
list5=[88.0,78.0,98.0,84.0]
list6=[100.0,95.0,100.0,92.0]
X=np.array([list1, list2, list3, list4, list5, list6])
kmeans=KMeans(n_clusters=2).fit(X)
pred=kmeans.predict(X)
print(pred)
其中,fit()方法是对Kmeans确定类别以后的数据集进行聚类,而predict()是根据聚类结果,确定所属类别。
结果如下:
[0 1 1 1 0 1]
说明这次大明、小朋、大朋和大萌都是学霸组的。
再次说明,kmeans找到的只是局部最优解。
【参考】
[1] Coursera课程《用Python玩转数据》
[2] 裔隽,张怿檬,张目清等.Python机器学习实战[M].北京:科学技术文献出版社,2018
【Python学习笔记】使用python进行kmeans聚类的更多相关文章
- python 学习笔记 9 -- Python强大的自省简析
1. 什么是自省? 自省就是自我评价.自我反省.自我批评.自我调控和自我教育,是孔子提出的一种自我道德修养的方法.他说:“见贤思齐焉,见不贤而内自省也.”(<论语·里仁>)当然,我们今天不 ...
- python 学习笔记一——Python安装和IDLE使用
好吧,一直准备学点啥,前些日子也下好了一些python电子书,但之后又没影了.年龄大了,就是不爱学习了.那就现在开始吧. 安装python 3 Mac OS X会预装python 2,Linux的大多 ...
- python学习笔记(一):python简介和入门
最近重新开始学习python,之前也自学过一段时间python,对python还算有点了解,本次重新认识python,也算当写一个小小的教程.一.什么是python?python是一种面向对象.解释型 ...
- python学习笔记(python简史)
一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum) 目前python主要应用领域: ·云计算 ·WEB开发 ·科学运算.人工智能 ·系统运维 ·金融:量化交 ...
- python学习笔记(1)--python特点
python诞生于复杂的信息系统时代,是计算机时代演进的一种选择. python的特点,通用语言,脚本语言,跨平台语言.这门语言可以用于普适的计算,不局限于某一类应用,通用性是它的最大特点.pytho ...
- python学习笔记之——python模块
1.python模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...
- Python学习笔记 - day12 - Python操作NoSQL
NoSQL(非关系型数据库) NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数据的存储.(例如 ...
- [Python学习笔记1]Python语言基础 数学运算符 字符串 列表
这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...
- python学习笔记一 python入门(基础篇)
简单介绍一下python2.x和3.5的区别 print 在python3.5中print 变为print() Old: print * New: print( * ) 如果想要不换行,之前的 ...
- python学习笔记:python数字
一.数字类型分类 数字提供了标量存储和直接访问,它是不可更改类型,也就是说变更数字的值会产生新的对象.python的对象模型与常规对象模型有些不同,对数字对象的更新,实际上是生成了一个新的数值对象,并 ...
随机推荐
- python自动化之读写
############################################################################# #############在Windows上 ...
- BZOJ5298 CQOI2018交错序列(动态规划+矩阵快速幂)
显然答案为Σkb·(n-k)a·C(n-k+1,k).并且可以发现ΣC(n-k,k)=fibn.但这实际上没有任何卵用. 纯组合看起来不太行得通,换个思路,考虑一个显然的dp,即设f[i][j][0/ ...
- [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树
刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...
- 关于[x/y]一些小想法
[x/y],即x除以y下取整 (不会LATEX) 1.对于给定的x,对于所有的1<=y<=x, [x/y]一共有√x种取值. 证明: 对于y<=√x,y有根号种,所以值最多根号种.对 ...
- Python之旅:元组
作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读#定义:与列表类型比,只不过[]换成()age=(11,22,33,44,55)本质age=tuple((11,22, ...
- 从function的定义看JavaScript的预加载
在JavaScript中定义一个函数,有两种写法: function ftn(){} // 第一种 var ftn = function(){} // 第二种 有人说,这两种写法是完全等价的.但是在解 ...
- JavaScript演示下Singleton设计模式
单例模式的基本结构: MyNamespace.Singleton = function() { return {}; }(); 比如: MyNamespace.Singleton = (functio ...
- eos源码分析和应用(一)调试环境搭建
转载自 http://www.limerence2017.com/2018/09/02/eos1/#more eos基于区块链技术实现的开源引擎,开发人员可以基于该引擎开发DAPP(分布式应用).下面 ...
- python 常用模块之os
1.权限判断 bool: os.access('/python/test.py',os.F_OK) #是否存在 bool: os.access('/python/test.py',os.R_OK) # ...
- SQLServer2008数据库卸载图解
SQLServer2008数据库卸载图解... ================================= 在控制面板的,程序和功能中选中:Microsoft SQL Server 2008 ...