目录

一、关于聚类的基础描述

1.1  聚类与分类的区别

1.2  聚类的概念

1.3  聚类的步骤

二、几种常见的聚类算法

2.1 K-means聚类算法

1) K-means算法的流程:

2)K-means算法的优缺点及算法复杂度

3)K-means算法的调优与改进

4)K-means算法的python代码实现

2.2 GMM高斯混合模型聚类算法

2.3 Mean shift聚类算法

1)单点mean shift算法基本流程

2)整个数据集的meanshift聚类流程

3)meanshift聚类算法的优缺点及算法复杂度

4)meanshift在图像分割和目标跟踪领域的应用

5)单点meanshift的python代码实现

2.4 基于密度的DBSCAN聚类算法

1)DBSCAN算法的基本概念

2)DBSCAN的基本流程

3)DBSCAN的优缺点及算法复杂度

4)DBSCAN的代码实现

2.5谱聚类spectral clustering


一、关于聚类的基础描述

1.1  聚类与分类的区别

聚类是一种无监督学习,即数据不需要有标签即可。它与分类不同,分类是对有标签的数据进行的,是一种有监督学习。这是两者的区别。(举个例子,一堆人站在这里,没有标签,我们可以采用聚类来对这群人分组,如选取身高这个指标来对他们聚类。而如果是分类,比如男女分,按照每个人的性别标签即可。聚类不需要标签,只要我们自己选择一个指标,按指标来分簇即可。)

1.2  聚类的概念

聚类是按照某个指标(如样本之间的距离)把数据集分割成不同的类或者簇,使类内元素的相似性尽可能的大,类间元素的相似性尽可能小,通过这样来对相似的数据进行归簇,从而达到聚类的效果。

1.3  聚类的步骤

1.数据准备 : 特征标准化(白化)

2.特征选择 : 特征降维,选择最有效的特征

3.特征提取: 对选择的特征进行转换,提取出更有代表性的特征

4.聚类: 基于特定的度量函数进行相似度度量,使得同一类数据的相似度尽可能的贴近,不同类的数据尽可能分离,得到各个类的中心以及每个样本的类标签。

5.评估: 分析聚类结果,如距离误差和误差平方和(SSE)等

二、几种常见的聚类算法

2.1 K-means聚类算法

1) K-means算法的流程:

1.随机选取K个中心点

2.遍历数据集里面的每个点,看距离哪个中心点最近就分为哪一类,遍历完一共K类

3.把属于一类的点取平均值,得到的平均值作为新的中心点

4.然后不断重复步骤2,3,直到达到结束条件为止。(当中心点不再变动或变动很小,当达到最大迭代次数)

2)K-means算法的优缺点及算法复杂度

优点:

原理简单,算法复杂度较低

缺点:

k值未知,需要人为设定

对于初始化中心点特别敏感,不同的初始化,结果可能不一样

容易受到噪声的影响,可能收敛于局部最小值,同时数据量大时收敛速度较慢

不太适合离散的数据,样本类别不均衡的数据的聚类

k-means 有一个重要特征,它要求这些簇的模型必须是圆形:k-means 算法没有内置的方法
来实现椭圆形的簇

算法复杂度:

O(t*k*n*d)  t是迭代次数,k是类数,n是数据点个数,d是数据维度

3)K-means算法的调优与改进

k值的选取问题,K-means++,或者先使用谱聚类或层次聚类对样本进行聚类,得到K

,或使用手肘法,遍历可能的K值,画出该点下Loss的大小,选择曲线的拐点处的K值

对于数据量大的情况,可以选择mini-batch的方法,不过准确度会下降

初始点敏感的问题,可以选择多种初始点情况,选择误差最小的一种

噪声影响问题,K-medoids,将步骤3改为,求一个类里面,每个点到类内其他点距离和最小的,选择它作为我们下一步的中心点,这样就有效缓解了噪声问题

4)K-means算法的python代码实现

