【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的对象模型与常规对象模型有些不同,对数字对象的更新,实际上是生成了一个新的数值对象,并 ...
随机推荐
- 多进程编程之守护进程Daemonize
1.守护进程 守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务.很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭.另一些只在需要的时候才启动,完成任务后就自动结束. ...
- DAY...
讲道理,我还是以前的我.没有坚持每天写......... 又到了谷底......... 坚持啊........
- Latex编译过程中遇到的奇奇怪怪的问题及解决方案
标签(空格分隔): 杂七杂八的问题 有必要写一个博文记录自己在Latex编译时遇到的各种问题,希望可以帮到遇到同样错误的亲故.讲真,一直没有系统的学习Latex,都是投哪个会直接拿那个会的模板来套,然 ...
- STL Set和multiset 容器
STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...
- Crawl(2)
http://cuiqingcai.com/3179.html # *-* coding: UTF-8 *-* import urllib2 import cookielib import re im ...
- Linux nc命令用法收集
ps.ubuntu自带的nc是netcat-openbsd版,不带-c/-e参数. pss.在线Markdown编辑器的bug是怎么回事...“#”号依然显示着 ##参数 想要连接到某处: nc [- ...
- 【CF183D】T-shirt(动态规划,贪心)
[CF183D]T-shirt(动态规划,贪心) 题面 洛谷 CodeForces 题解 \(O(n^2m)\)的暴力懒得写了,比较容易,可以自己想想. 做法是这样的,首先我们发现一个结论: 对于某个 ...
- 【BZOJ1052】覆盖问题(贪心)
[BZOJ1052]覆盖问题(贪心) 题面 BZOJ 洛谷 题解 这题好神仙啊. 很明显可以看出来要二分一个边长. 那么如何\(check\)呢? 我们把所有点用一个最小矩形覆盖, 那么必定每个边界上 ...
- 【POJ2411】Mondriaan's Dream(轮廓线DP)
[POJ2411]Mondriaan's Dream(轮廓线DP) 题面 Vjudge 题解 这题我会大力状压!!! 时间复杂度大概是\(O(2^{2n}n^2)\),设\(f[i][S]\)表示当前 ...
- Android Emoji兼容包使用详解
Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以, ...