聚类算法:K-Means

1.K-Means定义:

K-Means是一种无监督的基于距离的聚类算法,简单来说,就是将无标签的样本划分为k个簇(or类)。它以样本间的距离作为相似性的度量指标,常用的距离有曼哈顿距离、欧几里得距离和闵可夫斯基距离。两个样本点的距离越近,其相似度就越高;距离越远,相似度越低。
目的是,实现簇内的距离尽量小(紧凑),而簇间的距离尽可能大(分开)。 我们使用误差平方和SSE作为聚类质量的目标函数,该值越小表明样本簇内较紧密。

1465325-20190207215508019-2000602736.png

1.1关键问题:

  • (1)k值的选择(法一:根据经验;法二:借助交叉验证选。评价k值的好坏,有手肘法(以簇内误差平方和SSE作为度量聚类质量的目标函数,以误差平方和较小的作为最终聚类结果,通过作图,快速辨认变化较大对应的k值,参考刘顺祥kmeans实操内容)、轮廓系数Silhouette Coefficient(from sklearn.metrics import silhouette_score 可计算,结果在[-1,1]之间,越大代表内聚度和分离度相对较好)和Calinski-Harabasz Index(在sklearn中,有metrics.calinski_harabaz_score,分数越高越好)。
  • (2)k个质心的选择方式 (质心之间最好不要太近)

1.2例子讲解:
借助下图,讲解最简单的2个分类问题:

1465325-20190207215542466-38321003.png

(a)给出的样本数据
(b)随机选取2个样本点作为质心,一个红色a1,一个蓝色b1(选取的样本可以不在原始样本中)
(c)计算所有样本到这两个质心的距离,and then 将样本划分到两个距离中距离较小的那一类中。于是,样本分成了红蓝两派。
(d)对c图中的红蓝两派,找出对应簇的新的质心:a2、b2,并标记其位置。
(e)重新计算所有样本到质心:a2、b2的距离,and then 将样本划分到两个距离中距离较小的那一类中。于是,样本被重新划分成了两类。
(f)重复d、e步,直到质心的位置不再变化。

2.python操作:

在sklearn中,一般用sklearn.cluster.KMeans解决问题。
针对数据量非常大的情况,如样本量>10万,特征数量>100。这时就要用Mini Batch K-Means解决问题。它抽取原始样本中的部分样本作为新的样本集来聚类,这样会降低聚类的精确度(这一般在可接受范围内),但是减少了计算的时间。

python官方文档:

  • sklearn.cluster.KMeans:
    https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans
  • sklearn.cluster.MiniBatchKMeans:
    https://scikit-learn.org/stable/modules/generated/sklearn.cluster.MiniBatchKMeans.html

2.1 KMeans类

sklearn中的KMeans算法仅支持欧式距离,因为其他距离不能保证算法的收敛性。

class sklearn.cluster.KMeans(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)

  • (1)n_clusters :聚类个数k,默认为8.
  • (2)init :{‘k-means++’, ‘random’ or an ndarray} ,质心的选择方式, 默认为‘k-means++’.
    ‘random’:随机选取k个质心.
    ‘k-means++’ :普通版KMeans的优化版,随机选取一个质心后,计算所有样本到质心1的距离,然后根据距离选取新的质心2,接着计算样本到最近质心的距离,再选出质心3,重复计算距离,直至找到k个质心为止。是对随机选取的一个优化版。
  • (3)n_init :int,默认为10.
    设置重复该算法次数m,每次选取不一样的质心,然后选取这m个结果的最优output。
  • (4)max_iter :int, default: 300
    单次运行的k-means算法的最大迭代次数
  • (5)random_state :设置数据复现的参数
  • (6)algorithm :有三种参数设置,“auto”, “full” or “elkan”,默认是”auto”.
    最基础的KMeans用“full”,而“elkan”利用三角不等式(两边之和大于第三边、两边之差小于第三边)减少距离的计算,加快算法的迭代速度,是对基本版KMeans的优化,但它不适用于稀疏数据. 对于稠密数据,“auto” 会选用“elkan” ,对于稀疏数据,会用 “full”.

对应Attributes:

  • (1)cluster_centers_ : 输出聚类的质心
  • (2)labels_ :输出样本聚类后所属的类别
  • (3)inertia_ : 浮点型,输出簇内离差平方和
  • (4)n_iter_ : 整数,输出运行的迭代次数

先用make_blobs产生聚类数据,再用KMeans进行分类

from sklearn.datasets import make_blobs   #产生聚类数据
#5000个样本,每个样本有两个特征,质心为centers所给出,此例中有4个质心,每个类的方差由cluster_std给出,random_state为数据复现用
x, y = make_blobs(n_samples=3000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.7, 0.2, 0.2], random_state =2019)   
#作图看原始数据
import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(x[:, 0],x[:,1])
<matplotlib.collections.PathCollection at 0xc431eefc18>

