Java 梯度下降的θ值是什么意思?
我有所有的组件,我只是不太确定这是我的输出:Java 梯度下降的θ值是什么意思?,java,machine-learning,Java,Machine Learning,我有所有的组件,我只是不太确定这是我的输出: Theta-->: 0.09604203456288299, 1.1864676227195392 我怎么解释呢?这是什么意思 我基本上只是修改了这个例子。但我不确定它是否真的适用于我的问题。我正在尝试对一组文档执行二进制分类。文档呈现为表单的文字袋样式特征向量: 例如: Document 1 = ["I", "am", "awesome"] Document 2 = ["I", "am", "great", "great"] 字典是: [
Theta-->: 0.09604203456288299, 1.1864676227195392
我怎么解释呢?这是什么意思
我基本上只是修改了这个例子。但我不确定它是否真的适用于我的问题。我正在尝试对一组文档执行二进制分类。文档呈现为表单的文字袋样式特征向量:
例如:
Document 1 = ["I", "am", "awesome"]
Document 2 = ["I", "am", "great", "great"]
字典是:
["I", "am", "awesome", "great"]
因此,作为向量的文档如下所示:
Document 1 = [1, 1, 1, 0]
Document 2 = [1, 1, 0, 2]
这是我的梯度下降代码:
public static double [] gradientDescent(final double [] theta_in, final double alpha, final int num_iters, double[][] data )
{
final double m = data.length;
double [] theta = theta_in;
double theta0 = 0;
double theta1 = 0;
for (int i = 0; i < num_iters; i++)
{
final double sum0 = gradientDescentSumScalar0(theta, alpha, data );
final double sum1 = gradientDescentSumScalar1(theta, alpha, data);
theta0 = theta[0] - ( (alpha / m) * sum0 );
theta1 = theta[1] - ( (alpha / m) * sum1 );
theta = new double [] { theta0, theta1 };
}
return theta;
}
//data is the feature vector
//this theta is weight
protected static double [] matrixMultipleHthetaByX( final double [] theta, double[][] data )
{
final double [] vector = new double[ data.length ];
int i = 0;
for (final double [] d : data)
{
vector[i] = (1.0 * theta[0]) + (d[0] * theta[1]);
i++;
} // End of the for //
return vector;
}
protected static double gradientDescentSumScalar0(final double [] theta, final double alpha, double[][] data )
{
double sum = 0;
int i = 0;
final double [] hthetaByXArr = matrixMultipleHthetaByX(theta, data );
for (final double [] d : data)
{
final double X = 1.0;
final double y = d[1];
final double hthetaByX = hthetaByXArr[i];
sum = sum + ( (hthetaByX - y) * X );
i++;
} // End of the for //
return sum;
}
protected static double gradientDescentSumScalar1(final double [] theta, final double alpha, double[][] data )
{
double sum = 0;
int i = 0;
final double [] hthetaByXArr = matrixMultipleHthetaByX(theta, data );
for (final double [] d : data)
{
final double X = d[0];
final double y = d[1];
final double hthetaByX = hthetaByXArr[i];
sum = sum + ( (hthetaByX - y) * X );
i++;
} // End of the for //
return sum;
}
public static double [] batchGradientDescent( double [] weights, double[][] data )
{
/*
* From tex:
* \theta_j := \theta_j - \alpha\frac{1}{m} \sum_{i=1}^m ( h_\theta (x^{(i)})
*/
final double [] theta_in = weights;
double [] theta = gradientDescent(theta_in, alpha, iterations, data );
lastTheta = theta;
System.out.println("Theta-->: " + theta[0] + ", " + theta[1]);
return theta;
}
公共静态双[]梯度下降(最终双[]θin,最终双α,最终整数,双[]数据)
{
最终双m=数据长度;
双[]θ=θu英寸;
双θ=0;
双θ=0;
对于(int i=0;i:“+θ[0]+”,“+θ[1]);
返回θ;
}
我这样称呼它:
final int globoDictSize = globoDict.size(); // number of features
double[] weights = new double[globoDictSize + 1];
for (int i = 0; i < weights.length; i++)
{
//weights[i] = Math.floor(Math.random() * 10000) / 10000;
//weights[i] = randomNumber(0,1);
weights[i] = 0.0;
}
int inputSize = trainingPerceptronInput.size();
double[] outputs = new double[inputSize];
final double[][] a = Prcptrn_InitOutpt.initializeOutput(trainingPerceptronInput, globoDictSize, outputs, LABEL);
for (int p = 0; p < inputSize; p++)
{
Gradient_Descent.batchGradientDescent( weights, a );
}
final int globoDictSize=globoDict.size();//特征数
double[]权重=新的double[globoDictSize+1];
对于(int i=0;i
我如何验证这段代码是否符合我的要求?它不应该输出一个预测的标签或其他东西吗?我听说我还可以对它应用一个错误函数,例如,在调用批处理梯度下降作为一个单独的组件之后,它会出现,不是吗?您的代码很复杂(我曾经用倍频程实现批处理梯度下降,而不是用OO编程语言)。但据我在您的代码中看到的(使用这种符号是很常见的),θ是一个参数向量。梯度下降算法收敛后,它会返回最佳θ向量。之后,您可以用公式计算新示例的输出:
θu转置*X
其中,θu transponsed是θ的转置向量,X是输入特征向量
另一方面,您提到的示例是一个回归任务(关于线性回归)。您描述的任务是一个分类问题,而不是预测某个值(一些数字-权重、长度、smth等)您需要为输入集指定一个标签。它可以用许多不同的算法来完成,但不能用您发布的文章中描述的线性回归来完成
我还需要提到的是,我们完全不清楚您尝试执行哪种分类。在exmaple中,您有一包单词描述(单词计数矩阵)。但是分类标签在哪里?是多输出分类?还是多类?还是二进制
我真的建议你参加一门关于ml的课程。也许是关于coursera。这门课很好:
它还涵盖了梯度下降的完整实现