Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Matlab-最小二乘数据拟合-带额外约束的代价函数_Algorithm_Matlab_Least Squares_Data Fitting - Fatal编程技术网

Algorithm Matlab-最小二乘数据拟合-带额外约束的代价函数

Algorithm Matlab-最小二乘数据拟合-带额外约束的代价函数,algorithm,matlab,least-squares,data-fitting,Algorithm,Matlab,Least Squares,Data Fitting,我目前正在编写一些MatLab代码,按照中描述的方法将实验数据拟合成指数和 根据本文,数据必须遵循以下等式(以伪代码编写): 这里tau(i)是一组n预定义常数。常数的数量还决定了求和的大小,从而决定了v的大小。例如,我们可以尝试拟合100个指数的总和,每个指数都有不同的tau(i)。然而,由于拟合和指数和的性质,我们需要为问题添加另一个约束,从而为所使用的最小二乘法的成本函数添加约束 通常,最小二乘法的成本函数由下式给出: (y_data - sum(v(i)*exp(-x/tau(i)),i

我目前正在编写一些MatLab代码,按照中描述的方法将实验数据拟合成指数和

根据本文,数据必须遵循以下等式(以伪代码编写):

这里
tau(i)
是一组
n
预定义常数。常数的数量还决定了求和的大小,从而决定了
v
的大小。例如,我们可以尝试拟合100个指数的总和,每个指数都有不同的
tau(i)
。然而,由于拟合和指数和的性质,我们需要为问题添加另一个约束,从而为所使用的最小二乘法的成本函数添加约束

通常,最小二乘法的成本函数由下式给出:

(y_data - sum(v(i)*exp(-x/tau(i)),i=1..n)^2
这必须最小化。然而,为了防止过度拟合,这会使时间常数频谱变得非常嘈杂,本文在成本函数中添加了以下约束:

|v(i) - v(i+1)|^2
由于这个额外的约束,据我所知,常规算法,如
lsqcurvefit
不再可用,我必须使用
fminsearch
来搜索带有约束的最小二乘代价函数的最小值。根据我的说法,必须最小化的功能如下:

(y_data - sum(v(i)*exp(-x/tau(i)),i=1..n)^2 + sum(|v(j) - v(j+1)|^2,j=1..n-1)
我尝试在MatLab中编写以下代码。最初,我们在函数脚本中定义函数,然后使用
fminsearch
实际最小化函数并获取
v
的值

function res = funcost( v )
%FUNCOST Definition of the function that has to be minimised

%We define a function yvalues with 2 exponentials with known time-constants
% so we know the result that should be given by minimising.
xvalues = linspace(0,50,10000);
yvalues = 3-2*exp(-xvalues/1)-exp(-xvalues/10);

%Definition of 30 equidistant point in the logarithmic scale  
terms = 30;
termsvector = [1:terms];
tau = termsvector;
for i = 1:terms
    tau(i) = 10^(-1+3/terms*i);
end

%Definition of the regular function
res_1 = 3;

for i=1:terms
    res_1 =res_1+ v(i).*exp(-xvalues./tau(i));
end

res_1 = res_1-yvalues;

%Added constraint
k=1;
res_2=0;

for i=1:terms-1
    res_2 = res_2 + (v(i)-v(i+1))^2;
end

res=sum(res_1.*res_1) + k*res_2;

end

fminsearch(@funcost,zeros(30,1),optimset('MaxFunEvals',1000000,'MaxIter',1000000))

但是,该代码给了我不准确的结果(没有错误,只是不准确的结果),这让我相信我在编码或解释最小二乘法的附加约束时犯了错误。

我将尝试以下方式引入附加约束:

res_2 = max((v(1:(end-1))-v(2:end)).^2);
e、 g.它不是最小化集成(汇总)错误,而是最小化最大值

也可以通过以下方式使此约束变硬:

if res_2 > some_number
    k = a_very_big_number;
else
    k=0; % or k = a_small_number
end;

我将尝试以以下方式引入附加约束:

res_2 = max((v(1:(end-1))-v(2:end)).^2);
e、 g.它不是最小化集成(汇总)错误,而是最小化最大值

也可以通过以下方式使此约束变硬:

if res_2 > some_number
    k = a_very_big_number;
else
    k=0; % or k = a_small_number
end;

你怎么知道你得到的结果是不准确的?我现在使用的函数来生成x和y值,以适应,3-2*exp(-t)-exp(-t/10),对于tau=1和tau=10,应该产生增加的v振幅。然而,当我最小化这个函数和绘图(tau,v)时,情况并非如此。如果你没有在成本函数中添加额外的项,情况就是这样。此外,fminsearch是一个局部优化器,解决方案可能具有不同于全局最小值的局部最小值。注释掉额外的术语,并给出接近v(i=10)=-2和v(i=20)=-1的输入谢谢你的建议!可能是这样(局部最小值不同于全局最小值)!如果我把额外的术语注释掉,我会得到一个适合数据的解决方案。然而,时域振幅非常嘈杂(在某些情况下约为2000-4000),并且切换符号非常频繁。本文中也提到了这一点,即必须包括约束以防止出现这种情况。因为指数不构成正交基,我认为不会有唯一的解决方案,所以我认为需要约束。你怎么知道得到的结果不准确?我现在使用的函数生成x和y值,以适应,3-2*exp(-t)-exp(-t/10),对于tau=1和tau=10,应产生增加的v振幅。然而,当我最小化这个函数和绘图(tau,v)时,情况并非如此。如果你没有在成本函数中添加额外的项,情况就是这样。此外,fminsearch是一个局部优化器,解决方案可能具有不同于全局最小值的局部最小值。注释掉额外的术语,并给出接近v(i=10)=-2和v(i=20)=-1的输入谢谢你的建议!可能是这样(局部最小值不同于全局最小值)!如果我把额外的术语注释掉,我会得到一个适合数据的解决方案。然而,时域振幅非常嘈杂(在某些情况下约为2000-4000),并且切换符号非常频繁。本文中也提到了这一点,即必须包括约束以防止出现这种情况。因为指数不构成正交基,我相信不会有唯一的解,所以我认为需要约束。谢谢你的建议!我会尽快试用它(程序目前正在运行一些不同的值,所以不能马上试用)。如果有帮助,我会告诉你的!试过了!这很有帮助(代码速度更快,正如预期的那样,我在tau=10时得到了一个可见的峰值)。但是,1处的峰值几乎不可见,这也可能是由于在10^-2..10^0范围内,该点可见的点数较少。虽然拟合对于较低的时间常数也不是很好(例如,t=0时不为0),这可能是由于拟合的性质。感谢您的建议!我会尽快试用它(程序目前正在运行一些不同的值,所以不能马上试用)。如果有帮助,我会告诉你的!试过了!这很有帮助(代码速度更快,正如预期的那样,我在tau=10时得到了一个可见的峰值)。但是,1处的峰值几乎不可见,这也可能是由于在10^-2..10^0范围内,该点可见的点数较少。虽然拟合对于较低的时间常数也不是很好(例如,对于t=0,拟合不到0),这可能是由于拟合的性质。