Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        6个月前关闭。
                                                                                            
                
        
我已经看过提出的可能会回答我的问题,但我认为这不是重复的。如果是这样,那是因为我需要更基本的东西,所以我会说这种语言。如果有人可以指出我正确的材料,我愿意选择不赞成/失败的代表来解决这个问题。我什至可能在错误的论坛上。

我是一位经验丰富的程序员,但不是数学家。我很失落,以至于我什至不知道如何表达这个问题。

我正在尝试在应用程序中实现机器学习组件,并且可以看到我需要做的粗略概述,但是库手册都是用希腊语编写的。我已经知道“ alpha”是学习率,“ theta”是浮点数的矩阵(又称神经网络)。

我一直在回顾Andrew Ng在斯坦福大学的演讲,他们帮助我理解了该算法的最终应用将需要访客将神经网络矩阵(Theta)应用于“东西”。无论您是试图推断新功能集还是产生输出,其数学运算都是相同的。好极了!

我可以看到一旦实现了学习引擎类,就该如何对其进行组件化(为什么其他人没有这样做?),但是我不明白如何在组件化信封中实现这些内容。问题的部分原因在于这些库和示例(Apache Commons Math,TensorFlow等)都首先假设您是数学家,因此它们说的是数学家而不是程序员的语言。

有人可以不用输入诸如theta,导数,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

}

最佳答案

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

可以说我是喜欢动作片的netflix的用户。用数学术语,我将为用户分配一个数字。该值可以是0到1之间的任何值。大多数theta值仍然未知,必须使用方法作为替代最小二乘(ALS)得出。动作可以是一个功能,还应该为其指定一个单位。对于重磅动作电影,我将给予更多的重视,而在较少动作场景的地方,我将给予较少的重视。输出可能是您喜欢该电影的程度。您对动作片的偏好高于我将其评为5的程度。对于偏好较低的动作,评分将为1。

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


  电影的用户喜好度=看电影的用户参数+看动作电影的用户参数*电影中的动作场景


更精确的数学术语可以写成


  Y = theta0 + theta1 * x


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


  theta0:= theta0-学习率*所有训练集的总和(实际评级-使用假设得出的评级)/训练套总数
  
  theta0:= theta0-(学习率*所有训练集的总和(实际评分-使用假设得出的评分)/训练集的总数)*功能编号


在火车方法中,第一步是提供theta0和theta1的起始值。按照惯例,该值从0.1开始。学习速率控制收敛的速度。它将控制速度以达到最终的theta值。

在训练方法的第二步中,循环浏览训练集。对于随机梯度下降,您已将训练数据集分为多个批次。 theta0值将在各个批次数据集上计算,并将它们作为初始theta值传递给其他批次。当训练集大小达到数百万时,应使用此方法。

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;
}


一旦导出theta0和theta1,您的模型就准备就绪。该值可以保存在文件或数据库中。该模型可用于预测用户对将来要发行的新动作电影的偏好。

Apache flink还为随机梯度下降提供了很好的实现。 https://ci.apache.org/projects/flink/flink-docs-release-1.2/

08-25 06:05