2016-02-19 73 views
3

我有一個函數J(x,y,z),它給出了這些座標的結果。這個函數是凸的。我需要的是找到這個巨大矩陣的最小值。 起初,我試圖循環所有的人,計算然後搜索最小功能,但這需要太長時間...通過使用小矩陣在一個巨大的凸矩陣中的全局最小值

所以我決定利用凸性。 Visual example

取一個隨機的(現在)一組座標,這將是我的小3x3x3矩陣的中心,找到局部最小值並使其成爲下一個矩陣的中心。這將持續到我們達到全球最低水平。

的另一個問題是,該功能不完全凸的,所以這個問題可能會出現以及

fake and real min

所以我想控制措施,當它發現一個假最低,增加搜索範圍來確保它。 你會如何建議我一起去?這種方法好嗎?還是我應該看看別的東西?

這是我自己開始的事情,但我對Matlab很新,我不確定如何繼續。

clear all 
clc 
min=100; 

%the initial size of the search matrix 2*level +1 
level=1; 
i=input('Enter the starting coordinate for i (X) : '); 
j=input('Enter the starting coordinate for j (Y) : '); 
k=input('Enter the starting coordinate for k (Z) : '); 

for m=i-level:i+level 
    for n=j-level:j+level 
     for p=k-level:k+level 
      A(m,n,p)=J(m,n,p); 
      if A(m,n,p)<min 
       min=A(m,n,p); 
      end 
     end 
    end 
end 
display(min, 'Minim'); 

[r,c,d] = ind2sub(size(A),find(A ==min)); 

display(r,'X'); 
display(c,'Y'); 
display(d,'Z'); 

任何指導,改進和建設性的批評表示讚賞。提前致謝。

+2

您是否嘗試過使用MATLAB的優化工具箱來查找最低... fminunc或fmincon?你有沒有嘗試其他算法,如梯度下降,共軛梯度?你能在這裏做什麼和不能做什麼?小提示:您提供的第一張圖片來自Andrew Ng的Coursera機器學習課程。 – rayryeng

+2

我非常確定您的意思是「當地最低」的「假全球最低」。 –

+0

[Finding global extrema](https://en.wikipedia。org/wiki/Global_optimization)是一個包含數學和計算機科學全部領域的問題。因此,這個網站可能太廣泛了。雖然鏈接的文章提供了一些好的地方。 – MooseBoys

回答

1

嘗試fminsearch,因爲它相當一般且易於使用。如果你可以匿名指定你的功能,這特別容易。例如:

aFunc = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2

然後使用fminsearch

[x,fval] = fminsearch(aFunc, [-1.2, 1]);

如果您的3維函數,J(X,Y,Z),可以匿名或作爲常規函數來描述,那麼你可以試試fminsearch。輸入需要一個向量,因此您需要將函數寫爲J(X),其中X是長度爲3的向量,因此x = X(1),y = X(2),z = X(3)

fminseach可能會失敗,特別是如果起點不在解決方案附近。改進初始起點通常會更好。例如,下面的代碼在起始矢量周圍對補丁進行採樣,並且通常會提高找到全局最小值的機會。

% deltaR is used to refine the start vector with scatter min search over 
% region defined by a path of [-deltaR+starVec(i):dx:deltaR+startVec(i)] on 
% a side. 
% Determine dx using maxIter. 
maxIter = 1e4; 
dx = max((2*deltaR+1)^2/maxIter, 1/8); 
dim = length(startVec); 
[x,y] = meshgrid([-deltaR:dx:deltaR]); 

xV = zeros(length(x(:)), dim); 

% Alternate patches as sequential x-y grids. 
for ii = 1:2:dim 
    xV(:, ii) = startVec(ii) + x(:); 
end 
for ii = 2:2:dim 
    xV(:, ii) = startVec(ii) + y(:); 
end 

% Find the scatter min index to update startVec. 
for ii = 1: length(xV) 
    nS(ii)=aFunc(xV(ii,:)); 
end 
[fSmin, iw] = min(nS); 
startVec = xV(iw,:); 
fSmin = fSmin 
startVec = startVec 

[x,fval] = fminsearch(aFunc, startVec); 

You can run a 2 dimensional test case f(x,y)=z on AlgorithmHub。該應用程序在Octave中運行上述代碼。您也可以從這個網站編輯內聯功能(甚至可以嘗試您的問題)。