K-Means简介

K-Means 是一种非监督学习。

K 代表的是 K 类,Means 代表的是中心,它有点像全自动分类。聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好。

主要思想是:在给定K值K个初始类簇中心点的情况下,把每个点(也就是数据)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。

基本概念

也就是类,假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么。

K

簇个数,是自己给定的,k是多少就有多少个簇。

质心

均值,即向量各维取平均,即簇中所有点的中心来描述。

距离的度量

常用欧氏距离 ( x2+y2)\sqrt{x^2+y^2} )x2+y2​)和余弦相似度(通过测量两个向量的夹角的余弦值来度量它们之间的相似性),大多情况下都要先标准化

欧氏距离

假定给定数据样本X,包含了n个对象X={X1,X2,X3,...,Xn}X =\lbrace X_1 , X_2 , X_3 , . . . , X_n \rbraceX={X1​,X2​,X3​,...,Xn​},其中每个对象都具有m个维度的属性。Kmeans算法的目标是将n个对象依据对象间的相似性聚集到指定的k个类簇中,每个对象属于且仅属于一个该对象到类簇中心距离最小的类簇中

对于Kmeans,首先需要初始化k个聚类中心{C1,C2,C3,...,Ck}\lbrace C_1,C_2,C_3,...,C_ k \rbrace{C1​,C2​,C3​,...,Ck​},然后通过计算每一个对象到每一个聚类中心的欧式距离,如下式所示:

dis(Xi,Cj)=∑t=1m(Xit−Cit)2dis(X_i,C_j)=\sqrt{\sum_{t=1}^m (X_{it}-C_{it})^2}dis(Xi​,Cj​)=t=1∑m​(Xit​−Cit​)2​

上式中XiX_iXi​表示第i个对象1≤i≤n1\leq i \leq n1≤i≤n

CjC_jCj​表示第j个聚类中心的1≤j≤k1\leq j \leq k1≤j≤k

XitX_{it}Xit​表示第i个对象的第t个属性1≤t≤m1\leq t \leq m1≤t≤m 表示第j个聚类中心的第t个属性。

