蝗 虫 优 化 算 法 ( Grasshopper Optimization Algorithm, GOA) 是一种新型的元启发式算法,由 Mirjalili 等人于2017年提出。该算法受幼虫和成年蝗虫大范围移动与寻找食物源的聚集行为启发,具有操作参数少,公式简单的特点。针对基准测试函数优化问题的实验结果表明,GOA的收敛性优于粒子群算法。
1.1.1 蝗虫群的位置移动
X i d = c ( ∑ j = 1 , j ≠ i N c u b d − l b d 2 s ( ∣ x j d − x i d ∣ ) x j − x i d i j ) + T d ( 1 ) X_{i}^{d}=c\left(\sum_{j=1,j \neq i}^{N} c \frac{u b_{d}-l b_{d}}{2} s\left(\left|x_{j}^{d}-x_{i}^{d}\right|\right) \frac{x_{j}-x_{i}}{d_{i j}}\right)+{T}_{d}(1) Xid=c⎝⎛j=1,j=i∑Nc2ubd−lbds(∣∣xjd−xid∣∣)dijxj−xi⎠⎞+Td(1)
式中, d d d是表示变量维度, i , j i, j i,j表示蝗虫个体编号, u b d 、 l b d ub_d、lb_d ubd、lbd分别表示变量的上限与下限, T d T_d Td表示最优的蝗虫个体位置, d i j d_{ij} dij是两个蝗虫个体之间的欧式距离,c是控制参数,用于平衡算法的全局探索和局部开发。函数 s ( ) s( ) s()表示两个蝗虫个体之间的交互力影响。
控制参数
c
c
c 一般设计为线性递减,使得算法具有动态与不确定搜索能力:
c
=
c
max
−
t
c
max
−
c
min
T
max
(
2
)
c=\mathrm{c}_{\max }-t \frac{\mathrm{c}_{\max }-\mathrm{c}_{\min }}{\mathrm{T}_{\max }}(2)
c=cmax−tTmaxcmax−cmin(2)
式中, c m a x 、 c m i n c_{max}、c_{min} cmax、cmin分别表示递减区间的最大值与最小值, t t t表示当前的迭代次数, T m a x T_{max} Tmax表示最大迭代次数。
1.1.2 蝗虫个体之间的相互影响
s ( r ) = f e − r l − e − r ( 3 ) s(r)=f \mathrm{e}^{\frac{-r}{l}}-\mathrm{e}^{-r}(3) s(r)=fel−r−e−r(3)
式中,
f
、
l
f、l
f、l分别表示吸引强度参数与吸引尺度参数,取0.5和1.5。
s
(
r
)
>
0
s(r)>0
s(r)>0时,
r
r
r的取值范围表示吸引区.
s
(
r
)
<
0
s(r)<0
s(r)<0时,
r
r
r的取值范围表示排斥区.
s
(
r
)
=
0
s(r)=0
s(r)=0时,蝗虫个体之间既不排除也不吸引,
r
r
r的取值范围表示舒适区.
1.1.3 蝗虫优化算法的基本实现步骤
使用台湾林智仁教授开发的libsvm支持向量机库函数,可以进行支持向量机的多分类,并且能简单的设置支持向量机核函数属性,比如线性核函数,多项式核函数,RBF核函数。RBF核函数具有映射范围广、运算快速等特点,使用较为广泛。在libsvm的库函数中, C C C的值为1, σ \sigma σ默认取1/k,k为总类别数。这两个参数的取值与支持向量机模型学习能力的关系如下图所示:
C C C取值 | σ \sigma σ取值 | SVM模型的学习能力 |
---|---|---|
小 | 小 | 欠学习 |
大 | 大 | 过学习 |
使用智能优化算法优化支持向量机分类时,大多通过优化惩罚参数 C C C与核函数参数 σ \sigma σ来提高分类精度。
数据来源: 采用意大利红酒数据集进行分类模型的实现。数据集大小为178组样本,每组样本都具有13个特征,3种标签类型。获取的类型一般采用01的索引编码:
类型 | 编码 |
---|---|
1 | 1 0 0 |
2 | 0 1 0 |
3 | 0 0 1 |
使用支持向量机做分类时,不需要通过索引编码的方式,直接获取123等整数类别即可(各种神经网络分类模型需要在程序中通过编码与解码索引,实现较高的分类精度)。
为了方便操作,将特征与整数类型放到EXCEL中,读取代码的命令如下:
%% 读取数据 data=xlsread('数据.xlsx','Sheet1','A1:N178'); %使用xlsread函数读取EXCEL中对应范围的数据即可 %输入输出数据 input=data(:,1:end-1); %data的第一列-倒数第二列为特征指标 output_labels=data(:,end); %data的最后面一列为标签类型
优化惩罚参数c与核参数
σ
\sigma
σ,目标函数采用五折交叉验证的最佳准确率。目标函数公式如下:
Fitness
=
n
N
×
100
%
\text { Fitness }=\frac{n}{N} \times 100 \%
Fitness =Nn×100%
式中,
n
n
n为识别准确的样本统计个数,
N
N
N为识别的样本总数。适应度越大,说明优化模型的识别准确率越高。
GOA算法的参数设置:
% GOA的参数选项初始化 goa_option.maxgen = 100; %最大迭代次数 goa_option.sizepop = 20; %种群大小 goa_option.cbound = [1e-5,1000]; %惩罚参数C的优化范围 goa_option.gbound = [1e-5,1000]; %核参数g的优化范围 goa_option.v = 5; %交叉验证折数 %系数c的变化范围 cMax=1; cMin=0.00004; f=0.5;L=1.5; %相互作用力公式的系数常量
GOA优化后的参数赋给SVM:
%% 利用最佳的参数进行SVM网络训练 cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)]; model = libsvmtrain(train_output_labels,train_input,cmd);
4.1 蝗虫优化算法的适应度曲线和优化后的c、g参数值,交叉验证CV准确率
4.2 蝗虫优化算法优化后的实际类型与识别类型对比图像
从适应度曲线来看,蝗虫优化算法的收敛速度很快,但后期发生聚群行为(可能陷入局部最优)。SVM对红酒数据集的分类准确率一般为97%上下,故起到了优化的效果。
参考文献: [1]Shahrzad, Saremi, Seyedali, et al. Grasshopper Optimisation Algorithm: Theory and application[J]. Advances in Engineering Software, 2017.
见博客主页
1.支持向量机SVM分类
2.灰狼优化算法GWO优化支持向量机分类
3.遗传算法GA优化支持向量机分类
4.粒子群算法PSO优化支持向量机分类
5.蝗虫优化算法GOA优化支持向量机分类