1

我有一组向量(长度为 50,本质上是一组曲线),我想尝试匹配另一条曲线(向量)并获得第一组中每个向量的系数以匹配第二条曲线。系数必须 >= 0.0 。即,第一组曲线的线性组合以匹配单条曲线。我应该朝哪个方向提供任何帮助都会有所帮助。

4

2 回答 2

1

如果我理解正确,您有一组曲线 在此处输入图像描述 ,您希望将每条曲线与一个比例因子相乘,以便它 在此处输入图像描述 尽可能接近地再现一些目标曲线。

这很容易通过线性最小二乘近似来完成。

%# 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')

在此处输入图像描述

于 2012-12-24T16:00:44.447 回答
0

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

x = 表[i, {i, -10, 10, .1}];
基础 = {
        Exp[-(# - 3)^2/4] & /@ x,
        Exp[-(# - 0)^2/4] & /@ x,
        Exp[-(# + 2)^2/4] & /@ x
    };
节目[
     ListPlot[Table[{x[[i]], #[[i]]}, {i, Length[x]}] ,
              加入 -> True , PlotStyle -> Hue [Random[]]] & /@ based ]
y = 表 [ 2 基础[[1, i]] + 4 基础[[2, i]] + 基础[[3, i]] +
               RandomReal[{.5, .5}] ,{i, Length[x]}];
dataplot = ListPlot[表[{x[[i]], y[[i]]}, {i, Length[x]}] ]

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

coefs = FindMinimum [
              总计[(#^2 & /@ (Sum[a[k] based[[k]] , {k, Length[basis]}]-y) )],
              数组[a, 长度[基础]]][[2]]
显示[数据图,
      列表图[i = 0; {x[[++i]], #} & /@
            (和[a[k]基[[k]],{k,3}] /.coefs),
            加入 -> 真]]

请注意,如果您不想将系数限制为 >= 0,如所述,您可以像这样简单地将公式中的值平方:

coefs = FindMinimum [
             总计[(#^2 & /@
              (和[a[k]^2基[[k]], {k, Length[basis]}]-y))],
             数组[a, 长度[基础]]][[2]]
显示[数据图,
      列表图[i = 0; {x[[++i]], #} & /@
              (Sum[a[k]^2 based[[k]] , {k, 3}] /.coefs),
              加入 -> 真]]

如果实际的最佳拟合想要具有负值,您将得到可预见的糟糕结果。

于 2012-12-27T20:37:08.970 回答