import numpy as np
import randomdef cal_distance(node,centor):return np.sqrt(np.sum(np.square(node-centor)))
def random_centor(data,k):data=list(data)return random.sample(data,k)
def random_centor1(data,k):n=len(data[0])#n维centor=np.array([[0]*n for _ in range(k)])#一定要将列表转换为数组for j in range(n):min_j=np.min(data[:,j])max_j=np.max(data[:,j])centor[:,j]=np.random.rand(k)*(max_j-min_j)+min_jreturn centor
def get_cluster(data,centor):cluster_dict=dict()k=len(centor)for node in data:cluster_class = -1min_distance = float('inf')for i in range(k):dist=cal_distance(node,centor[i])if dist<min_distance:cluster_class=imin_distance=distif cluster_class not in cluster_dict.keys():cluster_dict[cluster_class]=[]cluster_dict[cluster_class].append(node)return cluster_dictdef get_centor(cluster_dict,k):new_centor=[]for i in range(k):centor=np.mean(cluster_dict[i],axis=0)new_centor.append(centor)return new_centordef cal_varience(cluster_dict,centor):vsum=0for i in range(len(centor)):cluster=cluster_dict[i]for j in cluster:vsum+=cal_distance(j,centor[i])return vsumdef k_means(data,k):centor=random_centor(data,k)print(centor)cluster_dict=get_cluster(data,centor)new_varience=cal_varience(cluster_dict,centor)old_varience=1while abs(old_varience-new_varience)>0.1:centor=get_centor(cluster_dict,k)cluster_dict=get_cluster(data,centor)old_varience=new_variencenew_varience=cal_varience(cluster_dict,centor)return cluster_dict,centordata=np.array([[1,1,1],[2,2,2],[1,2,1],[9,8,7],[7,8,9],[8,9,7]])
a,b=k_means(data,2)
print(a,b)

2.2 GMM高斯混合模型聚类算法

2.3 Mean shift聚类算法

mean shift的本质就是中心点向着密度越来越大的地方进行偏移,最终收敛到样本密度最大的地方。它的参数R往往靠经验选取

1)单点mean shift算法基本流程

1.随机选择一个点作为球心,半径选为R

2.以球心为起点,球内样本点为终点,将他们的向量相加后求平均,得到meanshift值

3.球心+mean shift值得到更新后的球心。

4.不断重复23直到球心不再移动或移动微小

2)整个数据集的meanshift聚类流程

1.在未被标记的数据点中随机选择一个点作为原始中心点

2.找出以中心点为球心,半径为R的球体中所有数据点,认为他们为聚类C,同时在C类中记录这些数据点出现的次数+1

3.以球心为起点,球内样本点为终点,将他们的向量相加后求平均,得到meanshift值

4.球心+meanshift的值,得到更新后的球心

5.重复234直到meanshift很小或者不移动,记录下此时的中心点,注意迭代过程中遇到的点都应该归类到C

6.判断收敛时的C类中心点与其他已经存在的类的中心点距离是否小于阈值,如果小于就把他们合并,数据点出现的次数也应该合并,如果大于,就把C当作一个新的聚类

7.重复123456直到所有点都被标记为已访问

8.对每个点,哪个类访问次数最多,就归属于哪个类。

3)meanshift聚类算法的优缺点及算法复杂度

优点:可以自动确定类的个数

对噪声比较强壮

参数简单

缺点:容易陷入局部最优

主要在欧式空间工作,在高维数据中不起作用

算法复杂度:

O(Tnlog(n))   T是迭代中选取的中心点数。

4)meanshift在图像分割和目标跟踪领域的应用

这里首先说一下,在之前的meanshift里面我们都没有讨论核函数,因为是学习基础概念,所以没必要搞太复杂,但是实际应用中,在球体内,离的远的点和离得进的点对于球心的影响权重是一样的,这显然不合理。所以引入了核函数和权重系数。核函数也叫窗口函数,在核估计中起到平滑的作用。常用的核函数有:Uniform,Epannechnikov,Gaussian等。同时在图像的处理中,一般不是球体,而是矩形。

meanshift在图像分割中的步骤:

1.将图像表示为空间中的点,一种简单的方法就是使用红绿蓝像素值,将每个像素映射到三维RGB空间中的一个点

2.对获取的点集进行meanshift聚合,一般使用高斯核函数。

3.不同的集合就构成了图像分割

meanshift在目标追踪中的步骤:

1.用运动检测算法将物体与背景分割开来

2.提取运动物体的轮廓,并从原图中获取运动图像信息

3.对这个信息进行反向投影,获取反向投影图

4.根据反向投影图和输入的方框进行meanshift迭代,迭代中会向反向投影图中概率大的地方移动,所以始终会移动到目标上

5.下一帧的图像时用上一帧输出的方框来迭代即可。

meanshift用于视频目标追踪,其实就是采用目标的颜色直方图作为搜索特征,将目标区域转化成HSV颜色空间,然后得到H的分布直方图,有了它之后,我们就是要在下一帧里面得到相同的它,这时我们采用相似函数来表述他们的相似性,让方框在最新一帧中向着相似度最大的区域移动。

meanshift在目标追踪中的优点:

1.算法计算量不大,在目标区域已知的情况下效果很好

2.采用核函数直方图模型,对边缘遮挡,目标旋转等不是很敏感

缺点:

1.目标速度太快效果不好

2.如果运动中目标被遮挡,跟踪就会失败。

5)单点meanshift的python代码实现

