【问题标题】:Global minimum in a huge convex matrix by using small matrices使用小矩阵在一个巨大的凸矩阵中的全局最小值
【发布时间】:2016-02-19 22:14:52
【问题描述】:

我有一个函数 J(x,y,z) 给我这些坐标的结果。这个函数是凸的。我需要的是找到这个巨大矩阵的最小值。 起初我试图遍历所有这些,计算然后用 min 函数搜索,但这需要太长时间......

所以我决定利用凸性。

取一组随机(暂时)坐标,这将是我的小 3x3x3 矩阵的中心,找到局部最小值并使其成为下一个矩阵的中心。这将持续到我们达到全球最小值。

另一个问题是函数不是完全凸的,所以也会出现这个问题

所以我正在考虑一种控制措施,当它找到一个虚假的最小值时,增加搜索范围以确保它。 你会建议我怎么做?这种方法好吗?还是我应该看看别的?

这是我自己开始的,但我对 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');

感谢任何指导、改进和建设性的批评。提前致谢。

【问题讨论】:

  • 您是否尝试过使用 MATLAB 的优化工具箱来找到最小值...fminuncfmincon?您是否尝试过其他算法,例如梯度下降、共轭梯度?你在这里可以做什么和不能做什么?小提示:您提供的第一张图片来自 Andrew Ng 的 Coursera 机器学习课程。
  • 我很确定“假全局最小值”是指“局部最小值”。
  • Finding global extrema 是一个涵盖整个数学和计算机科学领域的问题。因此,对于该站点而言,它可能过于宽泛。链接的文章提供了一些很好的起点。
  • @rayryeng 确实,图片来自他的课程,这就是我在脑海中看到的样子。应该有可能附上来源。正如我所提到的,我对 Matlab 还很陌生,在进入代码本身之前可能应该进行更多研究
  • 另外,不要调用你的变量min,这将覆盖内置的min() 函数。由于虚数单位,也不鼓励使用ij

标签: algorithm matlab matrix


【解决方案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 中运行上述代码。您也可以从此网站编辑内联函数(甚至可以尝试您的问题)。

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2014-10-16
    • 2012-04-16
    • 2018-10-14
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多