0

我有许多不同的数据集,它们是离散数据。局部最小值不一定是最小数据,但它是第一个峰值周围的谷值。我试图找到第一个峰值周围的第一个山谷的指数。我的想法是搜索两个相邻点之间的差异,当差异小于某个临界值并且前向点大于后向点时,这就是我们想要的点。例如

for k=PEAK_POS:END_POS
  if ( (abs(y(k)-y(k-1))<=0.01) && (y(k-1)>y(k)) )
    expected_pos = k;
    break;
  end
end

这适用于某些数据集,但不适用于所有数据集,因为某些数据集可能具有不同的样本步骤,因此我们可能会更改临界条件,但我有太多数据集要分析,我认为我无法手动分析每个数据集。我正在寻找任何更好的方法来找到最小值。谢谢。

4

3 回答 3

1

正如@JakobS.所提到的,优化理论是数学中的一个大领域,有自己的期刊和会议等等。

您的问题听起来不够复杂,不足以证明优化工具箱的合理性(如果我错了,请纠正我)。听起来fminsearch足以满足您的需求。这是一个简短的教程。键入help fminsearchdoc fminsearch了解更多信息。

% example cost function to minimize
z = @(x) sin(x(:,1)).*cos(x(:,2));

% Make a plot 
x = -pi:0.01:pi;
y = x;
[x,y] = meshgrid(x,y);
figure(1), surf(x,y, reshape(z([x(:) y(:)]), size(x)), 'edgecolor', 'none')

% find local minimum
[best, fval] = fminsearch(z, [pi,pi])

结果是

best =
     1.570819831365890e+00     3.141628097071647e+00
fval =
    -9.999999990956473e-01

这显然是对预期局部最优值的非常合理的近似。

于 2012-08-09T06:58:17.800 回答
0

我会使用以下条件:在最小值的左侧,其导数<0,右侧>0。

就像在这个例子中一样:

x = cumsum(rand(1,100));  % nonuniform distance
y = 5*sin(x/10)+randn(size(x)); % example data
dd = diff(y);
ig = [false (dd(1:end-1)<0 & dd(2:end)>0) false]; % patch to correct length
plot(x,y)
line(x(ig),y(ig),'Marker','+','LineStyle','none','Color','r')

正如您所说,您希望在高峰之后的第一个:

x_peak = 15;
candidates = x(ig);
i_min=find(candidates>x_peak,1,'first');
candidates(i_min)
于 2012-08-09T10:27:50.847 回答
0

优化问题是一个非常广泛的话题,并且已经做了很多,开始编写自己的算法不一定是一个好主意。对于 matlab,有优化工具箱,可能会有所帮助: http: //www.mathworks.de/products/optimization/

于 2012-08-09T06:31:00.023 回答