几种常用的聚类算法及评价方法——2022.4

本文分析了Kmeans、Kmedoids、Cure、Birch、DBSCAN、OPTICS、Clique、DPC算法。

除了Birch聚类算法的python算法调用了sklearn.cluster里的Birch函数,没有未搜到Clique聚类的matlab版本的算法。其余算法python和matlab算法都是根据原理所编。喜欢的给个star~喔。github项目

2.聚类算法

实际类别数据集如图2.1所示。
在这里插入图片描述

2.1.Kmeans聚类算法

2.1.1.Kmeans聚类算法思想

1.确定类别N的值
2.随机从数据集{X_1,X_2,…,X_n}中选择N个数据作为数据中心点,记N_1,N_2,…,N_m
开始迭代:
3.将某个数据分别和N_1,N_2,…,N_n进行距离比较,选出距离最近的将此数据归入此类别的族中,继续分类其他的数据
4.重新确定N个族中心,采用里面各个类别中所有的数据进行x和y轴的平均值的那个点(重心),作为族中心。
5.迭代到合适的时候终止迭代(从代码上来看,每个族中心点和新的族中心点距离小于0.1时即可终止迭代)。
缺点:①类别要人为确定
②族中心点的迭代选择存在风险
2.1.2.Kmeans聚类算法预测结果可视化
经过不断地运行,得到准确率较高的分类,如图2.2所示。
在这里插入图片描述
在这里插入图片描述

图2.2 Keams预测分类图

2.1.3 评估指标

在这里插入图片描述

图2.3 各种评估指标图

2.2 .Kmedoids聚类算法

2.2.1.Kmedoids聚类算法

相当于Kmeans聚类算法的改进,其改进了迭代中簇中心的选择,从而提高了分
类的准确性。
1.确定类别N的值
2.随机从数据集{X_1,X_2,…,X_n}中选择N个数据作为数据中心点,记 N_1,N_2,…,N_m,并去除数据集中随机抽取到的那个数据,即目前数据个数为 n-m
3.将每个类别中某个数据分别和N_1,N_2,…,N_n进行距离比较,选出距离最近的将此数据归入此类别的族中,继续分类其他的数据
开始迭代
4.在每个类别中随机产生一个待定的族中心,计算其他数据到此待定族中心的距离总和o_rand_sum和其他数据点到原族中心的距离总和o_sum。若o_rand_sum<o_sum,则新族中心产生,否则继续随机产生待定族中心,确定
了新的族中心,删除此数据集中的此数据
5.将每个类别中某个数据分别和N_1,N_2,…,N_n进行距离比较,选出距离最近的将此数据归入此类别的族中,继续分类其他的数据
6.终止迭代的条件是目前每个类别中若将所有的点逐一试探作为簇中心,其o_rand_sum都大于o_sum时
缺点:①类别要人为确定
②族中心点的迭代选择的复杂度提高,从而消耗时间
2.2.2.Kmedoids聚类算法预测结果可视化
经过不断地运行,得到准确率较高的分类,如图2.4所示。
在这里插入图片描述
在这里插入图片描述

图2.4 Kmedoids预测分类图

2.2.3 评估指标

在这里插入图片描述

图2.5 各种评价指标

2.3.Cure聚类算法

2.3.1.Cure聚类算法思路

1.论文思路
从魏桂英和郑玄轩发表的《层次聚类方法的CURE算法研究》论文来看,其步骤如下:
(1)从源数据对象中抽取一个随机样本S;
(2)将样本S分割成一组划分;
(3)对每个划分局部的聚类;
(4)通过随机样本剔除孤立点。如果一个类增长缓慢就去除它;
(5)对局部的类进行聚类,落在每个新形成的类中的代表点根据用户定义的一个收缩因子收缩或向类中心移动。这些点代表和捕捉到了类的形状。
(6)用相应的类标签来标记数据。
2.搜到的代码思路
本人从网上搜到matlab代码后按照每条语句翻译成python代码。之后,理解了一下代码思路,发现此代码与魏桂英和郑玄轩发表的论文思路不一致。可能此代码是cure代码的改进,也可能并非cure代码。
(1)预先设定筛选参考点的阈值和距离,且使得候选参考点的值为第一条数据集的值
(2)根据最小距离迭代选出N个参考点
(3)候选参考点个数大于阈值时,删除候选参考点数据集
(4)候选参考点的无向图的确定(未细看,只看了代码框架)
(5)利用图的广度优先搜索,对候选参考点进行分类(未细看,只看了代码框架)
(6)参考点即族中心确定,数据集根据距离归类
2.3.2.Cure聚类算法预测结果可视化
经过不断地调整半径Radius和阈值T,得到准确率较高的分类,如图2.6和表2-3所示:
表2-3 调整的较佳分类情况参数值列表
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

