我有一组向量(长度为50,基本上是一组曲线),我想尝试匹配另一条单曲线(向量)并获得第一组中每个向量的系数以匹配第二条曲线曲线。系数需要> = 0.0。即,第一组曲线的线性组合以匹配单曲线。我应该朝哪个方向寻求帮助。
答案 0 :(得分:0)
如果我理解正确,你有一组曲线 您希望与缩放因子相乘的每一个,以便它再现一些目标曲线 尽可能接近。
使用线性最小二乘逼近很容易做到这一点。
%# 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')
答案 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]]如果实际的最佳拟合想要具有负值,那么你将得到可预测的差的结果。