K均值算法(K_means)

news/2024/11/29 5:31:38/

目录

一、概念

二、算法步骤 

三、举例理解 

 四、知识补充

1、K的选择:

(1)手肘法:

 (2)轮廓系数法:

2、优缺点

优点:

缺点:

五、代码

一、概念

用于聚类算法,聚类是一种无监督学习,它将相似的对象归于一个簇中,簇中心通过簇中所有点的均值来计算。聚类算法与分类算法的主要区别就是分类的目标类别已知,而聚类的目标类别未知。

聚类与分类的图示:

 

1、在分类的过程中,测试样本点用x表示,数据带有标签(左下角红橙黑三色区分),经过分类后测试点x被分到了红色区域。

2、在聚类的过程中,图中左上角的原始数据分布散点图呈灰色,没有用特定的颜色(红色或橙色)进行区分,也就是说数据没有标签。聚类后将数据分为三个不同的簇,用红橙黑三色标记。在一个簇中的数据就被认为是同一类,也就是说这些数据具有相似性。

二、算法步骤 

1、随机选取k个初始中心点;

2、针对数据集中的每个样本点,计算样本点与k个中心点的距离,将样本点划分到离它最近的中心点所对应的类别中;

3、类别划分完成后,重新确定类别的中心点,将类别中所有样本各特征的均值作为新的中心点对应特征的取值,即该类中所有样本的质心;

4、重复上面的2、3步骤,直到到达某个终止条件(迭代次数,每一个簇中的点不再变等·)

三、举例理解 

 四、知识补充

1、K的选择:

(1)手肘法:

手肘法的核心指标是SSE(误差平方和)

其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

步骤:

计算k从1到n的的SSE
SSE会逐渐减小,直到k=n时SSE=0,每个点都是质心
在SSE减小过程,会出现拐点,这个拐点就是肘,下降率突然变缓时,就是最佳K值。

 

 (2)轮廓系数法:

该方法的核心指标是轮廓系数,某个样本点Xi的轮廓系数定义如下:

其中,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离。

 

其中p是某个簇Ck中的样本。事实上,简单点讲,就是用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。

  求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

2、优缺点

优点:

1、原理比较简单,实现也是很容易,收敛速度快。

2、当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。

3、主要需要调参的参数仅仅是簇数k。

4、算法的可解释度比较强。

缺点:

1、K值需要预先给定,很多情况下K值的估计是非常困难的。

2、K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。

3、对噪音和异常点比较的敏感。用来检测异常值。

4、采用迭代方法,可能只能得到局部的最优解,而无法得到全局的最优解。

5、对于不是凸的数据集比较难收敛。

6、如果各类隐含类别的数据不均衡,比如隐含类别的数据严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。

五、代码

import numpy as np
import matplotlib.pyplot as plt# 两点欧氏距离
def distance(e1, e2):return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)# 集合中心
def means(arr):return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])#mean用于求取均值   arr存放某一个簇中的点
if __name__=="__main__":## 生成二维随机坐标(如果有数据集就更好)arr = np.random.randint(0,100, size=(100, 2))## 初始化聚类中心和聚类容器m = 5   #聚类个数k_arr=np.random.randint(0,100, size=(5, 2))#随机初始5个中心cla_temp = [[],[],[],[],[]] #存放每个簇中的点## 迭代聚类n = 20  #迭代次数for i in range(n):    # 迭代n次for e in arr:    # 把集合里每一个元素聚到最近的类ki = 0        # 假定距离第一个中心最近min_d = distance(e, k_arr[ki])for j in range(1, k_arr.__len__()):if distance(e, k_arr[j]) < min_d:    # 找到更近的聚类中心min_d = distance(e, k_arr[j])ki = jcla_temp[ki].append(e)# 迭代更新聚类中心for k in range(k_arr.__len__()):if n - 1 == i:breakk_arr[k] = means(cla_temp[k])cla_temp[k] = []## 可视化展示col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']    #仅提供了5种颜色for i in range(m):plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])   #画中心的散点图plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])  #画簇中的点plt.show()

http://www.ppmy.cn/news/130851.html

相关文章

CP2K入门教程分享

CP2K入门教程-1:CP2K的安装 CP2K的安装 1.1 直接使用二进制版本 CP2K的安装有很多种方法。最简单的方法是直接使用预编译版本的二进制可执行文件。 用户可以选择从发行版所带的软件源安装预编译版本的CP2K: Debian http://packages.debian.org/search?keywords=cp2k Fedo…

简单易学的机器学习算法——K-Means++算法

一、K-Means算法存在的问题 由于K-Means算法的简单且易于实现&#xff0c;因此K-Means算法得到了很多的应用&#xff0c;但是从K-Means算法的过程中发现&#xff0c;K-Means算法中的聚类中心的个数k需要事先指定&#xff0c;这一点对于一些未知数据存在很大的局限性。其次&…

20的阶乘c语言怎么编程,C语言:编写程序,求20的阶乘.

基本思路采用累乘的方法,乘法笔算的思路,数组记录下所有乘积的位,我写了个具体如下: #include int xcfun(int x[],int d[],int ws[],int j,int jw,int len)//模拟笔算乘法,逐位相乘 {int k=0; do {x[k+j]=(ws[j]*d[k]+jw)%10; jw=(ws[j]*d[k]+jw)/10; k++; }while(d[k]>…

Python绘制股票K线图

目录 1 股票K线图知识了解 2 用Python绘制股票K线图 2.1 安装绘制K线图的mpl_finance库 2.2 引入相关库 2.3 用Tushare库获取股票基本数据 2.4 日期格式调整及表格转换 2.5 绘制K线图 2.6 添加均线图 2.7 添加每日成交量柱形图 1 股票K线图知识了解 下图所示为“贵州…

【数据挖掘】K-Means 一维数据聚类分析示例

文章目录 K-Means 一维数据计算示例 数据样本 及 初始值K-Means 一维数据 距离计算方式K-Means 算法 步骤第一次迭代 : 步骤 ( 1 ) 计算距离第一次迭代 : 步骤 ( 2 ) 聚类分组第一次迭代 : 步骤 ( 3 ) 计算中心值第二次迭代 : 步骤 ( 1 ) 计算距离第二次迭代 : 步骤 ( 2 ) 聚类…

统计学习方法——K近邻模型

0. 写在前面 在这一讲的讨论班中&#xff0c;我们将要讨论一下K近邻模型。可能有人会说&#xff0c;K近邻模型有什么好写的&#xff0c;那分明就是一个最简单的机器学习模型&#xff0c;哦&#xff0c;不&#xff0c;连机器学习也算不上的算法吧。但是这里&#xff0c;我想提醒…

1到20的阶乘和是多少 php,20的阶乘(1到20的阶乘和结果)

如果不是电脑编程的问题 貌似只能使用计算器得到结果了吧 把计算器的显示位数调大一些 然后1的阶乘加到20的阶乘 即1!+2!+3!+…+20!=2561327494111820313 #include void main() { int i,n,sum; n=1;sum=0; for(i=1;i 和是:2561327494111820300。zd 以下是版通过C进行的计权算…

【机器学习】快速有效理解 K-Means 算法

什么是 K-Means ? 学习 K-Means 之前,大家首先需要对聚类有一个概念. 我们都知道,机器学习可以划分为 3 类:监督学习、无监督学习、强化学习. 无监督学习指的是数据没有标签,也就是说我们只有数据的特征,但并不知道这些数据都是什么,无监督学习算法或者是模型需要从这样的数…