利用优化算法确定预测向量的权重

本文介绍了使用遗传算法对多目标预测向量(y1,y2,y3)进行优化的过程,通过迭代选择、交叉和变异操作,以最小化MSE损失函数并保持权重和为1。展示了适应度进化曲线以追踪算法性能。
摘要由CSDN通过智能技术生成

y1,y2,y3为3个预测向量,Y为真实值,都为列向量

%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
D=3;                                %基因数目    
NP=200;                              %染色体数目
Xs=0;                               %上限          
Xx=1;                              %下限
G=200;                               %最大遗传代数
f=zeros(D,NP);                       %初始种群赋空间
nf=zeros(D,NP);                      %子种群赋空间
Pc=0.8;                              %交叉概率
Pm=0.1;                              %变异概率
f=rand(D,NP)*(Xs-Xx)+Xx;             %随机获得初始种群

%%%%%%%%%%%%%%%%%%%%%%按适应度升序排列%%%%%%%%%%%%%%%%%%%%%%%
for np=1:NP
    FIT(np)=func(f(:,np),y1,y2,y3,Y);
end
[SortFIT,Index]=sort(FIT);                            
Sortf=f(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
    %%%%%%%%%%%%%%采用君主方案进行选择交叉操作%%%%%%%%%%%%%%%%
    Emper=Sortf(:,1);                      %君主染色体
    NoPoint=round(D*Pc);                   %每次交叉点的个数
    PoPoint=randi([1 D],NoPoint,NP/2);     %交叉基因的位置
    nf=Sortf;
    for i=1:NP/2
        nf(:,2*i-1)=Emper;
        nf(:,2*i)=Sortf(:,2*i);
        for k=1:NoPoint
            nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
            nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%%%%
    
        for n=1:D
            r=rand(1,1);
            if r<Pm
                nf(n)=rand(1,1)*(Xs-Xx)+Xx;
            end
        end
    
    %%%%%%%%%%%%%%%%%%%%%子种群按适应度升序排列%%%%%%%%%%%%%%%%%%
    for np=1:NP 
          NFIT(np)=func(f(:,np),y1,y2,y3,Y); 
    end
    [NSortFIT,Index]=sort(NFIT);           
    NSortf=nf(:,Index);
    %%%%%%%%%%%%%%%%%%%%%%%%%产生新种群%%%%%%%%%%%%%%%%%%%%%%%%%%
    f1=[Sortf,NSortf];                %子代和父代合并
    FIT1=[SortFIT,NSortFIT];       %子代和父代的适应度值合并
    [SortFIT1,Index]=sort(FIT1);    %适应度按升序排列
    Sortf1=f1(:,Index);               %按适应度排列个体
    SortFIT=SortFIT1(1:NP);         %取前NP个适应度值
    Sortf=Sortf1(:,1:NP);             %取前NP个个体
    trace(gen)=SortFIT(1);           %历代最优适应度值
    disp(['迭代次数:',num2str(gen)]);
end
Bestf=Sortf(:,1);                     %最优个体 
trace(end)                            %最优值
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

weights = Bestf; 

这里的损失函数func可自定义

这里举一个MSE的例子

function fitness = func(weights,y1,y2,y3,Y)
    y = [y1,y2,y3];         %y1,y2,y3为列向量
    y_pre = weights' .*y;
    y_pre = sum(y_pre,2);    %按列相加
    original_loss = sum((y_true - y_pred).^2) / length(y_true);
     %% 限制权重相加为1
     a = sum(weights);
    if abs(a - 1) > 0
        penalty =abs(a -1)^2;
        value = original_loss + penalty;
    else
        value = original_loss;
    end
end

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值