gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:22:40 26 4
gpt4 key购买 nike

我拥有所有组件,只是不太确定这是我的输出:

Theta-->: 0.09604203456288299, 1.1864676227195392

我该如何解释?这是什么意思?

我基本上只是修改了 this description 中的示例。但我不确定它是否真的适用于我的问题。我正在尝试对一组文档执行二元分类。这些文档被渲染为以下形式的词袋样式特征向量:

示例:

Document 1 = ["I", "am", "awesome"]
Document 2 = ["I", "am", "great", "great"]

字典是:

["I", "am", "awesome", "great"]

因此,作为 vector 的文档将如下所示:

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;
}

我这样调用它:

   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 );
}

我如何验证这段代码是否按照我的要求执行?它不应该输出预测标签之类的东西吗?我听说我还可以对其应用一个错误函数,例如 hinge loss ,该函数将在作为单独组件调用批量梯度下降之后出现,不是吗?

最佳答案

你的代码很复杂(我曾经在Octave中实现批量梯度下降,而不是在OO编程语言中)。但据我在您的代码中看到的(并且通常使用这种表示法)Theta 是一个参数 vector 。梯度下降算法收敛后,它会返回最佳的 Theta vector 。之后,您可以使用公式计算新示例的输出:

theta_转置 * X,

其中 theta_trasponsed 是 theta 的转置 vector ,X 是输入特征向量。

顺便说一句,您提到的示例是回归任务(它是关于线性回归的)。虽然您描述的任务是一个分类问题,但您需要为输入集分配一个标签,而不是预测某些值(某些数字 - 重量、长度等)。它可以使用许多不同的算法来完成,但显然不能使用您发布的文章中描述的线性回归来完成。

我还需要提到的是,绝对不清楚您尝试执行哪种分类。在你的例子中,你有一个词袋描述(字数矩阵)。但是分类标签在哪里呢?是多输出分类吗?还是只是多类别?还是二进制?

我真的建议你学习机器学习类(class)。也许在 coursera 上。这个不错: https://www.coursera.org/course/ml它还涵盖了梯度下降的完整实现。

关于java - 梯度下降的theta值是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28713492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com