CS(布谷鸟搜索)算法MATLAB源码逐行中文注解

10 篇文章 7 订阅
9 篇文章 8 订阅

以优化SVM算法的参数c和g为例,对CS算法MATLAB源码进行了逐行中文注解。
完整程序和示例文件地址:http://download.csdn.net/detail/u013337691/9622335
链接:http://pan.baidu.com/s/1sl2BzKL 密码:pkdn

tic % 计时
%% 清空环境导入数据
clear
clc
close all
load wndspd % 示例数据为风速(时间序列)数据,共144个样本
% 训练/测试数据准备(用前3天预测后一天),用前100天做测试数据
train_input(1,:)=wndspd(1:97);
train_input(2,:)=wndspd(2:98);
train_input(3,:)=wndspd(3:99);
train_output=[wndspd(4:100)]';
test_input(1,:)=wndspd(101:end-3);
test_input(2,:)=wndspd(102:end-2);
test_input(3,:)=wndspd(103:end-1);
test_output=[wndspd(104:end)]';

[input_train,rule1]=mapminmax(train_input);
[output_train,rule2]=mapminmax(train_output);
input_test=mapminmax('apply',test_input,rule1);
output_test=mapminmax('apply',test_output,rule2);
%% CS-SVR
time=20;
n=20; % n为巢穴数量
pa=0.25; % 被宿主发现的概率
dim = 2; % 需要寻优的参数个数
Lb=[0.01,0.01]; % 设置参数下界
Ub=[100,100]; % 设置参数上界

% 随机初始化巢穴
nest=zeros(n,dim);
for i=1:n % 遍历每个巢穴
    nest(i,:)=Lb+(Ub-Lb).*rand(size(Lb)); % 对每个巢穴,随机初始化参数
end

fitness=ones(1,n); % 目标函数值初始化
[fmin,bestnest,nest,fitness]=get_best_nest(nest,nest,fitness,input_train,output_train,input_test,output_test); % 找出当前最佳巢穴和参数

%% 迭代开始
for t=1:time
    new_nest=get_cuckoos(nest,bestnest,Lb,Ub); % 保留当前最优解,寻找新巢穴
    [~,~,nest,fitness]=get_best_nest(nest,new_nest,fitness,input_train,output_train,input_test,output_test); % 找出当前最佳巢穴和参数
    new_nest=empty_nests(nest,Lb,Ub,pa); % 发现并更新劣质巢穴
    % 找出当前最佳巢穴和参数
    [fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness,input_train,output_train,input_test,output_test); 
    if fnew<fmin,
        fmin=fnew;
        bestnest=best ;
    end
end
%% 打印参数选择结果
bestobjfun=fmin;
bestc=bestnest(1);
bestg=bestnest(2);
disp('打印参数选择结果');
str=sprintf('Best c = %g,Best g = %g',bestc,bestg);
disp(str)
%% 利用回归预测分析最佳的参数进行SVM网络训练
cmd_cs_svr=['-s 3 -t 2',' -c ',num2str(bestnest(1)),' -g ',num2str(bestnest(2))];
model_cs_svr=svmtrain(output_train',input_train',cmd_cs_svr); % SVM模型训练
%% SVM网络回归预测
[output_test_pre,acc]=svmpredict(output_test',input_test',model_cs_svr); % SVM模型预测及其精度
test_pre=mapminmax('reverse',output_test_pre',rule2);
test_pre = test_pre';

err_pre=wndspd(104:end)-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(wndspd(104:end),'bo-');
legend('预测','原始')
set(gcf,'unit','centimeters','position',[0.5,13,30,5])

result=[wndspd(104:end),test_pre];

MAE=mymae(wndspd(104:end),test_pre)
MSE=mymse(wndspd(104:end),test_pre)
MAPE=mymape(wndspd(104:end),test_pre)
%% 显示程序运行时间
toc

(广告)欢迎扫描关注微信公众号:Genlovhyy的数据小站(Gnelovy212)
这里写图片描述

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值