作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在寻找一种实现快速物流功能的方法。逻辑函数的经典定义是:
y(x) = 1/(1 + (1/e^x))
其中 ^ 是求幂。
或者同样地:y(x) = (e^x)/(e^x + 1)
但是,我的特殊逻辑函数有一个基数 E 而不是 e,所以:
y(x) = E^x / (E^x + 1)
在我的例子中,E 和 x 是 32 位整数,16.16 类型的基数 2 中的定点。 E 尽可能接近实常数 e。
这种功能最快的算法是什么?我宁愿没有查找表。像位操作这样的东西应该是完美的。
凭直觉,我觉得有一个非常快速和简单的方法,基于欧拉公式:
e^(i*x) = cos(x) + i*sin(x)
其中 i 是虚数单位。
最佳答案
记住上溢和下溢。代码 exp(x)/(1 + exp(x))
将溢出 x 的大正值,即使结果应该大约为 1。您可以通过使用 1/避免这种情况(1 + exp(-x))
。对于 x 的大负值,这将下溢为 0,但这可能没问题,具体取决于您的上下文,因为在这种情况下确切的结果几乎为零。
如果为 x 的大正值或负值调用您的代码,您可以通过为无论如何都将表示为 0 或 1 的值返回 0 或 1 来节省一点时间,并避免调用 exp
。所以你的代码可能是这样的
if (x > positive cutoff) return 1;
if (x < negative cutoff) return 0;
return 1 / (1 + exp(-x))
这是否真的更有效取决于您的特定环境以及您获得参数超过截止值的频率。
关于c - 快速物流功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786751/
我已经安装了逻辑回归模型,该模型可以根据vs(mpg数据集)预测二进制结果mtcars。该图如下所示。如何确定任何特定mpg值的vs值?例如,当mpg的概率为0.50时,我有兴趣找出vs的值是多少。感
我是一名优秀的程序员,十分优秀!