Matlab 与单个曲线匹配的曲线的线性组合

Matlab 与单个曲线匹配的曲线的线性组合,matlab,wolfram-mathematica,Matlab,Wolfram Mathematica,我有一组向量(长度为50,基本上是一组曲线),我想尝试匹配另一条曲线(向量),并获得第一组向量中每个向量的系数,以匹配第二条曲线。系数必须大于等于0.0。即,第一组曲线的线性组合,以匹配单个曲线。我应该朝哪个方向走的任何帮助都会很有帮助。如果我理解正确,您有一组曲线 每一条曲线都要乘以一个比例因子,这样它就可以复制一些目标曲线 尽可能接近 这是很容易做到的线性最小二乘近似 %# create some sample curves x = -10:0.1:10; g1 = exp(-(x-3).^

我有一组向量(长度为50,基本上是一组曲线),我想尝试匹配另一条曲线(向量),并获得第一组向量中每个向量的系数,以匹配第二条曲线。系数必须大于等于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')

如果我理解正确,您有一组曲线 每一条曲线都要乘以一个比例因子,这样它就可以复制一些目标曲线 尽可能接近

这是很容易做到的线性最小二乘近似

%# 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')
他就是这个意思!。。 数学版

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]}] ] x=表[i,{i,-10,10,1}]; 基={ Exp[-(#-3)^2/4]&/@x, Exp[-(#-0)^2/4]&/@x, Exp[-(#+2)^2/4]&/@x }; 展示[ 列表图[表[{x[[i]],#[[i]},{i,长度[x]}], 合并->真,打印样式->色调[随机[]]&/@basis] y=表[2基础[[1,i]]+4基础[[2,i]]+3基础[[3,i]]+ 随机实数[{.5,5}],{i,长度[x]}]; dataplot=ListPlot[表[{x[[i]],y[[i]},{i,长度[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]] coefs=findminium[ 总计[(^2&/@(和[k]基[[k]],{k,长度[k]}]-y]), 数组[a,长度[基]][[2]] 显示[数据图, 列表图[i=0;{x[++i]],#}&/@ (和[a[k]基[[k]],{k,3}]/.coefs), 已加入->正确]] 注意:如果您希望将系数限制为>=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]] coefs=findminium[ 总计[(^2&/@ (和[a[k]^2基[[k]],{k,长度[基]}]-y)), 数组[a,长度[基]][[2]] 显示[数据图, 列表图[i=0;{x[++i]],#}&/@ (和[a[k]^2基[[k]],{k,3}]/.coefs), 已加入->正确]] 如果实际的最佳拟合值为负值,你会得到预期的糟糕结果。

所以这就是他的意思!。。 数学版

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]}] ] x=表[i,{i,-10,10,1}]; 基={ Exp[-(#-3)^2/4]&/@x, Exp[-(#-0)^2/4]&/@x, Exp[-(#+2)^2/4]&/@x }; 展示[ 列表图[表[{x[[i]],#[[i]},{i,长度[x]}], 合并->真,打印样式->色调[随机[]]&/@basis] y=表[2基础[[1,i]]+4基础[[2,i]]+3基础[[3,i]]+ 随机实数[{.5,5}],{i,长度[x]}]; dataplot=ListPlot[表[{x[[i]],y[[i]},{i,长度[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]] coefs=findminium[ 总计[(^2&/@(和[k]基[[k]],{k,长度[k]}]-y]), 数组[a,长度[基]][[2]] 显示[数据图, 列表图[i=0;{x[++i]],#}&/@ (和[a[k]基[[k]],{k,3}]/.coefs), 已加入->正确]] 注意:如果您希望将系数限制为>=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]] coefs=findminium[ 总计[(^2&/@ (和[a[k]^2基[[k]],{k,长度[基]}]-y)), 数组[a,长度[基]][[2]] 显示[数据图, 列表图[i=0;{x[++i]],#}&/@ (和[a[k]^2基[[k]],{k,3}]/.coefs), 已加入->正确]]
如果实际的最佳拟合值为负值,则结果会很差。

术语含糊不清。你说的曲线(向量)是什么意思?什么样的曲线,样条曲线还是??。输入和预期输出的一个例子将有助于考虑红绿光和波长的光强度曲线(x轴400~700 nm,在某些增量,即1nm)。目标光(强度与波长的曲线)通过线性组合将三个光与目标光匹配(获得系数或三个灯中的每一个,以构成与目标光的拟合)是矢量集的基础吗?你要匹配的曲线是在那个基础的跨度内吗?或者,你想得到某种“最佳拟合”吗?我想得到一个或多个向量集的缩放组合与单个向量的最佳拟合。我想从计算的输出中得到集合中每个向量的比例因子。这些值必须大于等于0(没有负比例,但0.0是一个可能的值)。我建议你用一种更数学的方式来描述你的问题?模糊的术语。你说的曲线(向量)是什么意思?什么样的曲线,样条曲线还是??。输入和预期输出的一个例子将有助于考虑红绿光和波长的光强度曲线(x轴400~700 nm,在某些增量,即1nm)。目标光(强度与波长的曲线)通过线性组合将三个光与目标光匹配(获得系数或三个灯中的每一个,以构成与目标光的拟合)是矢量集的基础吗?你要匹配的曲线是在那个基础的跨度内吗?或者,你想得到某种“最佳拟合”吗?我想得到一个或多个向量集的缩放组合与单个向量的最佳拟合。我想从计算的输出中得到集合中每个向量的比例因子。这些值必须大于等于0(没有负比例,但0.0是一个可能的值)我可以建议你用更数学的方式来描述你的问题吗?@user19251