我正在嘗試將“mle”與自定義負對數似然函式一起使用,但出現以下錯誤:
請求的 1200000x1200000 (10728.8GB) 陣列超過了最大陣列大小首選項 (15.6GB)。這可能會導致 MATLAB 變得無回應。
我使用的資料是一個 1x1200000 的二進制陣列(我必須將其轉換為雙精度),并且該函式有 10 個引數:一個用于資料、3 個已知引數和 6 個要優化的引數。我嘗試將“OptimFun”設定為“fminsearch”和“fmincon”。此外,使用 'fminsearch' 和 'fminunc' 而不是 'mle' 優化引數也能正常作業。
問題發生在“mlecustom.m”檔案中的“checkFunErrs”函式中(在第 173 行呼叫,在第 705 行出現實際錯誤)。
使用 'fminunc' 我可以計算最佳引數,但它沒有給我置信區間。有沒有辦法繞過這個?還是我做錯了什么?
謝謝您的幫助。
T_1 = 50000;
T_2 = 100000;
npast = 10000;
start = [0 0 0 0 0 0];
func = @(x, data, cens, freq)loglike(data, [x(1) x(2) x(3) x(4) x(5) x(6)],...
T_1, T_2, npast);
params = mle(data, 'nloglf', func, 'Start', start, 'OptimFun', 'fmincon');
% Computes the negative log likehood
function out = loglike(data, params, T_1, T_2, npast)
size = length(data);
if npast == 0
past = 0;
else
past = zeros(1, size);
past(npast 1:end) = movmean(data(npast:end-1),[npast-1, 0]); % Average number of events in the previous n years
end
lambda = params(1) ...
(params(2)*cos(2*pi*(1:size)/T_1)) ...
(params(3)*sin(2*pi*(1:size)/T_1)) ...
(params(4)*cos(2*pi*(1:size)/T_2)) ...
(params(5)*sin(2*pi*(1:size)/T_2)) ...
params(6)*past;
out = sum(log(1 exp(lambda))-data.*lambda);
end
uj5u.com熱心網友回復:
您的問題是內置mle函式的第 228 行(從 MATLAB R2017b 開始),它發生在呼叫自定義函式之前:
data = data(:);
輸入變數data在沒有警告的情況下轉換為列陣列。這樣做通常是為了確保所有進一步的計算對于輸入向量的方向都是穩健的。
但是,這會給您帶來問題,因為您的自定義函式假定data是一個行向量,特別是這一行:
out = sum(log(1 exp(lambda))-data.*lambda);
由于隱式擴展,當行向量lambda和列向量data相互作用時,您會根據錯誤訊息得到一個巨大的方陣。
添加這兩行以明確兩者都是列向量可以解決問題,避免隱式擴展,并按預期應用計算元素。
lambda = lambda(:);
data = data(:);
所以你的函式變成
function out = loglike(data, params, T_1, T_2, npast)
N = length(data);
if npast == 0
past = 0;
else
past = zeros(1,N);
past(npast 1:end) = movmean(data(npast:end-1),[npast-1, 0]); % Average number of events in the previous n years
end
lambda = params(1) ...
(params(2)*cos(2*pi*(1:N)/T_1)) ...
(params(3)*sin(2*pi*(1:N)/T_1)) ...
(params(4)*cos(2*pi*(1:N)/T_2)) ...
(params(5)*sin(2*pi*(1:N)/T_2)) ...
params(6)*past;
lambda = lambda(:);
data = data(:);
out = sum(log(1 exp(lambda))-data.*lambda);
end
另一種方法是重新寫你的函式,以便它使用的列向量,但你創建新的行向量(1:N)的步驟和范圍內的串聯movmean。建議的方法可以說是“懶惰的”,但對行或列輸入也很健壯。
另請注意,我已將您的變數名稱從 更改size為N,因為它size是一個內置函式,您應該避免遮蔽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/402178.html
上一篇:當模塊已被webpack捆綁時,如何從HTML呼叫模塊中的javascript函式?
下一篇:生成具有約束的隨機二元矩陣
