查看: 2826|回复: 24|关注: 0

[已解决] 遗传算法拟合最小二乘问题

[复制链接]

新手

11 麦片

财富积分


050


7

主题

33

帖子

0

最佳答案
本帖最后由 zhanghaha 于 2017-11-16 20:17 编辑

各位前辈你们好o(* ̄▽ ̄*)ブ
本人近期正在尝试使用遗传算法进行数据拟合,拟合目标公式为:
P=((a/x(1)).^4)./((1-(a/x(2)).^2).^4+(a/x(1)).^4)*x(3).*(1+4*x(4)^2*(a/x(5)).^2)./((1-(a/x(5).^2).^2+(2*x(4)*a/x(5)).^2))
其中参数为x(1)-x(5)为识别参数,a为已知数据点;
需要求得x(1)-x(5)的理论数据值;
-----------------------------------------------------------------
目前基于最小二乘法的适应度评估代码如下:
function f =GA_danfeng(x)
load w;load ps;
a=w;    %频率点
b=ps;   %地震波对应的目标功率谱
f1=((a/x(1)).^4)./((1-(a/x(2)).^2).^4+(a/x(1)).^4)*x(3).*(1+4*x(4)^2*(a/x(5)).^2)./((1-(a/x(5).^2).^2+(2*x(4)*a/x(5)).^2));   %拟合公式
f2=(f1-b).^2;   %差的平方  
f=0;      %赋初始值
    for i=1:length(w)
        f=f+f2(i);   %平方之和(最小二乘)
    end
end
运行代码所需的数据w和ps见附件
--------------------------------------------------------------------------
基于遗传算法的运行程序代码如下:
fitnessfcn= @GA_danfeng;             %适应度函数句柄
nvars=5;                             %个体所含变量数目
lb=[0,0,0,0,0];                      %下限
ub=[inf,inf,inf,1,inf];              %上限
options = gaoptimset ('PopulationSize',40,'EliteCount',5,'CrossoverFraction',0.75,'MigrationFraction',0.1,'Generations',200,'StallGenLimit',200,'TolFun',1e-100,'PlotFcns',{@gaplotbestf,@gaplotbestindiv});     %设置参数   
[x_best,fval]=ga(fitnessfcn,nvars,[],[],[],[],lb,ub,[],options);     %调用函数ga



麻烦各位前辈指正!!!!
问题:(1)对于这个复杂的非线性函数,是否可以用ga函数来拟合?
(2)拟合精度不高,与原始谱差别较大,请问可以用其他函数做全局最优拟合吗?
(3)拟合时mean值没有变化,适应度值成一条直线。为甚么?
(4)这个程序是不是哪边有问题啊。。。。。


w.mat

8.29 KB, 下载次数: 1

频率点

ps.mat

10.65 KB, 下载次数: 0

目标功率谱值

MATLAB 基础讨论
版块优秀回答者

入门

129 麦片

财富积分


50500


10

主题

205

帖子

25

最佳答案
  • 关注者: 3
发表于 2017-11-16 21:46:31 | 显示全部楼层
遗传算法做数据拟合是可以的,我给你一个粒子群的例子
function x_opt = PSO_ExpFit2(t, Et)
%{
函数功能:压缩因子粒子群算法实现指数拟合:y = a1*exp(-x/b1) + a2*exp(-x/b2) + c
输入:
  t:自变量;
  Et:因变量;
输出:
  x_opt:最优解;
调用格式:
clear;clc;
t = 0.2*(1:3000)';
data = 400*exp(-t/5) + 600*exp(-t/200) + 10*rand(size(t));
tic;
p = PSO_ExpFit2(t, data)
toc;
fit = p(1)*exp(-t/p(2)) + p(3)*exp(-t/p(4)) + p(5);
plot(t, data, t, fit, 'LineWidth', 2)
legend('model', 'PSO');
%}
% 初始值
D = 5;                      % 粒子维度,未知数个数;
IterMax = 500;      % 最大迭代次数;
Vmin = -1;               % 速度最小值;
Vmax = 1;               % 速度最大值;
c1 = 2.05;               % 学习因子1,认知部分;
c2 = 2.05;               % 学习因子2,社会部分;
N = 100;               % 种群个数;
Xmin = [0, -2, 0, -2, 0];    % 下限
max_sig = max(Et);
Xmax = [1.5*max_sig, 4, 1.5*max_sig, 4, 0.5*max_sig];  % 上限;
% 计算
phy = c1 + c2;
lamda = 2 / abs(2 - phy - sqrt(phy^2 - 4*phy));   % 压缩因子
% 初始化种群个体(限定位置和速度)
x = rand(N, D).*repmat(Xmax - Xmin, N, 1) + repmat(Xmin, N, 1);
v = rand(N, D)*(Vmax - Vmin) + Vmin;
% 初始化个体最优位置和最优值
p = x;
pbest = ones(1, N);
for i = 1 : N
   pbest(i) = Obj_Fit(x(i, :), t ,Et);
