欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数学建模学习记录——聚类算法

程序员文章站 2022-07-14 19:33:43
...


“物以类聚,人以群分”,所谓的聚类,就是将样本划分为 由类似的对象组成的多个类的过程。聚类后,我们可以更加 准确的在每个类中单独使用统计模型进行估计、分析或预测; 也可以探究不同类之间的相关性和主要差异。

一、聚类分析的一些概念

数据的一般的格式

数学建模学习记录——聚类算法

样品与样品之间的常用距离(样品i与样品j)

数学建模学习记录——聚类算法

指标与指标之间的常用“距离”(指标i与指标j)

数学建模学习记录——聚类算法

类与类之间的常用距离

1.由一个样品组成的类是最基本的类;如果每一类都由一 个样品组成,那么样品间的距离就是类间距离。
2.如果某一类包含不止一个样品,那么就要确定类间距 离,类间距离是基于样品间距离定义的,大致有如下几种 定义方式:最短距离法(Nearest Neighbor)、最长距离法(Furthest Neighbor)、组间平均连接法(Between-group Linkage)、组内平均连接法 (Within-group Linkage)、重心法(Centroid clustering)

二、K-means聚类算法

K-means聚类算法概述:

  • 算法流程图
    数学建模学习记录——聚类算法

  • K-means算法的评价
    优点(1)算法简单、快速。 (2)对处理大数据集,该算法是相对高效率的。
    缺点(1)要求用户必须事先给出要生成的簇的数目K。 (2)对初值敏感。 (3)对于孤立点数据敏感。

K-means++聚类算法

K-means++算法是对K-means算法缺点(2)、(3)点的改进;k-means++算法选择初始聚类中心的基本原则是:初始的聚类中 心之间的相互距离要尽可能的远。

算法描述如下: (只对K-means算法“初始化K个聚类中心”这一步进行了优化)

  • 步骤一:随机选取一个样本作为第一个聚类中心;
  • 步骤二:计算每个样本与当前已有聚类中心的最短距离(即与最 近一个聚类中心的距离),这个值越大,表示被选取作为聚类中 心的概率较大;最后,用轮盘法(依据概率大小来进行抽选)选 出下一个聚类中心;
  • 步骤三:重复步骤二,直到选出K个聚类中心。选出初始点后,就 继续使用标准的K-means算法了。

Spss的聚类分析

Spss分析中的K-均值聚类可以很好的帮助我们实现聚类
注:如果数据的量纲不一样,那么算距离时就没有意义。可以通过下面的公式进行标准化处理
数学建模学习记录——聚类算法
当然,Spss的描述统计可以帮助我们标准化变量:
数学建模学习记录——聚类算法
对数据(城市消费水平)进行聚类分析:

数学建模学习记录——聚类算法

数学建模学习记录——聚类算法

三、系统(层次)聚类

系统聚类法过程

数学建模学习记录——聚类算法

通过聚类成一个类后,通过分割可以分成多个类

聚类分析需要注意的问题

数学建模学习记录——聚类算法

系统聚类法的SPSS实现

使用SPSS分类中的系统聚类法,可以得到谱系图
数学建模学习记录——聚类算法

用图形估计聚类的数量

数学建模学习记录——聚类算法
确定K后保存聚类结果并画图
数学建模学习记录——聚类算法

四、DBSCAN算法

之前的聚类算法都是基于距离的算法,但是光是以距离进行聚类,有时很难得到理想的聚类图形;而DBSCAN算法(Density-based spatial clustering of applications with noise) 是一种基于密度的聚类方法,聚类前不需要预先指定聚类的个数,生成的簇的个数不定(和数据有关)。该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值。 该方法能在具有噪声的空间数据库中发现任意形状的簇,可将密度足够大的相邻区域连接,能有效处理异常数据。

采用DBSCAN算法,能很好的处理比如这样的图:
数学建模学习记录——聚类算法

基本概念

DBSCAN算法将数据点分为三类:

  • 核心点:在半径Eps内含有不少于MinPts数目的点
  • 边界点:在半径Eps内点的数量小于MinPts,但是落在核心 点的邻域内
  • 噪音点:既不是核心点也不是边界点的点

数学建模学习记录——聚类算法

DBSCAN算法伪代码

DBSCAN(D, eps, MinPts) { 
	C = 0 
	for each point P in dataset D { 
		if P is visited 
			continue next point 
		mark P as visited
		NeighborPts= regionQuery(P, eps) 
		if sizeof(NeighborPts) < MinPts 
			mark P as NOISE 
		else { 
			C = next cluster 
			expandCluster(P, NeighborPts, C, eps, MinPts) 
		} 
	} 
}
expandCluster(P, NeighborPts, C, eps, MinPts) { 
	add P to cluster C 
	for each point P' in NeighborPts{ 
		if P' is not visited { 
			mark P' as visited 
			NeighborPts' = regionQuery(P', eps) 
			if sizeof(NeighborPts') >= MinPts 
				NeighborPts= NeighborPtsjoined with NeighborPts' 
		} 
		if P' is not yet member of any cluster 
			add P' to cluster C 
		} 
}
regionQuery(P, eps) 
	return all points within P's eps-neighborhood (including P)

优缺点

数学建模学习记录——聚类算法

相关标签: 聚类