Python sklearn中的K-Means聚类使用方法浅析
作者:微小冷 发布时间:2022-03-16 22:01:16
初步认识
k-means翻译过来就是K均值聚类算法,其目的是将样本分割为k个簇,而这个k
则是KMeans
中最重要的参数:n_clusters
,默认为8。
下面做一个最简单的聚类
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
X, y = make_blobs(1500)
fig = plt.figure()
for i in range(2):
ax = fig.add_subplot(1,2,i+1)
y = KMeans(i+2).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()
其中,y
是聚类结果,其数值表示对应位置X
所属类号。
效果如图所示,对于下面这组数据来说,显然最好是分为两类,但如果KMeans
的n_clusters
设为3,那就会聚成3类。
上面调用的KMeans
是一个类,sklearn
中同样提供了函数形式的调用,其使用方法如下
from sklearn.cluster import k_means
cen, y, interia = k_means(X, 3)
其中,cen
表示聚类后,每一类的质心;y
为聚类后的标签;interia
表示均方误差之和。
初值选取
在KMeans
最重要的概念是簇,也就是被分割后的数据种类;而每个簇都有一个非常重要的点,就是质心。在设定好簇的个数之后,也就相当于确定了质心的个数,而KMeans
算法的基本流程是
选择k个点作为k个簇的初始质心
计算样本到这k个质心(簇)的距离,并将其划入距离最近的簇中
计算每个簇的均值,并使用该均值更新簇的质心
重复上述2-3的操作,直到质心区域稳定或者达到最大迭代次数。
从这个流程可以看出来,KMeans
算法至少有两个细节需要考虑,一个是初始化方案,另一个则是质心更新的方案。
在KMeans
类或者k_means
函数中,提供了两种初始化质心方案,通过参数init
来控制
'random'
:表示随机生成k个质心'k-means++'
:此为默认值,通过kMeans++
方法来初始化质心。
kMeans++
初始化质心的流程如下
随机选择1个点作为初始质心 x 0
计算其他点到最近质心的距离
假定现有 n n n个质心了,那么选择距离当前质心较远的点作为下一个质心 x n x_n xn
重复步骤2和3,直到质心个数达到 k k k个。
若希望直接调用kMeans++
函数,则可使用kmeans_plusplus
。
小批
sklearn
提供了KMeans
的一个变种MiniBatchKMeans
,可在每次训练迭代中随机抽样,这种小批量的训练过程大大减少了运算时间。
当样本量非常巨大时,小批KMeans的优势是非常明显的
from sklearn.cluster import MiniBatchKMeans
import time
ys, xs = np.indices([4,4])*6
cens = list(zip(xs.reshape(-1), ys.reshape(-1)))
X, y = make_blobs(100000,centers=cens)
km = KMeans(16)
mbk = MiniBatchKMeans(16)
def test(func, value):
t = time.time()
func(value)
print("耗时", time.time()-t)
test(km.fit_predict, X)
# 耗时 3.2028110027313232
test(mbk.fit_predict, X)
# 耗时 0.2590029239654541
可见效果非常明显,其中fit_predict
和predict
相似,但并没有返回值,km.fit_predict(X)
运行之后,会更改km
中的labels_
属性,此即分类结果
fig = plt.figure()
ax = fig.add_subplot(1,2,1)
ax.scatter(X[:,0], X[:,1], c=km.labels_,
marker='.', alpha=0.5)
ax = fig.add_subplot(1,2,2)
ax.scatter(X[:,0], X[:,1], c=mbk.labels_,
marker='.', alpha=0.5)
plt.show()
效果如图所示,可见小批的KMeans算法和KMeans算法从结果上来看区别不大。
来源:https://blog.csdn.net/m0_37816922/article/details/128326778
猜你喜欢
- Linux中进程的通信方式有信号,管道,共享内存,消息队列socket等。其中管道是*nix系统进程间通信的最古老形式,所有*nix都提供这
- quiver绘制表示梯度变化非常有用,下面是学习过程中给出的两个例子,可以很好理解quiver的用法from pylab import *c
- 这个绝对是IE6的bug。我想要达到的是如下的效果。通过三个div,排布好侧栏和内容区。我用了如下的css:<style type=&
- PDO::queryPDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集(PHP 5 >=
- 前言:二分法也就是二分查找,它是一种效率较高的查找方法假如公司新来了一个人,叫张三,他是你们公司第47个人,过了一段时间后,有些人呢看张三不
- 今天在玩 google earth 4.0b,发现 Print Screen 下来的图片很大,如果直接放在网页上,因为尺寸太大又不合适,又不
- 分离结构与表现的另一个重要方面是使用语义化的标记来构造文档内容。一个 XHTML 元素的存在就意味被标记内容的那部分有相应的结构化的意义,没
- 什么是索引拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为
- 我们都知道并发(不是并行)编程目前有四种方式,多进程,多线程,异步,和协程。多进程编程在python中有类似C的os.fork,当然还有更高
- 本文实例讲述了Sanic框架请求与响应。分享给大家供大家参考,具体如下:前面介绍了Sanic框架的路由,这里接着介绍Sanic框架的请求与响
- 代码如下:<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001&quo
- 需要下载某网站的视频,chrome浏览器按F12打开开发者模式,发现视频链接是以"blob:http"开头的链接,打开这
- exam = { 'math': '95', 'eng': '96',
- python字符串-删除末位字符(rstrip)rstrip函数用于删除字符串末位指定字符,默认为空白符。语法str.rstrip([cha
- 本文实例讲述了python实现超简单端口转发的方法。分享给大家供大家参考。具体如下:代码非常简单,实现了简单的端口数据转发功能,用于真实环境
- 什么是事件代理(Event Delegation)?如果不太了解的朋友,可详细阅读:《Event delegation in JavaScr
- 今天介绍Python当中十大可视化工具,每一个都独具特色,惊艳一方。MatplotlibMatplotlib 是 Python 的一个绘图库
- 我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中。之前我
- 如何在生产上部署Django?Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。uwsgi介绍uW
- 效果展示打地鼠小游戏简介打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~首先,让我们确定一下游戏