图2.6 Cure算法预测分类图

2.3.3评估指标

在这里插入图片描述

图2.7 各种评价指标

2.4.Birch聚类算法

2.4.1.Birch聚类算法思路

2.4.2.Birch聚类算法预测结果可视化

经过不断地调整branching_factor,n_clusters和threshold,得到准确率较高的分类,如图2.8表2.4所示所示。
表2-4 调整的较佳分类情况参数值列表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图2.8 Birch算法预测分类图

2.4.3 评估指标

在这里插入图片描述

图2.9 各种评估指标图
未完成matlab版本算法原理转python版本,而是直接通过调用sklearn.cluster里的Birch函数。

2.5.DBSCAN聚类算法

2.5.1.DBSCAN聚类算法思路

1.首先确定半径epsilon和区域内点的最小值MinPts.
2.计算点与点间的欧式距离,用矩阵储存,另定义visited标记顶点是否已被访问
3.扫描每行的距离矩阵矩阵,一旦其值小于epsilon并且其个数超过Minpts,即此点是核心对象点,visited标记区域内的点。继续在其圆形区域内寻找其他的核心对象点,从而逐层开始向外扩散,直到找不到核心点。此为一个类别,距离矩阵继续按行扫描,继续判定其他类别,直至扫描完毕。
缺点:①不适合密度变化很大的数据
2.5.2.DBSCAN聚类算法预测结果可视化
经过不断地调整epsilon和MinPts的值,得到准确率较高的分类,图中的模型值中空心圆点是噪声点。如图2.10和表2-5所示:
表2-5 调整的较佳分类情况参数值列表
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

图2.10 DBSCAN算法预测分类图
2.5.3 评估指标
在这里插入图片描述

图2.11 各种评估指标

2.6.OPTICS聚类算法

2.6.1.OPTICS聚类算法思路
1.确定k值,
2.距离按行矩阵排序,并且第k+1个距离是密度的界限阈值
3.得出决策图
4根据决策图寻找类别的内容集
经过多次调k的值,终于得到准确率较高的分类方法。图中的模型值中空心圆点是噪声点。
2.6.2.OPTICS聚类算法预测结果可视化
经过不断地调整k的值,得到准确率较高的分类,图中的模型值中空心圆点是噪声点如图2.12所示。
在这里插入图片描述
在这里插入图片描述

图2.12 OPTICS算法预测分类图
缺点:不适合密度分布相差较大的数据集。
2.6.3 评估指标
在这里插入图片描述

图2.13 各种评估指标图

2.7.Clique聚类算法

本人未搜到Clique聚类算法matlab版本的算法,目前本人所能查到网上传播的代码有java和python版本的,于是,本人按照python版本的代码编写matlab代码。

2.7.1.Clique聚类算法思路

整体思路如下:
根据上一个纬度的dense_units,算得当前的dense_units,在分类过程中涉及连通图的概念。具体思路过程寒假继续研究。
2.7.2.Clique聚类算法预测结果可视化
经过不断地调整xsi和tau的值,得到准确率较高的分类,图中的模型值中黑色空心圆点是噪声点,如图2.14和表2-7所示。
表2-7 调整的较佳分类情况参数值列表
在这里插入图片描述
在这里插入图片描述

图2.14 Clique算法预测分类图
2.7.3 评估指标
在这里插入图片描述
图2.15 各种评估指标

2.8.DPC聚类算法

2.8.1.DPC聚类算法思路

1.计算完全无向图的权重(聚类)矩阵
2.确定dc值,其值对分类的正确性有很大关联。可经过不断地调整dc的参数值可以达到分类的100%正确性
3.使用Gaussian kernel公式得出局部密度矩阵rho,并将其进行降序排列
4.根据rho矩阵得出ρ和δ值,并画图其决策图
5.根据决策图,手动确定聚类中心,此聚类中心点具有相对较高的ρ和较高的δ值,异于一般的值
6.根据距离指定剩余点类别
7.边界确定,确定噪声点,在此点在类别并且和类别中所有点的距离均大于dc值,此点即为噪声点
2.8.2.DPC聚类算法预测结果可视化
左边为决策图,右边图形为算法模型分类。经过不断地调整dc的值,得到准确率较高的分类,如图2.16所示。