import numpy as npdef load_data():#dtype如果不设置默认为float,comments是指如果该行以‘#’开头,那么就跳过,usecols是指只使用0,2两列。unpack如果为True,则把0,2两列单独输出,skiprows是指跳过第一行data=np.loadtxt('data/meanshift.txt', dtype=int, comments='#', delimiter=None, skiprows=1, usecols=(0,2), unpack=False)return np.array(data)class MeanShift:def __init__(self,mean,radius):self.mean=meanself.radius=radiusdef compute_distance(self,data):return np.sqrt(np.sum(np.square(data-self.mean),axis=1))def in_ball(self,data):distance=self.compute_distance(data)inball_index=np.argwhere(distance<self.radius)#因为argwhere生成的是n行一列的return inball_index.reshape(len(inball_index),)def compute_meanshift(self,data,inball_index):in_data=data[inball_index]all_vector=in_data-self.mean#这里需要注意np.sum求完会降维meanshift=np.sum(all_vector,axis=0)/len(all_vector)return meanshiftdef update_mean(self,meanshift):self.mean=self.mean+meanshiftdef main(mean,radius):data=np.array([[2,3,1],[0,1,0],[2,0,0],[0,2,0]])obj=MeanShift(mean,radius)while True:inball_index=obj.in_ball(data)meanshift=obj.compute_meanshift(data,inball_index)if np.sqrt(np.sum(np.square(meanshift)))<0.1:breakobj.update_mean(meanshift)return obj.mean
c=main(np.array([1,1,1]),9)
print(c)

2.4 基于密度的DBSCAN聚类算法

1)DBSCAN算法的基本概念

DBSCAN是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并可以在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。

参数:半径和min_point

选择技巧:一般先选一个点,计算它与其他所有点的距离,然后排序,找到前后变化很大的一处,然后R就选则突变点即可。这个选的太大,簇就少,选的太小,簇就多,可以适当调整

min_point一般这个值都偏小,可以多次尝试一下。

2)DBSCAN的基本流程

1.把所有点标记为未见

2.随机在数据集中选择一个未标记点P,找到它的邻域R

3.判断R里面包含的样本点个数是否大于min_point,如果小于,则为噪声点,标记为已见,如果大于,则P为核心点,创建一个类C,邻域R里面的点都属于类C,如果邻域R内除了P还有其他核心点。则他们邻域里面的点也属于类C,一直迭代,直到核心点邻域里只有它自己为核心点才停止。

4.从数据集中移除C类,重复执行234,直到所有的点都是已标记为止。

3)DBSCAN的优缺点及算法复杂度

优点:

1.可以自动决定类的数量。不需要人为假设。

2.可以发现任意形状的簇类,而不像K-means那样只能发现圆形簇

3.可以识别噪声点,抗噪声能力较强

缺点:

1.不能很好的应用在高维数据中

2.如果样本集的密度不均匀,效果就不好

算法复杂度:

O(nlog(n))  n是数据点个数

4)DBSCAN的代码实现

import numpy as np
#如果是列表这里就不能这样计算,data1-data2是不合法的
def cal_distance(data1,data2):data1=np.array(data1)data2=np.array(data2)return np.sqrt(np.sum(np.square(data1-data2)))
#pop()按照索引删除,del也是按照索引删除,remove是按照值删除,
def DBSCAN(data,r,min_point):#第一步将数据中的核心点找出来放入qq=[]for i in range(len(data)):count=0for j in range(len(data)):if cal_distance(data[i],data[j]) < r:count+=1if count>=min_point:q.append(data[i])c=[[] for _ in range(len(q))]#对整个数据集进行分类,属于哪个关键点就分配进去,最终data里面不为0的就是噪声点for i in range(len(q)):for j in range(len(data)):if data[j]!=0 and cal_distance(q[i],data[j])<r:c[i].append(data[j])data[j]=0#找到噪声点。这里我用双指针实现噪声点筛选i=0for j in range(len(data)):if data[j]!=0:data[i]=data[j]i+=1noise=data[:i]#d里面存放聚类结果d=[]while True:kernal_1=q[0]i=1for j in range(1,len(q)):if cal_distance(kernal_1,q[j])<r:q[i],q[j]=q[j],q[i]c[i],c[j]=c[j],c[i]i+=1for k in range(1,i):c[kernal_1]+=c[k]if i>=len(q):breakq=q[i:]d.append(c[:i])c=c[i:]d.append(c[:i])return d,noiseclass_res,noise=DBSCAN([[1,2,3],[4,5,6],[7,8,9]],1,1)
print(class_res,noise)
# import numpy
#
# a=[1,2,3]
# print(a!=0)只返回一个True或False
# a=numpy.array([1,2,3])
# print(a!=0)返回n个True或False
# #如果要计算两个点之间的欧式距离,一定要将列表转为array再计算。因为列表不支持a-b

