如何检查成本函数是凹面还是凸面?

时间:2015-11-19 08:10:59

标签: matlab cluster-analysis som convex-optimization concave

Self Organising Map Cost Function

如何检查此成本函数是凹还是凸?我也想知道这是否有一个或多个最小值。

努力;

   function [w,pi,costvalue] = main_cost(inputdata, tmax,   alpha_ini,somrow,somcol)
   %main cost function; To get cost value for all possible random weights
   %Input:
   %inputdata : Data sample
   %tmax : Maximum Iteraitions - This determines the number of generated
   %random w and pi with cost function computation for each set. 
   %alpha_ini : The learning rate
   %Somrow,somcol : map size 

   %Output
   %w: Som weights 
   %pi: Global weights
   %costvalue: cost for a set of w,pi and input data

   %Example
   %load expdata_normalized;
   %[w,pi,costvalue]=main_cost(expdata_normalized,500,0.1,5,5);

   N = somrow * somcol; %all neurons
   Dimension = size(inputdata,2);%input data dimension
   % Get the corresponding 2D locations of the N neurons on the map
  [u(:,1) u(:,2)] = ind2sub([somrow somcol], 1:N);
  alpha = alpha_ini; %set initial learning rate

  %set map effective width
  sigma_ini = 2;
  sigma = sigma_ini;


  %initialise costvalues
  costval=zeros(1,tmax);

  %for 1 to max iterations
  for t = 1:tmax
  tic
 %generate random SOM weights
 w{t} = round(rand(N,Dimension),1);
 %generate random Global weights
 pi{t} = round (rand(1,Dimension),1);

% For 1 to all samples in the data
for j = 1:size(inputdata,1) 
   % Pick a single sample
    samplei = inputdata(j,:);
   % make global weight same dimension with SOM weights
    pirepmat = repmat(pi{t},N,1);
    % determine the winning node, from weights at iter(t) to picked
    % sample
    bmu = part1_closestNeuron(samplei, w{t},1,pirepmat);
    % calculate neighbourhood for SOM at iter (t)
    for k = 1:size(w{t},1)
        neighbourhoodF = exp(-eucdist(u(bmu,:),u(k,:), somrow, somcol, 1)^2 / (2*sigma^2));
        allneighbourhoodF(k)= neighbourhoodF;
    end
    % now get cost value with; inputdata(all-static), Somweights at
    % iter(t), and Global weights at iter(t)
    costval(t) = costval(t)+CostFunction_iter(inputdata, w{t},pi{t},allneighbourhoodF);
end
toc
end
costvalue = costval;
end

我在上面的代码中尝试做的是获取随机权重值作为上述成本函数的输入,然后计算那些随机输入的成本值,如果我找到多个最低成本,则样本不会改变,然后确认我的成本函数不凸。

我的代码与我在问题中发布的成本函数略有不同,因为我有一个额外的输入。作为我的实现的输出,我有不同权重的成本值对我的样本,现在我无法想象这个。

2 个答案:

答案 0 :(得分:2)

你需要了解凸性是什么。对于简短版本check Wikipedia

有关更详细的版本,我建议使用Boyd关于凸优化的课程this lecture 2this lecture 3。该课程的开头部分介绍了一组用于识别/检查凸性的有用数学。

如果函数凸,则可以通过查找反例来反驳凸性:

  • 如果是2d或3d,则绘制函数图。
  • 绘制应用于两个随机点的凸组合的函数值,并查找非凸区域。

如果x中存在两个点ya以及[0,1]中的标量a * f(x) + (1-a) * f(y) < f(a*x +(1-a) * y),则会description = ((string[])result[0])[2];(基本上是向下的某个位置)违反了凸性曲线)。

没有反驳凸性是与证明凸性相同!一些证明凸性的方法是:

  • 显示Hessian是半正定的。
  • 直接应用凸性的定义(显示def。满足所有可能性)
  • 通过构造规则显示函数是凸的...例如。一组凸函数的逐点最大值是凸的。等......应用这样的定理。

浏览已发布的图像,标准始终是凸的(定义的结果)。凸函数的总和是凸的,但我不知道K是什么......

答案 1 :(得分:1)

您无法通过模拟检查此内容。

通过查看成本函数的衍生工具,凸性是您需要在纸上查看的属性。这绝对需要数学,而不是matlab示例模拟。