Java中的梯度下降

Java中的梯度下降,java,artificial-intelligence,gradient-descent,Java,Artificial Intelligence,Gradient Descent,我最近在Coursera开始了AI课程,我有一个问题与我的梯度下降算法的实现有关 以下是我当前的实现(实际上我只是将数学表达式“翻译”为Java代码): 梯度下降的数学表达式如下: 您应该使用java.math.BigDecimal进行算术运算。 double在执行任何算术运算时都存在舍入问题。要解决此问题,必须使用以下公式对数据进行规范化:(Xi mu)/s。 席是当前训练集值,MU是当前列中的值的平均值,S是最大值减去当前列的最小值。该公式将使训练数据大致处于-1和1之间的范围内,从而允许选

我最近在Coursera开始了AI课程,我有一个问题与我的梯度下降算法的实现有关

以下是我当前的实现(实际上我只是将数学表达式“翻译”为Java代码):

梯度下降的数学表达式如下:


您应该使用java.math.BigDecimal进行算术运算。

double在执行任何算术运算时都存在舍入问题。

要解决此问题,必须使用以下公式对数据进行规范化:(Xi mu)/s。 席是当前训练集值,MU是当前列中的值的平均值,S是最大值减去当前列的最小值。该公式将使训练数据大致处于-1和1之间的范围内,从而允许选择更高的学习率和梯度下降以更快地收敛。 但随后有必要对预测结果进行反规范化。

私有双getResult(双[][]训练数据,布尔启用因子){
private double getResult(double[][] trainingData, boolean enableFactor){
double result = 0;
for (int i = 0; i < trainingData.length; i++) {
    result = (getHypothesisResult(trainingData[i][0]) - trainingData[i][1]);
    if (enableFactor) result = result*trainingData[i][0]; 
}
return result;
双结果=0; 对于(int i=0;i

在这个函数中,result变量覆盖了每次迭代,旧的值丢失了。当输入值时,只有数组上的最后一项在计算。其余的都不重要。

这是一个猜测,我几乎否决了这一点:用
bigdecim
替换
double
不一定能解决这个问题,这是我的错误正确(!)与精度完全无关……您可能应该在
main
方法中提供一些示例数据/输入,还可能提供到您“翻译”的forumlas的反向链接。我更新了这个问题,也发现了一个小问题。修复后,我现在可以将学习率设置为0.0001。但我认为它仍然很低,但比以前好了很多。它是哪门课程?斯坦福的机器学习?是的,它是斯坦福的机器学习课程。一开始很有趣但是我不喜欢八度音阶的练习(他们感觉很普通),所以我开始用Java实现算法。你说得对!谢谢你的建议!结果是一个非常缓慢的随机梯度下降…仍然有效,但速度很慢,因为所有的样本都会被处理,只需一个样本就可以更新参数。
private static final double[][] TDATA = {{200, 20000},{300, 41000},{900, 141000},{800, 41000},{400, 51000},{500, 61500}};

public static void main(String[] args) {
    GradientDescent gd = new GradientDescent(0,0);
    gd.train(0.00001, TDATA);
    System.out.println("THETA0: " + gd.getTheta0() + " - THETA1: " + gd.getTheta1());
    System.out.println("PREDICTION: " + gd.getHypothesisResult(300));
}
private double getResult(double[][] trainingData, boolean enableFactor){
double result = 0;
for (int i = 0; i < trainingData.length; i++) {
    result = (getHypothesisResult(trainingData[i][0]) - trainingData[i][1]);
    if (enableFactor) result = result*trainingData[i][0]; 
}
return result;