【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的对象模型与常规对象模型有些不同,对数字对象的更新,实际上是生成了一个新的数值对象,并 ...
随机推荐
- SpringBoot项目部署进阶
一.war包部署 通过“云开发”平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的方式.但是,因为某些原因,软件需求方特别要求用war形式打包,我们该怎么做? 1.项目尚未开 ...
- git gitosis 添加项目
example: 1, user@my-test:~/perl_src$ git inituser@my-test:~/perl_src$ git add .user@my-test:~/perl_s ...
- Pentaho的Mondrian对Hive的支持
需求描述 考虑直接在Hive或者Impala等Big Data方案,能够支持MDX查询,现调研一下Mondrian对hive的支持情况. 环境准备 hive环境,采用hive-0.10-cdh4.2. ...
- 使用Java连接HBASE过程中问题总结
本文是我个人在连接服务器的HBASE过程的一些问题总结. 一.用户和主机名的设置 1.1 报错:Insufficient permissions(user=Administartor) 原因:本地ho ...
- [POI2012]STU-Well
题意翻译 给定一个非负整数序列A,每次操作可以选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max(∣xi−xi−1∣)最小,输出这个最小值以及此时最小的k (1≤n≤1 000 ...
- R语言外部数据读取
0 引言 使用R语言.Python等进行数据处理的第一步就是要导入数据(也可以使用UCI数据集),下文主要根据R语言的帮助文档来介绍外部文件数据的导入方法和注意事项.下面先附上一些指令. 1 格式r ...
- ElasticStack系列之十五 & query cache 引起性能问题思考
问题描述 一个线上集群,执行的 Query DSL 都是一样的,只是参数不同.统计数据显示 98% ~ 99% 的查询相应速度都很快,只需要 4 ~ 6ms,但是有 1% 左右的查询响应时间在 100 ...
- solr基础使用概述
概述:solr 作为搜索引擎系统,它应该包含两部分内容,分别是:索引系统 和 搜索系统. 索引系统 它主要负责将外部不同数据源的数据转换为 solr 格式规范的数据格式(我们称之为:SolrInput ...
- C++函数不能为virtual的场景
1.类函数不能同时被static和virtual修饰. 2.类的模板函数不能被virtual修饰 未完待续
- linux下安装shellinabox实现web登录服务器
GitHub地址(含有文件下载和详细安装流程):https://github.com/shellinabox/shellinabox 这里我们使用的是redhat安装方法如下: 1.配置安装依赖环境 ...