梯度下降中的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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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