Java 如何在实际应用中应用任何库中的简单梯度下降算法?
我已经看过了可能有我答案的建议问题,我不认为这是重复的。如果是,那是因为我需要一些更基本的东西,所以我会说这种语言。如果有人能给我指出正确的材料,我愿意通过投票/失去代表来解决这个问题。我甚至可能在错误的论坛 我是一个有经验的程序员,但不是数学家。我太迷茫了,甚至不知道如何表达这个问题 我正在尝试在应用程序中实现一个机器学习组件,我可以看到我需要做什么的大致轮廓,但是库手册都是用希腊语编写的。我得到了alpha是学习速率,θ是一个浮点数矩阵,也就是神经网络 我一直在回顾Andrew Ng在斯坦福大学的演讲,他们帮助我理解,算法的最终应用将需要访问者将神经网络矩阵θ应用于内容。无论您是尝试推断新功能集还是生成输出,数学都是一样的。耶 我可以看到学习引擎类实现后如何组件化,为什么其他人没有这样做?但我不明白如何在组件化的信封中实现这些东西。部分问题在于,ApacheCommonsMath、TensorFlow等库和示例都假设您首先是数学家,因此他们说的是数学家的语言,而不是程序员的语言 有人能在不使用诸如θ、导数、LUDecomposition、Eigen或一系列字母汤之类的词的情况下解释一下,一旦你把输入很好地安排好了,到底该如何使用这些库吗Java 如何在实际应用中应用任何库中的简单梯度下降算法?,java,machine-learning,Java,Machine Learning,我已经看过了可能有我答案的建议问题,我不认为这是重复的。如果是,那是因为我需要一些更基本的东西,所以我会说这种语言。如果有人能给我指出正确的材料,我愿意通过投票/失去代表来解决这个问题。我甚至可能在错误的论坛 我是一个有经验的程序员,但不是数学家。我太迷茫了,甚至不知道如何表达这个问题 我正在尝试在应用程序中实现一个机器学习组件,我可以看到我需要做什么的大致轮廓,但是库手册都是用希腊语编写的。我得到了alpha是学习速率,θ是一个浮点数矩阵,也就是神经网络 我一直在回顾Andrew Ng在斯坦福
// 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;否则,你只会盲目地操纵杠杆,直到它最终起作用,或者,令人沮丧的是,它不起作用。我现在已经不再沮丧了。我需要花些时间来领工资,而我已经没有睡觉的时间去打劫了,去上三年的数学课。我知道这些库正在实现嵌套循环和简单算法,我已经计算出了大部分的数学知识并阅读了代码,所以我相信它们。在这一点上,我可以从头开始编写算法,但如果有更好的设计和可互换性的完美库,我可以利用它们,为什么要这么做呢?在这可能是一个现实生活中的应用中,一篇相关的文章提到我的这篇帖子:这已经开始有帮助了。安德鲁·吴在讲课时犯了数学错误,他对此提出了警告。由于他的讲座针对的是博士级数学家,他们不一定是程序员,根据他花在强调“变得平等”关系上的时间,目标受众可以在心理上发现并纠正这些错误。我需要找一本适合程序员的更好的教程。