一、灰狼算法
1.1 背景介绍
灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法。该算法受到了灰狼捕食猎物活动的启发而开发的一种优化搜索方法,它具有较强的收敛性能、参数少、易实现等特点。近年来受到了学者的广泛关注,它己被成功地应用到了车间调度、参数优化、图像分类等领域中。
1.2 算法原理
狼群中有α、β、γ三只狼做头狼,其中α是狼王,β、γ分别排第二、第三,β、γ都要听α的,γ要听β的。这三匹狼指导者其他的狼寻找猎物。狼群寻找猎物的过程就是我们寻找最优解的过程。
GWO具体优化过程包含了社会等级分层、跟踪、包围和攻击猎物和寻找猎物。
但其核心行为只有捕猎。
为了模拟灰狼的搜索行为,假设α、β、γ具有较强识别潜在猎物的能力,因此,在每次迭代过程中,保留当前种群中最好的三只狼(α、β、γ),然后根据他们的位置信息来更新其他搜索代理的位置。
1.3 构建算法数学模型
1)社会等级分层
GWO的优化过程主要有每代种群中的最好三匹狼(具体构建时表示为三个最好的解)来指导完成。
2)包围猎物
灰狼捜索猎物时会逐渐地接近猎物并包围它,该行为的数学模型如下:
3)狩猎行为的数学模型
4)攻击猎物
5)寻找猎物
二、svr算法
-
SVR的背景
SVR做为SVM的分支从而被提出,一张图介绍SVR与SVM的关系
这里两虚线之间的几何间隔r=d ∣ ∣ W ∣ ∣ \frac{d}{||W||}∣∣W∣∣d,这里的d就为两虚线之间的函数间隔。
(一图读懂函数间隔与几何间隔)
这里的r就是根据两平行线之间的距离公式求解出来的 -
SVR的原理
SVR与一般线性回归的区别
SVR | 一般线性回归 |
---|---|
1.数据在间隔带内则不计算损失,当且仅当f(x)与y之间的差距的绝对值大于ϵ \epsilonϵ才计算损失 | 1.只要f(x)与y不相等时,就计算损失 |
2.通过最大化间隔带的宽度与最小化总损失来优化模型 | 2.通过梯度下降之后求均值来优化模型 |
原理:SVR在线性函数两侧制造了一个“间隔带”,间距为ϵ \epsilonϵ(也叫容忍偏差,是一个由人工设定的经验值),对所有落入到间隔带内的样本不计算损失,也就是只有支持向量才会对其函数模型产生影响,最后通过最小化总损失和最大化间隔来得出优化后的模型。
注:这里介绍一下支持向量的含义:直观解释,支持向量就是对最终w,b的计算起到作用的样本(a>0)
如下图所示, "管道"内样本对应a=0,为非支持向量;
位于“管壁”上的为边界支持向量,0<a<ϵ \epsilonϵ
位于"管道"之外的为非边界支持向量,a>ϵ \epsilonϵ(异常检测时,常从非边界支持向量中挑选异常点)
- SVR的数学模型
3.1线性硬间隔SVR
3.2线性软间隔SVR
原因:在现实任务中,往往很难直接确定合适的 ϵ \epsilonϵ ,确保大部分数据都能在间隔带内,而SVR希望所有训练数据都在间隔带内,所以加入松弛变量ξ \xiξ ,从而使函数的间隔要求变的放松,也就是允许一些样本可以不在间隔带内。
引入松弛变量后,这个时候,所有的样本数据都满足条件:
这就是映入松弛变量后的限制条件,所以也叫-------软间隔SVR
注:对于任意样本xi,如果它在隔离带里面或者边缘上,ξ \xiξ 都为0;在隔离带上方则为ξ > 0 , ξ ∗ = 0 \xi>0,\xi^*=0ξ>0,ξ∗=0
在隔离带下方则为ξ ∗ > 0 , ξ = 0 \xi^*>0,\xi=0ξ∗>0,ξ=0
三、部分代码
clear
clc
close all
load wndspd % 示例数据为风速(时间序列)数据,共144个样本\
addpath('./libsvm-3.1/')
%% HGWO-SVR
% 训练/测试数据准备(用前3天预测后一天),用前100天做训练数据
input_train(1,:)=wndspd(1:97);
input_train(2,:)=wndspd(2:98);
input_train(3,:)=wndspd(3:99);
output_train=[wndspd(4:100)]';
input_test(1,:)=wndspd(101:end-3);
input_test(2,:)=wndspd(102:end-2);
input_test(3,:)=wndspd(103:end-1);
output_test=(wndspd(104:end))';
para=[30,500,0.2,0.8,0.2];
[bestc,bestg,test_pre]=my_HGWO_SVR(para,input_train',output_train',input_test',output_test');
%% 预测结果图
err_pre=output_test'-test_pre;
figure('Name','测试数据残差图')
set(gcf,'unit','centimeters','position',[0.5,5,30,5])
plot(err_pre,'*-');
figure('Name','原始-预测图')
plot(test_pre,'*r-');hold on;plot(output_test,'bo-');
legend('预测','原始')
set(gcf,'unit','centimeters','position',[0.5,13,30,5])
toc