我已经有了所有组件,只是还不太确定这是我的输出:
Theta-->: 0.09604203456288299, 1.1864676227195392
我该如何解释这些值?它们代表什么意思?
我基本上只是修改了这个描述中的示例。但我不确定这是否真的适用于我的问题。我正在尝试对一组文档进行二元分类。这些文档以词袋形式呈现为特征向量,形式如下:
示例:
文档1 = ["我", "是", "很棒的"]文档2 = ["我", "是", "伟大的", "伟大的"]
词典是:
["我", "是", "很棒的", "伟大的"]
因此,文档作为向量看起来像这样:
文档1 = [1, 1, 1, 0]文档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 weightprotected 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;}
我这样调用它:
final int globoDictSize = globoDict.size(); // 特征数量 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 ); }
我如何验证这段代码是否按我期望的方式运行?它不应该输出一个预测标签或其他什么吗?我听说我还可以应用一个错误函数,比如铰链损失,这应该在调用批量梯度下降之后作为一个独立的组件,不是吗?
回答:
你的代码很复杂(我过去在Octave中实现批量梯度下降,而不是在面向对象的编程语言中)。但据我所见,在你的代码中(这是一种常见的表示法),Theta是一个参数向量。梯度下降算法收敛后,它会返回最优的Theta向量。之后,你可以用公式计算新例子的输出:
theta_transposed * X,
其中theta_transposed是theta的转置向量,X是输入特征的向量。
顺便提一下,你所引用的示例是一个回归任务(关于线性回归)。而你描述的任务是一个分类问题,你需要为输入集分配一个标签,而不是预测某个值(某个数字 – 重量、长度等)。这可以用许多不同的算法来完成,但绝对不是你发布的文章中描述的线性回归。
我还需要提到的是,你试图执行的分类类型完全不清楚。在你的示例中,你有一个词袋描述(单词计数矩阵)。但分类标签在哪里?这是多输出分类吗?还是多类别?还是二元分类?
我真的建议你参加一个机器学习课程。也许在Coursera上。这个课程很好:https://www.coursera.org/course/ml它也涵盖了梯度下降的完整实现。