2.5谱聚类spectral clustering

五种常见的聚类算法总结相关推荐

  1. 机器学习笔记~五种常见的聚类算法简介

    参考:https://towardsdatascience.com/the-5-clustering-algorithms-data-scientists-need-to-know-a36d136ef ...

  2. 含泪总结,五种常见的最短路径算法

    "明月如霜,好风如水,清景无限 " 总结 总的来说,最短路径是图论的最常见的问题.即在一副有向图(无向图是特殊的有向图,不做考虑.记图中的结点数N ,而边数为 M,边长记为W)中找 ...

  3. 无监督机器学习中,最常见的聚类算法有哪些?

    https://www.toutiao.com/a6675947855951168011/ 在机器学习过程中,很多数据都具有特定值的目标变量,我们可以用它们来训练模型. 但是,大多数情况下,在处理实际 ...

  4. 五种常见的PHP设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 五种常见的PHP设计模式 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm ...

  5. 完整性校验用到常见的算法_几种常见的校验算法

    素材来源:网络 编辑整理:strongerHuang UART有一个奇偶校验,CAN通信有CRC校验.Modbus.MAVlink.USB等通信协议也有校验信息. 在自定义数据存储时,有经验的工程师都 ...

  6. dbscan算法中 参数的意义_无监督机器学习中,最常见的聚类算法有哪些?

    在机器学习过程中,很多数据都具有特定值的目标变量,我们可以用它们来训练模型. 但是,大多数情况下,在处理实际问题时,数据不会带有预定义标签,因此我们需要开发能够对这些数据进行正确分类的机器学习模型,通 ...

  7. 五种常见启发式算法求解TSP问题-总结篇

    1. 前言 本文将总结先前设计的五个启发式算法的求解效果,算法文章如下表: 智能优化算法类别 启发式算法求解TSP问题系列博文 进化算法 遗传算法求解TSP问题 仿人智能优化算法 禁忌搜索算法求解TS ...

  8. 五种常见的加密方式及常用的加解密工具

    如果你是互联网公司的信息安全从业者,那么你可能会经常需要处理撞库事件,撞库是黑客的无聊"恶作剧".黑客收集已经在互联网上泄露的用户和密码信息,生成对应的字典表,并尝试批量登录其他网 ...

  9. 七种常见的排序算法总结

    目录 引言 1.什么是排序? 2.排序算法的目的是什么? 3.常见的排序算法有哪些? 一,插入排序 1.基本思想 2.代码实现 3.性能分析 4.测试 二,希尔排序(缩小增量排序) 1.基本思想 2. ...

最新文章

  1. hdu 4366 Card Collector (容斥原理)
  2. 无人机巡逻喊话、疫情排查、送药消毒,抗疫战中机器人化身钢铁战士!
  3. 如何快速将微信公众号留言嵌入到CSDN博文中?
  4. Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  5. 微信小程序开发-入门基础
  6. 2019 微软Build大会预告:值得开发者期待的是哪些?
  7. 创建一个自己的GitHub,创建自己的开源项目
  8. 都知道李嘉诚先生是一个有钱人
  9. 开课吧Java课堂:StringBuffer全解,非常详细
  10. Ubuntu无法安装Xmind rpm包
  11. python面向对象基础知识_面向对象的一些基本知识(python)
  12. 三菱GXWorks2 多CPU参数设置
  13. hping 详解_hping3 使用详解
  14. 社区之星任玉刚:Android开发者的职场规划
  15. 分享舍得网开发经验(修改版)(转载)
  16. Spring中Junit测试启动报错class path resource [xxx.xml] cannot be opened because it does not exist
  17. cuba_CUBA 7的新功能
  18. 学成在线-第13天-讲义-在线学习 HLS
  19. 正弦和余弦(sin和cos)
  20. oracle磁带的使用期限,存储的损耗 关于磁带寿命的一些探讨

热门文章

  1. Mtk WIFI常用调试命令
  2. excel日期相减去除周末_在Excel中突出显示周末日期
  3. 【搜索】单词方阵 luogu-1101
  4. 美国 普渡 计算机科学本科,美国大学本科普渡大学CS怎么样?
  5. 抖音获客源码,短视频获客系统,获客SaaS有标准答案吗?
  6. IT程序员的抉择:我要离开帝都了
  7. TYPEC转HDMI+PD3.0 分辨率4K60Hz拓展坞方案:CS5269
  8. 【广告架构day1】爱奇艺广告系统的演进之路:实践中的一些经验
  9. React中文文档之State and Lifecycle
  10. 2012百度校园招聘笔试杭州站