曲线的线性组合以匹配单个曲线

时间:2012-12-23 15:39:37

标签: matlab wolfram-mathematica

我有一组向量(长度为50,基本上是一组曲线),我想尝试匹配另一条单曲线(向量)并获得第一组中每个向量的系数以匹配第二条曲线曲线。系数需要> = 0.0。即,第一组曲线的线性组合以匹配单曲线。我应该朝哪个方向寻求帮助。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你有一组曲线 enter image description here 您希望与缩放因子相乘的每一个,以便它再现一些目标曲线 enter image description here 尽可能接近。

使用线性最小二乘逼近很容易做到这一点。

%# create some sample curves
x = -10:0.1:10;
g1 = exp(-(x-3).^2/4);
g2 = exp(-(x-0).^2/4);
g3 = exp(-(x+2).^2/4);

%# make a target curve, corrupt with noise
y = 2*g1+4*g2+g3+randn(size(x))*0.2;

%# use the `ldivide` operator to solve an equation of the form
%# A*x=B
%# so that x (=fact here) is x=A^-1*B or, in Matlab terms, A\B
%# note the transposes, A should be a n-by-3 array, B a n-by-1 array
%# so that x is a 3-by-1 array of factors
fact = [g1;g2;g3]'\y'

fact =

    1.9524
    3.9978
    1.0105

%# Show the result

figure,plot(x,y)
hold on,plot(x,fact(1)*g1+fact(2)*g2+fact(3)*g3,'m')

enter image description here

答案 1 :(得分:0)

这就是他的意思! mathematica版本..

x = Table[i, {i, -10, 10, .1}];
basis = { 
        Exp[-(# - 3)^2/4] & /@ x,
        Exp[-(# - 0)^2/4] & /@ x,
        Exp[-(# + 2)^2/4] & /@ x
    };
Show[
     ListPlot[Table[{x[[i]], #[[i]]}, {i, Length[x]}] ,
              Joined -> True , PlotStyle -> Hue [Random[]]] & /@ basis ]
y = Table [ 2 basis[[1, i]] + 4 basis[[2, i]] + basis[[3, i]] +
               RandomReal[{.5, .5}] ,{i, Length[x]}];
dataplot = ListPlot[Table[{x[[i]], y[[i]]}, {i, Length[x]}] ]

如果您只是解决一个未确定的系统,mathematica不会神奇地做最小二乘,所以明确找到最小平方结果:

coefs = FindMinimum[
              Total[(#^2 & /@ (Sum[a[k] basis[[k]] , {k, Length[basis]}]-y) )],
              Array[a, Length[basis]]][[2]]
Show[dataplot, 
      ListPlot[i = 0; {x[[++i]], #} & /@ 
            (Sum[a[k] basis[[k]] , {k, 3}] /. coefs), 
            Joined -> True]]

请注意,如果您希望将系数限制为> = 0,则可以简单地将公式中的值平方为:

coefs = FindMinimum[
             Total[(#^2 & /@ 
              (Sum[a[k]^2 basis[[k]] , {k, Length[basis]}]-y) )],
             Array[a, Length[basis]]][[2]]
Show[dataplot, 
      ListPlot[i = 0; {x[[++i]], #} & /@
              (Sum[a[k]^2 basis[[k]] , {k, 3}] /. coefs), 
              Joined -> True]]
如果实际的最佳拟合想要具有负值,那么你将得到可预测的差的结果。