通过强力算法找到正确的参数

时间:2012-04-23 14:56:19

标签: matlab brute-force

我已经实现了一种压缩算法,假设我执行它,调用:

myCompression(data, th)

th 参数是介于0和1之间的实数。有时这可能是非常小的数字,例如212.19e-013。

num = length(myCompression(data, th))

给了我压缩后剩余的数据。如果我希望 num 更大,我需要选择较低的 th 参数。副主席,如果我想要更高的 num ,我必须选择更低的 th

现在问题是:我想找到一个正确的 th ,使 num 等于我选择的目标号码。 如你所知,找到 th 真的很长,我会发现一个蛮力算法找到满足我需要的 th 。我写了这个:

target = 304;
th = 2.49e-011;
num = 0;

while(num~=target)    
    num = length(MCSimplify3(time, latitudes, longitudes, th));
    disp(horzcat('tol: ', num2str(th), ' num: ', num2str(num)));

    if (num>target)
        th = th+(rand()*th);
    else
        th = th-(rand()*th);
    end

    th = abs(th);
end

上一个脚本开始但从未捕获目标。我想这个问题是因为增加或减去(rand()*th)太大,所以一次超过目标,一次低于目标。所以继续摆动,永远不会抓住结果,正如你在这里看到的那样:

tol: 2.67e-012 num: 333
tol: 4.0685e-012 num: 303
tol: 2.9909e-012 num: 320
tol: 3.1953e-012 num: 316
tol: 4.5895e-012 num: 298
tol: 3.7916e-012 num: 308
tol: 3.8906e-012 num: 308
tol: 7.6049e-012 num: 257
tol: 4.3302e-012 num: 299
tol: 1.6646e-013 num: 624
tol: 2.9337e-013 num: 562
tol: 2.9553e-013 num: 561
tol: 4.965e-013 num: 503
tol: 8.47e-013 num: 448
tol: 1.3934e-012 num: 391
tol: 2.163e-012 num: 350
tol: 2.6348e-012 num: 335
tol: 4.6699e-012 num: 296

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

首先,绘制您向我们展示的数据图表。这应该可以让您清楚地了解在哪里引导搜索th的值,从而为您提供所需的目标值。

其次,通过正确范围内th的值实现某种搜索;即使对包含所需目标值的区间进行简单的二分检索也会比当前方法更好。

仅仅关注您的数据表明,对于304的目标值,th的值应位于(3.7916e-012,4.0685e-012)范围内。

答案 1 :(得分:1)

有一种方法可以为你的猫提供皮肤,而你需要做的第一件事就是移除rand,因为这是一个非常难以预测的参数。话虽这么说,我推荐你Nelder-Mead

从更实际的角度来看,你应该用一个常数(例如0.1)替换rand(),或者用一个变量来测量num和target之间的距离乘以变化的参数。

或者,您可以使用最小化例程,如fminsearch(使用Nelder-Mead),可能会对不连续性进行一些小调整。

如果不能运行代码就很难提供更多信息(即我需要MCSimplify3)。

答案 2 :(得分:0)

凭借高性能标志的宝贵提示,这就是我解决的问题。

target = 304;
len = 0;

a = 0;
b = 1;

while(len~=target)
    c = (a+b)/2;
    len = length(MCSimplify3(time, latitudes, longitudes, c));
    if(len<target)
        b = c;
    end
    if (len>target)
        a = c;
    end
    if (len==target)
        disp(horzcat('tol: ', num2str(th), ' num: ', num2str(len)));
    end
end