在这里插入图片描述

图2.16 DPC算法预测分类图
matlab中getrect()函数手动截取图像,这个矩阵的坐标,其目的为后面的聚类中心的寻找打下铺垫。在python中,本人没有通过函数来截取矩阵,而是直接输入坐标。

2.8.3 评估指标

在这里插入图片描述

                     图2.17 各种评估指标图

 
 
  • 1

2.9.python聚类代码的编写与报告

在这里插入图片描述

图2.18 python代码模块图

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1. K-Means 聚类算法是一种常用的基于距离的聚类算法,它的主要原理是通过迭代计算来寻找数据集中的 K 个聚类中心,然后将每个样本点划分到离其最近的聚类中心所在的簇中,最终得到 K 个簇,使得同一簇中的样本点之间的距离尽可能小,不同簇之间的距离尽可能大。这个过程可以用以下流程来理解: - 随机初始化 K 个聚类中心,通常是随机选取 K 个样本点做为初始簇中心。 - 对于每个样本点,计算其与每个聚类中心的距离,将其划分到距离最近的簇中。 - 对于每个簇,重新计算其聚类中心,即将簇中所有样本点的坐标取平均值得到新的聚类中心。 - 重复步骤二和步骤三,直到簇中心不再变化或者达到预定的迭代次数。 2. 距离计算方法通常使用欧氏距离或曼哈顿距离。欧氏距离是两个点的欧氏空间中的距离,也是 K-Means 聚类算法常用的距离计算方法,计算公式为: $$d_{euclidean}(p,q)=\sqrt{\sum_{i=1}^{n}(p_i-q_i)^2}$$ 其中,p 与 q 分别表示两个数据点的坐标,n 表示数据的特征数。 曼哈顿距离也叫城市街区距离,是两个坐标点在曼哈顿网格中沿网络的路线长度,计算公式为: $$d_{manhattan}(p,q)=\sum_{i=1}^{n}|p_i-q_i|$$ 3. 聚类评价准则可以通过计算簇内和簇间的方差之和来实现。簇内方差反映了簇内样本点之间的相似程度,簇间方差反映了簇之间的差异程度。通常使用 SSW(簇内平方和)和SSB(簇间平方和)两个指标来评价聚类的效果。SSW 越小,表示同一类别的样本聚集程度越高,SSB 越大,表示不同类别的样本分离程度越高。我们希望 SSW 小,SSB 大,因此可以定义如下指标: $$F=\frac{SSB}{SSW}$$ 当 F 值越大时,聚类效果越好。 4. 下面是使用 Java 实现 K-Means 聚类算法的伪代码: ```java // 定义距离计算方法 double distance(Point p, Point q) { double dist = 0.0; for (int i = 0; i < n; i++) { dist += Math.pow(p.coordinates[i] - q.coordinates[i], 2); } return Math.sqrt(dist); } // 初始化聚类中心 Point[] centroids = new Point[K]; for (int i = 0; i < K; i++) { centroids[i] = dataPoints.get(i); // 从数据集中随机选择 K 个点作为聚类中心 } // 迭代计算 for (int iter = 0; iter < maxIterations; iter++) { Map<Point, List<Point>> clusters = new HashMap<>(); // 对每个数据点,寻找最近的聚类中心,将其归入对应簇中 for (Point p : dataPoints) { double minDist = Double.MAX_VALUE; Point nearestCentroid = null; for (Point c : centroids) { double dist = distance(p, c); if (dist < minDist) { minDist = dist; nearestCentroid = c; } } if (!clusters.containsKey(nearestCentroid)) { clusters.put(nearestCentroid, new ArrayList<>()); } clusters.get(nearestCentroid).add(p); } // 更新聚类中心 for (Point c : centroids) { if (clusters.containsKey(c)) { List<Point> dataInCluster = clusters.get(c); double[] sum = new double[n]; for (Point p : dataInCluster) { for (int i = 0; i < n; i++) { sum[i] += p.coordinates[i]; } } for (int i = 0; i < n; i++) { c.coordinates[i] = sum[i] / dataInCluster.size(); } } } // 检查聚类中心是否变化 boolean hasChanged = false; for (int i = 0; i < K; i++) { if (!centroids[i].equals(oldCentroids[i])) { hasChanged = true; break; } } if (!hasChanged) { break; } } // 返回聚类结果 return clusters; ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值