比如一组对象是三维空间的许多点,其中一点a具体表示为(a1,b1,c1a_1,b_1,c_1a1​,b1​,c1​)、b表示为(a2,b2,c2a_2,b_2,c_2a2​,b2​,c2​)…
其某个聚类中心为o点(x0,y0,z(0)x_0,y_0,z_(0)x0​,y0​,z(​0),那么a点到o点的距离为:

dis(a,o)=(a1−x0)2+(b1−y0)2+(c1−z0)2dis(a,o)=\sqrt {(a_1-x_0)^2+(b_1-y_0)^2+(c_1-z_0)^2}dis(a,o)=(a1​−x0​)2+(b1​−y0​)2+(c1​−z0​)2​

依次比较每一个对象到每一个聚类中心的距离,将对象分配到距离最近的聚类中心的类簇中,得到k个类簇{S1,S2,S3,...,Sk}\lbrace S_1,S_2,S_3,...,S_ k \rbrace{S1​,S2​,S3​,...,Sk​}

聚类中心计算

Kmeans算法用中心定义了类簇的原型,类簇中心就是类簇内所有对象在各个维度的均值,其计算公式如下:
Cj=∑Xi∈SpXi∣NSp∣C_j=\frac{\sum_{X_i\in S_p}X_i}{\lvert{N_{S_p}}\rvert}Cj​=∣NSp​​∣∑Xi​∈Sp​​Xi​​

CjC_jCj​表示第j个聚类中心,1≤j≤k1\leq j \leq k1≤j≤k;∣NSp∣\lvert{N_{S_p}}\rvert∣NSp​​∣表示第p个类簇中对象的个数;XiX_iXi​表示该簇中的第i个对象,1≤i≤∣NSp∣1\leq i \leq \lvert{N_{S_p}}\rvert1≤i≤∣NSp​​∣
比如一个二维平面上某一个聚类中心,里面有10个点,这十个点的聚类中心:

X轴坐标为:x=x1+x2+...+x1010x=\frac{x_1+x_2+...+x_{10}}{10}x=10x1​+x2​+...+x10​​

Y轴坐标为:y=y1+y2+...+y1010y=\frac{y_1+y_2+...+y_{10}}{10}y=10y1​+y2​+...+y10​​

所以该聚类中心就是(x,y)(x,y)(x,y)

K-Means 工作原理


总结来说:

  1. 选取 K 个点作为初始的类中心点,这些点一般都是从数据集中随机抽取的;
  2. 将每个点分配到最近的类中心点,这样就形成了K 个类,然后重新计算每个类的中心点;
  3. 重复第二步,直到类不发生变化,或者你也可以设置最大迭代次数,这样即使类中心点发生变化,但是只要达到最大迭代次数就会结束。

算法流程

我现在选择了我的桌面对图像进行实例分割

导入图片、查看大小

#导入相关包
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#读取图片,转为numpy 数组,向量为长宽的像素值,rgb通道数为3
img = np.array(Image.open("dog.png"))
# 展示图像
plt.imshow(img)# reshape,将长宽拉成一个一维的向量
x = img.reshape(-1,3)
print(img.shape,x.shape)

图像中每个像素点可以看做是一个数据点(三维向量 x=(x0,x1,x2)x=(x_0,x_1,x_2)x=(x0​,x1​,x2​))总共组成了1212714个三维向量集

生成随机聚类中心

在数据集中随机选取k个中心点, 用Z表示k个三维向量构成的数组

#随机初始化Z
def init_center(x,k):# 从x的第一维度的长度中随机选k个数index = np.random.choice(np.arange(x.shape[0]),k)# 返回x在该行的值return x[index]
#k 为要聚类的中心数
k = 2
z = init_center(x,k)
z

计算距离

分别计算每个数据点到k个中心点的距离,根据距离对该数据点进行分类。

def classify(x,Z):Z_new = np.ones(Z.shape[0:])#计算距离temp = np.sum((x.reshape(1,-1,3) - Z.reshape(Z.shape[0],-1,3)) ** 2,axis=2)# 求最小值的下标;index = np.argmin(temp,axis=0)for i in range(Z.shape[0]):# 同类的向量求和取均值,返回更新的Z与距离Z_new[i] = np.mean(x[index==i],axis=0)# 返回更新的Z,距离与分类情况return Z_new,np.sum(temp),indexZ_new,distant,index = classify(x,z)
print("待更新的Z\n{}\n数据点到聚类中心距离和{}\n分类情况{}".format(Z_new,distant,index))

迭代求中心

def kmean(x,k):#x (个数,特征维度)#k 聚类个数#index (个数,)对应k类别的索引Z = init_center(x,k)#初始Zepoch = 100#迭代次数 使用迭代的方法得到最终距离收敛的结果for step in range(epoch):Z,D,index = classify(x,Z)if(step%10==0):print("第{}次循环,距离{}".format(step+1,D))return index,Dindex,D = kmean(x,k)

结果展示

plt.imshow(index.reshape(img.shape[0:2]))


全部代码:

#导入相关包
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#读取图片,转为numpy 数组,向量为长宽的像素值,rgb通道数为3
img = np.array(Image.open("3.bmp"))
# 展示图像
plt.imshow(img)# reshape,将长宽拉成一个一维的向量
x = img.reshape(-1,3)
#随机初始化Z
def init_center(x,k):# 从x的第一维度的长度中随机选k个数index = np.random.choice(np.arange(x.shape[0]),k)# 返回x在该行的值return x[index]
#k 为要聚类的中心数
k = 2
z = init_center(x,k)
def classify(x,Z):Z_new = np.ones(Z.shape[0:])#计算距离temp = np.sum((x.reshape(1,-1,3) - Z.reshape(Z.shape[0],-1,3)) ** 2,axis=2)index = np.argmin(temp,axis=0)for i in range(Z.shape[0]):# 同类的向量求和取均值,返回更新的Z与距离Z_new[i] = np.mean(x[index==i],axis=0)# 返回更新的Z,距离与分类情况return Z_new,np.sum(temp),index
Z_new,distant,index = classify(x,z)def kmean(x,k):#x (个数,特征维度)#k 聚类个数#index (个数,)对应k类别的索引Z = init_center(x,k)#初始Zepoch = 100#迭代次数 使用迭代的方法得到最终距离收敛的结果for step in range(epoch):Z,D,index = classify(x,Z)if(step%10==0):print("第{}次循环,距离{}".format(step+1,D))return index,Dindex,D = kmean(x,k)
plt.imshow(index.reshape(img.shape[0:2]))

直接调用sklearn函数库


from sklearn import datasets
from sklearn import model_selection
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
#读取图片,转为numpy 数组
img = np.array(Image.open("3.bmp"))
# 原式图片展示
plt.imshow(img)
X = img.reshape(-1,3)
#搭建模型,构造KMeans聚类器
estimator = KMeans(n_clusters=3)
#开始聚类训练
estimator.fit(X)
# 获取聚类标签
label_pred = estimator.labels_
plt.show()
# 聚类后的图片展示
plt.imshow(label_pred.reshape(img.shape[0:2]))

呕心沥血干完K-Means聚类——深度AI科普团队相关推荐

  1. 聚类算法详解——深度AI科普团队

    聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好. K-均值聚类算法 基本概念: 簇:假定有一些数据,现在将相 ...

  2. 从V1到V4,让你读懂YOLO原理——深度AI科普团队

    文章目录 YOLO概述 模型时间轴 YOLOv1 原理 网络结构 损失函数 激活函数 YOLOv1的缺陷 YOLOv2 Better Batch Normalization(批归一化) High Re ...

  3. 动手学pytorch之通俗易懂何为卷积-深度AI科普团队

    文章目录 简介 为什么要用卷积 卷积神经网络的由来 什么是卷积 定义 解释 卷积运算 信号分析 离散卷积例子:丢骰子 图像处理卷积操作 简介 为什么要用卷积 卷积操作是机器视觉,乃至整个深度学习的核心 ...

  4. 决策树随笔-深度AI科普团队

    决策树原理 决策树是一种多功能的机器学习算法,它可以实现分类和回归任务,甚至是多输出任务.它们功能强大,能够拟合 复杂的数据集. -优点:简单直观,基本不需要预处理,不用会议华,处理缺失值,精度高.对 ...

  5. 图像分割总体介绍——深度AI科普团队

    概览 初识图像分割 顾名思义,图像分割就是指将图像分割成多个部分.在这个过程中,图像的每个像素点都和目标的种类相关联.图像分割方法主要可分为两种类型:语义分割和实例分割.语义分割会使用相同的类标签标注 ...

  6. pytorch实战案例-手写数字分类-卷积模型——深度AI科普团队

    文章目录 数据准备 导入需要的模块 使用GPU训练 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 将模型复制到GPU 损失函数 定义训练和测试函数 开始训练 源码已经上 ...

  7. pytorch实战案例-手写数字分类-全链接模型——深度AI科普团队

    文章目录 @[TOC] 数据准备 导入需要的模块 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 定义损失函数 定义优化函数 定义训练和测试函数 开始训练 源码已经上传: ...

  8. 小白学深度之LSTM长短期记忆神经网络——深度AI科普团队

    前言 不知道RNN的一定要先看看RNN的原理 在RNN中我们说了RNN的不足,也就是对较长的时间,或者较长的string,很多时候前面的数据对后面的数据影响就很小甚至没影响了,这是我们就要加强前面的数 ...

  9. 从数学基础到贝叶斯理论到实践——深度AI科普团队

    贝叶斯网络(Bayesian network)又被称为信念网络( Belief network),是一种通过有向无环图( Directed acyclic graph, DAG)表示一组随机变量及其条 ...

最新文章

  1. 3.1 matlab数据的输入和输出
  2. Bitmap那些事之内存占用计算和加载注意事项
  3. apollo分布式配置中心原理
  4. IDEA创建文件添加作者及时间信息
  5. Eureka自我保护机制
  6. 李佳琦谈公益:时代成就了我 我也要回馈社会
  7. 控制服务器系统设计,基于 DNS 技术的顶管机远程控制系统设计与实现
  8. 稀疏编码(sparse code)与字典学习(dictionary learning)
  9. HighCharts:设置饼图不可点击选择
  10. 【机器学习课程笔记(吴恩达)】2.2 代价函数
  11. Java类和对象 详解(二)
  12. 实现童年梦想——RPG游戏入门(RPG制作大师使用教程)
  13. ArduPilot飞行前检查——PreArm解析
  14. 后台管理系统项目搭建
  15. Python: self的含义
  16. SOPHON sail.Decoder无法正常解码rtsp流(使用ffmpeg和opencv可以正常解码)
  17. SRRC认证样品要求 - 无线电发射设备型号核准设备类型及样...
  18. 常见的几种身份验证方法
  19. 路由器突然断网服务器无响应,突然断网了 怎样判断路由器是不是坏了?
  20. 清新黄色背景薪酬绩效考核管理模版PPT模板

热门文章

  1. python定义_python __xx__的定义和用处
  2. oracle 讲师费用,20080929--ORACLE培训笔记未整理版(讲师:ORA-600)
  3. php实现单例模式类singletonv,php设计模式 singleton (单例模式)
  4. 画春天的景色计算机教案,大班绘画春天来了教案
  5. html 调用tcpdump,Linux tcpdump命令的用法详解(内容较多)
  6. 【script】python requests模块中cookie的使用
  7. php访问多重数组,PHP实现删除多重数组对象属性并重新赋值的方法
  8. mnesia mysql性能_Mnesia
  9. android html footer 固定,前端小技巧之footer固定
  10. linux光盘运行iso,如何在Windows,Mac和Linux上从光盘创建ISO文件 | MOS86