【问题标题】:How can I calculate high precision double value use java in Machine learning?如何在机器学习中使用 java 计算高精度双值?
【发布时间】:2017-07-01 11:21:00
【问题描述】:

我使用 逻辑回归 来训练我的数据。 在这个过程中,我需要计算一个 sigmoid 函数,编码如下:

private double sigmoid(double x) {
    return 1.0 / (1 + Math.pow(Math.E, -1 * x));
}

所以如果我的x大于36,它总是返回1.0,我会在log(1 - sigmoid(x))中得到Infinity

我猜java不是机器学习的好语言,我只需要在这个项目中申请。

通过这个question我也知道了Java的精度原理,但是我还是想知道有没有办法解决这个问题。

【问题讨论】:

  • 考虑使用BigDecimal 以获得高精度值。这个问题也可能对你有帮助:stackoverflow.com/questions/13784056/…
  • “我知道 java 不是一门好语言”——无知的陈述。
  • 这是特定于浮点的(不是特定于语言的)。一个技巧是使用不同的比例,比如对数比例或类似的比例——如果可能的话。这里可能没有。
  • 对不起,我的意思是java可能不擅长机器学习。

标签: java machine-learning double precision logistic-regression


【解决方案1】:

虽然这是一个精度问题,但通常处理爆炸梯度并确保数值稳定性的方法是裁剪函数的输入:

final double CLIP = 30d;
input = Math.min(CLIP, Math.max(-CLIP, input)));
return 1.0 / (1.0 + Math.exp(-input))

你也可以将输出剪辑到[0, 1]:

double output = 1.0 / (1.0 + Math.exp(-input))
return Math.min(0d, Math.max(1d, output)));

【讨论】:

  • 我不确定我是否理解正确,sigmoid 函数总是返回 0 到 1 之间的值,所以它不能做任何改变。你的意思是像Math.min(CLIP, Math.max(-CLIP, input))吗?
  • true,sigmoid 输出可以在 0 和 1 之间进行裁剪,或者输入可以用更高的小数进行裁剪。
【解决方案2】:

这对我很有效

测试了 20 , 40 , 49

import java.math.BigDecimal;
import java.math.MathContext;

/**
 *
 * @author tawfik
 */
public class Mathic {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       BigDecimal sigmoid = sigmoid(37);
        System.out.println(sigmoid);
    }
    static private BigDecimal sigmoid(double x) {
    return new BigDecimal(1.0).divide(new BigDecimal(1).add(new BigDecimal(Math.pow(Math.E, -1 * x))),MathContext.DECIMAL128);
}
}

【讨论】:

    【解决方案3】:

    sigmoid函数还有其他写法,比较numerically stable

    private double sigmoid(double x) {
        if (x > 0) {
            return 1.0 / (1 + Math.exp(-x));
        }
        else {
            z = Math.exp(x);
            return z / (1 + z);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多