声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~
今天为大家带来一期雪消融优化算法SAO优化DBSCAN聚类,独家原创!还没有人用过,适合作为创新点!直接替换Excel数据即可用!具体代码已放在最后,需要代码的朋友可直接拉到最后~
目录
原理简介
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法。相比于传统K-means等聚类算法,它具有以下优点:
-
不需要指定聚类的个数
-
只需要两个参数(半径r和阈值minPts)
-
虽然是一种聚类算法,但也擅长找到离群点(可用于异常值监测)
然而,它也面临参数选择困难的问题,需要我们自行设置的参数为:阈值minPts以及半径ε。一般来说,半径ε需要找突变点,minPts为K距离中的K值,一般取小一点,需要多次尝试。因此,人工选择参数非常困难,也无法判断是否为最优参数,因此我们采用2023年新出的雪消融优化算法对这两个算法进行寻优。
雪消融优化器( SAO) 是2023年发表在SCI一区期刊《Expert Systems with Applications》上的文章,作者受到自然界中雪的升华和融化行为的启发,开发了一种新的基于物理的雪消融优化器(SAO)算法,模拟雪的升华和融化行为。
如下图所示:在融化的过程中,雪会转化为液态水,而它可以通过升华直接转化为蒸汽。同时,需要注意的是,融雪转化的液态水也可以通过蒸发转化为蒸汽。
具体测试函数效果与算法公式可以查看这个算法的原文献:
Lingyun Deng, Sanyang Liu. Snow ablation optimizer: A novel metaheuristic technique for numerical optimization and engineering design,Expert Systems with Applications,Volume 225,2023.
接下去我们利用这个算法优化DBSCAN的两个核心参数,适应度函数为轮廓系数,使其轮廓系数最大:
代码平台
Matlab
数据输入
Excel输入多个特征即可,这里以两个特征为例,如图所示,如果需要替换直接替换Excel内数据即可,不同特征数量均可~
效果展示
首先看看原始的数据效果点分布~
数据分布的特征还是很明显的,看看我们的算法效果如何
可以看到,我们的算法很容易地将数据分成了三类,效果非常好,同时还用不同的颜色进行标注,另外,也用黑色点标注出了离群点,即异常值,在Matlab代码中用0标识。其余类别分别用1、2、3标识,还是非常方便的。
再来看看我们雪消融优化算法的迭代曲线:
由于是最大化问题,因此迭代曲线往上,完全没有问题,雪消融优化算法也仅仅用了几次便找到了最优解,可以看出效果还是非常不错的~
控制台同时也会显示最优参数:
部分代码展示
%% 清除相关变量
clc;
clear;
close all;
%% 导入数据
X = xlsread('数据集.xlsx');
figure
plot(X(:,1),X(:,2),'o','MarkerSize',3,'Color','k','MarkerFaceColor','k');
xlabel('横坐标')
ylabel('纵坐标')
title('原始数据')
set(gcf,'color','w')
%% 参数设置
N = 30; % 种群规模
T = 20; % 迭代次数
lb = [0.01,5]; % 优化下界
ub = [1,10]; % 优化上界
dim = 2; % 优化个数
fobj = @(x)fitness(x,X);
%% 优化
[Best_score, Best_pos, cg_curve] = SAO(N,T,lb,ub,dim,fobj); % 调用算法优化
cg_curve = abs(cg_curve-1); % 取反是因为轮廓系数越大越好
%% 迭代曲线
figure
plot(cg_curve)
title('寻优曲线')
xlabel('迭代次数')
ylabel('适应度值')
set(gcf,'color','w')
display(['最佳参数值为:', num2str(Best_pos)]);
display(['最佳适应度值为:', num2str(Best_score)]);
%% 运行DBSCAN算法
Eps = Best_pos(1); % 得到最佳参数
MinPts = Best_pos(2); % 得到最佳参数
cluster = DBSCAN(X,Eps,MinPts);
%% 绘制结果图
figure
PlotClusterinResult(X, cluster);
title(['SAO-DBSCAN(\epsilon = ' num2str(Eps) ', MinPts = ' num2str(MinPts) ')']);
set(gcf,'color','w');
代码目录如下:
完整代码获取方式
点击下方小卡片,后台回复关键字,不区分大小写。关键字:
SAODBSCAN