png
1465325-20190207215338136-1079251580.png

令k=2、3、4,然后评估每个k值的好坏

from sklearn.cluster import KMeans
y_1 = KMeans(n_clusters=2, random_state=2020).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1],c=y_1)
from sklearn import metrics
metrics.calinski_harabaz_score(x,y_1)
8255.3432347343351

png
1465325-20190207215354686-171776504.png

y_2 = KMeans(n_clusters=3, random_state=2020).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1],c=y_2)
metrics.calinski_harabaz_score(x,y_2)
9071.2281163994103

png
1465325-20190207215401979-1558702528.png

y_3 = KMeans(n_clusters=4, random_state=2020).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1],c=y_3)
metrics.calinski_harabaz_score(x,y_3)
9151.6774896842526

png
1465325-20190207215409432-102102087.png

随着k的递增,Calinski-Harabaz Index的分数也越来越高。分类成4个簇的分类效果最好。

也可以利用簇内误差平方和来选择最佳K值:

SSE = []
for i in range(1,11):   #k取1-10,计算簇内误差平方和km = KMeans(n_clusters=i, random_state=2019)km.fit(x)SSE.append(km.inertia_)
plt.plot(range(1,11), SSE, marker='v')  
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.xlabel('k值', size=15)
plt.ylabel('簇内误差平方和SSE', size=15)
<matplotlib.text.Text at 0xb6d86b1c88>

png
1465325-20190210111229518-126798769.png

2.2 MiniBatchKMeans类

class sklearn.cluster.MiniBatchKMeans(n_clusters=8, init=’k-means++’, max_iter=100, batch_size=100, verbose=0, compute_labels=True, random_state=None, tol=0.0, max_no_improvement=10, init_size=None, n_init=3, reassignment_ratio=0.01)

  • (1)n_init:用不同的初始化质心运行算法的次数。每次用不一样的采样数据集来跑不同的初始化质心运行算法,与KMeans类有所区别。
  • (2)batch_size:指定采集样本的大小,默认是100.如果数据集的类别较多或者噪音点较多,需要增加这个值以达到较好的聚类效果。
  • (3)init_size: 用来做质心初始值候选的样本个数,默认是batch_size的3倍,一般用默认值就可以了。
  • (4)reassignment_ratio: 某个类别质心被重新赋值的最大次数比例,这个和max_iter一样是为了控制算法运行时间的。这个比例是占样本总数的比例,乘以样本总数就得到了每个类别质心可以重新赋值的次数。如果取值较高的话算法收敛时间可能会增加,尤其是那些暂时拥有样本数较少的质心。默认是0.01。如果数据量不是超大的话,比如1w以下,建议使用默认值。如果数据量超过1w,类别又比较多,可能需要适当减少这个比例值。具体要根据训练集来决定。
  • (5)max_no_improvement:即连续多少个Mini Batch没有改善聚类效果的话,就停止算法, 和reassignment_ratio, max_iter一样是为了控制算法运行时间的。默认是10。
from sklearn.cluster import MiniBatchKMeans
y_m1 = MiniBatchKMeans(n_clusters=2, batch_size=300, random_state=2019).fit_predict(x)
plt.scatter(x[:,0], x[:,1], c=y_m1)
print("当k=2时:",metrics.calinski_harabaz_score(x,y_m1))
当k=2时: 8254.39452154

png
1465325-20190207215416727-1931260367.png

y_m2 = MiniBatchKMeans(n_clusters=3, batch_size=300, random_state=2019).fit_predict(x)
plt.scatter(x[:,0], x[:,1], c=y_m2)
print("当k=3时:",metrics.calinski_harabaz_score(x,y_m2))
当k=3时: 9070.83967062

png
1465325-20190207215422326-1872015439.png