end
% 初始化全局最优位置和最优值
g = ones(1, D);
gbest = inf;
for i = 1 : N
   if pbest(i) < gbest
      g = p(i, :);
      gbest = pbest(i);
   end
end
% 迭代直到满足精度或者迭代次数
fx = zeros(1, N);
for i = 1 : IterMax
   for j = 1 : N
      % 更新个体最优位置和最优值
      fx(j) = Obj_Fit(x(j, :), t ,Et);
      if fx(j) < pbest(j)
         p(j, :) = x(j, :);
         pbest(j) = fx(j);
      end
      % 更新全局最优位置和最优值
      if pbest(j) < gbest
         g = p(j, :);
         gbest = pbest(j);
      end
      % 更新位置和速度值  
      v(j, :) = lamda*v(j, :) + c1*rand*(p(j, :) - x(j, :)) + c2*rand*(g - x(j, :));
      x(j, :) = x(j, :) + v(j, :);
      % 边界条件处理
      for ii = 1 : D
         if (v(j, ii) > Vmax) || (v(j, ii) < Vmin)
            v(j, ii) = rand*(Vmax - Vmin) + Vmin;
         end
         if (x(j, ii) > Xmax(ii)) || (x(j, ii) < Xmin(ii))
            x(j, ii) = rand*(Xmax(ii) - Xmin(ii)) + Xmin(ii);
         end
      end
   end
end
x_opt = g;
x_opt(2) = 10^(x_opt(2));
x_opt(4) = 10^(x_opt(4));
end

% 目标函数
function fitError = Obj_Fit(p0, t ,Et)
A1 = p0(1);
B1 = p0(2);
A2 = p0(3);
B2 = p0(4);
A0 = p0(5);
f = A1*exp(-t/10^B1) + A2*exp(-t/10^B2) + A0;  
fitError = norm(Et - f);
end

新手

11 麦片

财富积分


050


7

主题

33

帖子

0

最佳答案
 楼主| 发表于 2017-11-17 00:23:57 | 显示全部楼层
1105936347 发表于 2017-11-16 21:46
遗传算法做数据拟合是可以的,我给你一个粒子群的例子
function x_opt = PSO_ExpFit2(t, Et)
%{

您好,主要是老师要求我用用遗传算法来拟合,这个程序运行的时候总有些问题,能麻烦您帮我看看是哪部分的原因嘛,真诚的感谢您

论坛优秀回答者

15

主题

1851

帖子

115

最佳答案
  • 关注者: 149
发表于 2017-11-17 08:11:59 | 显示全部楼层 |此回复为最佳答案
x =[-1.197133038  -3.277845487  10.52411306  -0.6406415828  -0.7804673718];
RSS = 147891389.72
MSe = 1.0602e+05
R^2 = 0.47863
数据比较散乱,拟合效果不佳,难于看作是一种规律。
nh1420.png

新手

11 麦片

财富积分


050


7

主题

33

帖子

0

最佳答案
 楼主| 发表于 2017-11-17 17:57:47 | 显示全部楼层
stats01 发表于 2017-11-17 08:11
x =[-1.197133038  -3.277845487  10.52411306  -0.6406415828  -0.7804673718];
RSS = 147891389.72
MSe = ...

就是需要这种的,效果已经很好了。请问您这个是怎么拟合出来的?因为我需要处理大量的波,大概有几千条,麻烦前辈可以指导我改下程序。还有一个就是拟合出的x值需要是正数,您这里x的下限应该是-inf吧。

论坛优秀回答者

15

主题

1851

帖子

115

最佳答案
  • 关注者: 149
发表于 2017-11-17 19:09:53 | 显示全部楼层
这里未对x的上下限作限制,若限制都大于0,估计效果不怎么好。

新手

11 麦片

财富积分


050


7

主题

33

帖子

0

最佳答案
 楼主| 发表于 2017-11-17 19:23:42 | 显示全部楼层
stats01 发表于 2017-11-17 19:09
这里未对x的上下限作限制,若限制都大于0,估计效果不怎么好。

这里的参数具有实际物理意义的,我刚刚拟合了一组数据,但是效果比您的差很多

新手

11 麦片

财富积分


050


7

主题

33

帖子

0

最佳答案
 楼主| 发表于 2017-11-17 19:27:35 | 显示全部楼层
jpg.png

新手

11 麦片

财富积分


050


7

主题

33

帖子

0

最佳答案
 楼主| 发表于 2017-11-17 19:29:23 | 显示全部楼层
stats01 发表于 2017-11-17 19:09
这里未对x的上下限作限制,若限制都大于0,估计效果不怎么好。

图片在楼下,麻烦您指导下

新手

11 麦片

财富积分


050


7

主题

33

帖子

0

最佳答案
 楼主| 发表于 2017-11-17 19:32:43 | 显示全部楼层
stats01 发表于 2017-11-17 19:09
这里未对x的上下限作限制,若限制都大于0,估计效果不怎么好。

拟合图片在楼下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表