Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在实际应用中应用任何库中的简单梯度下降算法?_Java_Machine Learning - Fatal编程技术网

Java 如何在实际应用中应用任何库中的简单梯度下降算法?

Java 如何在实际应用中应用任何库中的简单梯度下降算法?,java,machine-learning,Java,Machine Learning,我已经看过了可能有我答案的建议问题,我不认为这是重复的。如果是,那是因为我需要一些更基本的东西,所以我会说这种语言。如果有人能给我指出正确的材料,我愿意通过投票/失去代表来解决这个问题。我甚至可能在错误的论坛 我是一个有经验的程序员,但不是数学家。我太迷茫了,甚至不知道如何表达这个问题 我正在尝试在应用程序中实现一个机器学习组件,我可以看到我需要做什么的大致轮廓,但是库手册都是用希腊语编写的。我得到了alpha是学习速率,θ是一个浮点数矩阵,也就是神经网络 我一直在回顾Andrew Ng在斯坦福

我已经看过了可能有我答案的建议问题,我不认为这是重复的。如果是,那是因为我需要一些更基本的东西,所以我会说这种语言。如果有人能给我指出正确的材料,我愿意通过投票/失去代表来解决这个问题。我甚至可能在错误的论坛

我是一个有经验的程序员,但不是数学家。我太迷茫了,甚至不知道如何表达这个问题

我正在尝试在应用程序中实现一个机器学习组件,我可以看到我需要做什么的大致轮廓,但是库手册都是用希腊语编写的。我得到了alpha是学习速率,θ是一个浮点数矩阵,也就是神经网络

我一直在回顾Andrew Ng在斯坦福大学的演讲,他们帮助我理解,算法的最终应用将需要访问者将神经网络矩阵θ应用于内容。无论您是尝试推断新功能集还是生成输出,数学都是一样的。耶

我可以看到学习引擎类实现后如何组件化,为什么其他人没有这样做?但我不明白如何在组件化的信封中实现这些东西。部分问题在于,ApacheCommonsMath、TensorFlow等库和示例都假设您首先是数学家,因此他们说的是数学家的语言,而不是程序员的语言

有人能在不使用诸如θ、导数、LUDecomposition、Eigen或一系列字母汤之类的词的情况下解释一下,一旦你把输入很好地安排好了,到底该如何使用这些库吗

// The final code should look something like this, I think
public void train () {

    // do something involving alphabet soup and theta here
    // might be "Stochastic Gradient Descent?" 

    // new model = stochasticGradientDescent(model)
    // hypothesis = applyModel (newModel)
    // difference = (hypothesis - actual)**2

}

编写梯度下降的第一个重要方面是识别特征并开发公式假设,该公式假设可以定义输入(设置特征)和参数THA之间的关系。通过几个例子,我们可以更好地理解这一点

假设我是喜欢动作片的netflix用户。在数学术语中,我将分配一个数字给用户。该值可以是0到1之间的任何值。大部分θ值仍然未知,必须使用替代最小二乘法来推导。动作可以是一个功能,也应该有一个单元。我会给重动作电影更多的权重,而在动作场景较少的地方,我会给更少的权重。输出可以是你有多喜欢这部电影。你对动作片的偏好超过了我的5分。对于较低的偏好,评级将为1

一旦我们有了特征和评级,下一步就是确定假设。假设可以是基于特征列表的线性函数或多项式函数。我们只考虑了特征,我们可以使用一个简单的线性函数

用户对电影的喜爱程度=观看电影的用户参数+观看动作电影的用户参数*电影中的动作场景

更准确地说,在数学术语中,它是可以写成的

Y=θ0+θ1*x

现在我们知道了Y和x的值。θ0和θ1值未知。这可以使用各种梯度下降方法得出。我将不详细介绍如何根据上述假设定义梯度下降公式。我们可以使用下面的梯度下降公式

θ0:=θ0-学习率*所有训练集的总和实际评分-使用假设得出的评分/训练集总数

θ0:=θ0-学习率*所有训练集的总和实际评分-使用假设得出的评分/训练集总数*特征编号

在训练方法中,第一步是为θ0和θ1提供起始值。按照惯例,该值从0.1开始。学习速率控制收敛速度。它将控制速度以达到最终θ值

在训练方法的第二步中,您循环训练集。对于随机梯度下降,您已将训练数据集拆分为多个批次。θ0值将在单个批次数据集上计算,并作为初始θ值传递给其他批次。当训练集大小相当大(以百万计)时,应使用此方法

public Parameter train(List<UserSkuMatrix> ratings, User user) {
    
    double theta0=0.1,theta1=0.1;
    double tempTheta0=0,tempTheta1=0;
    
    for(int i = 0;i<iteration;i++) {
    
        if(verifyConvergence(theta0, tempTheta0) 
                && verifyConvergence(theta1, tempTheta1)) {
        
            break;
        }

        tempTheta0 = theta0;
        tempTheta1 = theta1;

        
        theta0 = theta0 - gradientDesent(ratings, theta0,theta1,1);
        theta1 = theta1 - gradientDesent(ratings, theta0,theta1,2);
        
    }
    
    return p;   
}
protected boolean verifyConvergence(double theta, double tempTheta) {
    
    return (theta - tempTheta) < GLOBAL_MINIMUM;
}
protected double partialDerivative(List<UserSkuMatrix> ratings, double theta0, double theta1, int factor){
    
    double sum=0.0;
    
    for(UserSkuMatrix d:ratings) {
        
        double x = d.getSku().getFeature1Value(), 
                y = d.getRank(), x1=d.getSku().getFeature2Value();

        Hypothesis h = new Hypothesis(p, x, x1);
    
        double s = (h.hypothesis2()-y);
        
        if(factor == 2) {
            s = s*x;
        } else if( factor==3) {
            s = s*x1;
        }
    
        sum = sum + s;
    }
    
    return sum;
}
public double gradientDesent(List<UserSkuMatrix> ratings, double theta0, double theta1, int factor) {
    double m = ratings.size();
    double total = partialDerivative(ratings,theta0,theta1,factor);
    return (1.0 * total) / m;
}
一旦导出θ0和θ1,模型就准备好了。这些值可以保存在文件或数据库中。该模型可用于预测用户对未来发布的新动作电影的偏好


ApacheFlink还为随机梯度下降提供了一个很好的实现

至于没有研究工作,我已经在这个问题上苦思冥想了两个月了,现在仍然迷路。我现在已经到了我甚至可以尝试表述这个问题的地步。是什么让你认为你能够在不理解这些术语的情况下使用这些库?你也许应该花点时间学习一下垫子
hs;否则,你只会盲目地操纵杠杆,直到它最终起作用,或者,令人沮丧的是,它不起作用。我现在已经不再沮丧了。我需要花些时间来领工资,而我已经没有睡觉的时间去打劫了,去上三年的数学课。我知道这些库正在实现嵌套循环和简单算法,我已经计算出了大部分的数学知识并阅读了代码,所以我相信它们。在这一点上,我可以从头开始编写算法,但如果有更好的设计和可互换性的完美库,我可以利用它们,为什么要这么做呢?在这可能是一个现实生活中的应用中,一篇相关的文章提到我的这篇帖子:这已经开始有帮助了。安德鲁·吴在讲课时犯了数学错误,他对此提出了警告。由于他的讲座针对的是博士级数学家,他们不一定是程序员,根据他花在强调“变得平等”关系上的时间,目标受众可以在心理上发现并纠正这些错误。我需要找一本适合程序员的更好的教程。