梯度下降中的theta值是什么意思?

我已经有了所有组件,只是还不太确定这是我的输出:

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它也涵盖了梯度下降的完整实现。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注