代码之家  ›  专栏  ›  技术社区  ›  Glaucon

不返回0的函数

  •  -1
  • Glaucon  · 技术社区  · 8 年前

    我正在写一个公式,用它作为给定值的衰减乘数。 问题如下:我有一个处理窗口-天,比如说10天,这个窗口每天都会重新计算。我需要用一个反映id存在天数的因子来衰减某个参数。目前我所做的是 (previousWinSize-(start of the current window-start of the previous window))/previousWinSize 在这种情况下,如果我以前的窗口大小是10,处理天数的差值是2(10-2)/10,那么我的变量乘以0.8,分别乘以衰减和衰减。其中2个。 然而,如果我有一个3天的窗口,又有2天的差异(3-2)/3,我得到的值接近0,这比我想要的要多。 我正在寻找一个公式,当数字很小时,它可以更好地扩展,并且不会产生巨大的衰减因子。

    提前谢谢你。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Aflah Bhari    8 年前

    我建议使用sigmoid函数,例如。

    您可以获取函数的输出,即根据处理天数的差异返回一个介于0和1之间的数字,并将其输入到sigmoid中。例如,如果正确设置了a(斜率)和b(拐点)参数,则可以确保在原始方程返回接近0的数字时,得到的最低衰减乘数为0.5。

    我已经在这里绘制了我上面所述的示例: https://www.desmos.com/calculator/nqemuexjhg (这是基于: https://www.desmos.com/calculator/rna4aqta0c )

    我认为这种方法确实有两种边缘情况。当你的方程返回0时,sigmoid并不能精确地给你0.5(你可能根本不想开始),你最终会得到接近0.5的值。在这种情况下,如果继续应用sigmoid,您可能会开始看到您的值漂移。当方程返回1时也是如此。通过乙状结肠后,你不会得到1,你会得到接近1的东西。

    在这种情况下,我想我应该在使用乙状结肠之前进行某种检查 例如

    if(x == 0)
        y = 0;
    else if(x == 1)
        y = 1;
    else
        y = sigmoid(x);
    

    来源/可能的进一步阅读: https://en.wikipedia.org/wiki/Sigmoid_function