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。这门课很好: 它还涵盖了梯度下降的完整实现