y_m3 = MiniBatchKMeans(n_clusters=4, batch_size=300, random_state=2019).fit_predict(x)
plt.scatter(x[:,0], x[:,1], c=y_m3)
print("当k=4时:",metrics.calinski_harabaz_score(x,y_m3))
当k=4时: 9122.03629824

png
1465325-20190207215430230-1565380838.png

y_m4 = MiniBatchKMeans(n_clusters=5, batch_size=300, random_state=2019).fit_predict(x)
plt.scatter(x[:,0], x[:,1], c=y_m4)
print("当k=5时:",metrics.calinski_harabaz_score(x,y_m4))
当k=5时: 9091.0670116

png
1465325-20190207215438819-1317558742.png

可以看到当抽取300个样本数据出来做KMeans时,k从1—>4增大时,calinski_harabaz_score逐渐递增。当k=4时,聚类效果最好,calinski_harabaz_score为9122。当k增大为5时,看到评分的下降,说明聚类为4类时最好。
抽样与不抽样的比较:用原始的3000个样本数据时,当k=4时,calinski_harabaz_score为9151,大于抽样时划分4类时对应的评分:9122。可见在用小样本时,精确度有所下降,但是最后聚类效果还是可以的。

3.KMeans的优缺点:

1.算法原理比较简单,可解释性强,对凸数据的收敛较快。
2.较适用于样本集为团簇密集状的,而对条状、环状等非团簇状的样本,聚类效果较一般。
3.对事先给定的k值、初始质心的选择比较敏感,不同的选择可能导致结果差异较大。
4.最后的结果为局部最优,而不是全局最优。
5.对噪点、异常点较敏感。

在实际操作中,注意:
(1)模型的输入数据必须为数值型数据,如果是离散型,一定要做哑变量处理。
(2)此算法是基于距离运算的,为防止量纲带来的影响,需要将数据标准化处理(零-均值规范)
(3)最终聚类分析算法的评价,可用RI评价法(兰德指数)、F评价法、误差平方和、轮廓系数(Silhouette)、calinski-harabaz Index等,参考https://www.cnblogs.com/niniya/p/8784947.html。

转载于:https://www.cnblogs.com/wyy1480/p/10353342.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html:(1) 登录界面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- content属性值 :width:可视区域的宽度&#xff0c;值可为数字或关键词device-widthheight:同widthintial-scale:页面首次被显示是可视区域的缩放级别&#x…

[Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]

【问题描述】[第5题][最长回文子串][中等] 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1&#xff1a;输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。【解答思路】 1. 中心扩展法…

一流大学计算机专业,计算机专业一流大学太难考,不妨退而求其次,看看这5所大学...

原标题&#xff1a;计算机专业一流大学太难考&#xff0c;不妨退而求其次&#xff0c;看看这5所大学因为就业率高、薪酬待遇好&#xff0c;又是前沿科技&#xff0c;所以计算机专业近一二十年来一直都很热门&#xff0c;开设计算机专业的院校也如雨后春笋一般冒了出来&#xff…

[Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

【问题描述】[第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k&#xff0c;你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums [1,1,1], k 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 :数组的长度为 [1, 20,000]。 数组中元素的范围…

html表格复制最后一行字,为什么Word中的表格输入文字最后一行文字会自动跳到下一页...

为什么Word中的表格输入文字最后一行文字会自动跳到下一页以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;为什么Word中的表格输入文字最后一行文字会自动跳到下一页, 在WPS文字中的表格中打…

购物车的基本流程

一、购物车的需求描述和基本流程1、需求描述1、 用户可以在登录状态下将商品添加到购物车 2、 用户可以在未登录状态下将商品添加到购物车 3、 用户可以使用购物车一起结算下单 4、 用户可以查询自己的购物车 5、 用户可以在购物车中可以修改购买商品的数量。 6、 用户可以在购…

canvas填充规则

canvas填充规则 const canvas document.getElementById(canvas); const ctx canvas.getContext(2d);ctx.beginPath(); ctx.fillStylegreen ctx.arc(50, 50, 30, 0, Math.PI * 2, true); ctx.arc(50, 50, 20, 0, Math.PI * 2, true); ctx.arc(50, 50, 15, 0, Math.PI * 2, tr…

1.web技术的前世今生

目录 1web Web服务器 Web页面 Web的作用 所谓Web 2web技术 分类主流 Web技术 工作原理 Web服务器 •1990年&#xff0c;第一个Web服务器开始 运行 •网站服务器 •站点服务器 •本质上是一个软件系统 •安装了web服务器软件的计算机 为什么没有流传 •操作太复杂…

计算机科学中的研究成果,田聪教授团队科研成果在计算机科学顶会LICS 2020发表...

(通讯员 王文胜)第35届ACM/IEEE计算机科学逻辑国际会议(ACM/IEEE Symposium on Logic in Computer Science,http://lics.siglog.org/lics20/)&#xff0c;简称LICS 2020&#xff0c;于7月08日—7月11日在线举行(主会场设在德国萨尔布吕肯)。该会议是理论计算机科学领域最顶级的…

[Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

【问题描述】[第25题][K个一组反转链表][困难] 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) java 给你一个链表&#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回翻转后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数…

2.jsp初识

目录 什么是jsp jsp的特点 早期的网站一般是用标准的HTML文件也 就是静态网页制作的&#xff0c;通常没有后台数据库、 不能和用户交互&#xff0c;内容更新起来相对也比较 麻烦&#xff0c;适用于一些不需要经常更新的展示型 网站。而动态网页上显示的内容不是固定的&#x…

武大计算机专业湖北录取分数线,武汉大学2020年本科一批分专业录取分数统计(湖北省)...

2020年高考已经过去&#xff0c;为给2021年的高考生们提供一些报考资料&#xff0c;我们将逐一推出一些重点大学在全国各省分专业的录取分数。本文先介绍武汉大学2020年在湖北省本科一批的录取情况。武汉大学始建于1893年&#xff0c;是国家教育部直属重点大学&#xff0c;国家…

[Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]

【问题描述】[第210 题][课程表 II][中等] 现在你总共有 n 门课需要选&#xff0c;记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1 &#xff0c;我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的…

牛客小白月赛11 Rinne Loves Xor

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/I code: #include<bits/stdc.h> using namespace std; typedef unsigned long long ll; ll mod1e97; ll pow(ll x,ll n,ll mod) {ll res1;while(n>0){if(n%21){resres*x;resres%mod;}xx*x;xx%mod;n>&…

HDU - 2571 

穿过幽谷意味着离大魔王lemon已经无限接近了&#xff01; 可谁能想到&#xff0c;yifenfei在斩杀了一些虾兵蟹将后&#xff0c;却再次面临命运大迷宫的考验&#xff0c;这是魔王lemon设下的又一个机关。要知道&#xff0c;不论何人&#xff0c;若在迷宫中被困1小时以上&#xf…

3.JSP开发探秘

目录 1JSP工作原理 2JSP设计模式 3JSP开发方式 用户通过浏览器提交请求&#xff0c;服务器端收到请求后进行处理&#xff0c;再以HTML的形式把处理结果返 回给客户端&#xff0c;客户端通过浏览器查看得到的静态网页。 如果JSP程序是第一次被加载&#xff0c;会首先被编…

[Leedcode][JAVA][第152题][乘积最大子数组][动态规划]

【问题描述】[中等] 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2:输入:…

4.与JSP的第一次握手

做一个简单的JSP页面&#xff0c;并用浏览器运行。 打开NetBeans&#xff0c;创建Java Web项目 创建JSP文件 修改JSP文件 <h3>JSP技术带你进入动态网页时代&#xff01;</h3> <!--在JSP页面中进行变量声明--> <% String st"我将成为一名…

九歌计算机在线作诗硬件原理,“九歌”作诗是如何炼成的?

原标题&#xff1a;“九歌”作诗是如何炼成的&#xff1f;你有木有为研究数据的处理一筹莫展&#xff1f;你有木有为课题方法的突破绞尽脑汁&#xff1f;你有木有为完美的宣传文案纠结犯难&#xff1f;亲&#xff0c;是该来一杯清华学术咖啡&#xff0c;约会“信息达人”了&…

WEB_头等舱

题目链接&#xff1a;http://123.206.87.240:9009/hd.php 题解&#xff1a; 打开题目&#xff0c;什么也没有 查看网页源代码&#xff0c;真的什么也没有 于是采用burp进行抓包&#xff0c;burp工具下载链接&#xff1a;https://pan.baidu.com/s/1daOvlBo-pU2k9WYBN_5EQQ 右键&…