[英]Matlab - Least Squares data fitting - Cost function with extra constraint
我目前正在按照本文介紹的方法,對一些MatLab代碼進行處理,以使實驗數據適合指數總和。
根據該論文,數據必須遵循以下方程式(用偽代碼編寫):
y = sum(v(i)*exp(-x/tau(i)),i=1..n)
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);
例如,它沒有最小化積分(累加)錯誤,而是最小最大值。
您還可以通過以下方式使此約束更嚴格
if res_2 > some_number
k = a_very_big_number;
else
k=0; % or k = a_small_number
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.