梯度下降实施中的成本函数没有减少

时间:2014-05-10 01:42:26

标签: c algorithm gradient linear-regression

我正在尝试用C语言实现批量梯度下降。问题是,我的成本函数在每个回合都会急剧增加,我无法理解错误。我几次检查了我的代码,在我看来,我完全编码了公式。您是否有任何建议或想法在实施中可能出错?

我的数据集在这里:https://archive.ics.uci.edu/ml/datasets/Housing 我参考这些幻灯片的算法(我用谷歌搜索):http://asv.informatik.uni-leipzig.de/uploads/document/file_link/527/TMI04.2_linear_regression.pdf

我正确地将数据集读入主存储器。下面的部分显示了我如何将数据集信息存储在主存储器中。这是直截了当的。

//Definitions
#define NUM_OF_ATTRIBUTES   13
#define NUM_OF_SETS     506
#define LEARNING_RATE   0.07

//Data holder
struct data_set_s
 {
   double x_val[NUM_OF_SETS][NUM_OF_ATTRIBUTES + 1];
   double y_val[NUM_OF_SETS];
   double teta_val[NUM_OF_ATTRIBUTES + 1]; 
 };

//RAM
struct data_set_s data_set;

Teta值初始化为0,x0值初始化为1.

下面是假设函数,它是标准多项式函数。

double perform_hypothesis_a(unsigned short set_index)
{
double  result;
int     i;

result = 0;
for(i = 0; i < NUM_OF_ATTRIBUTES + 1; i++)
   result += data_set.teta_val[i] * data_set.x_val[set_index][i];

return result; 
}

以下部分是成本函数。

double perform_simplified_cost_func(double (*hypothesis_func)(unsigned short))
{
double result, val;
int     i;

result = 0;
for(i = 0; i < NUM_OF_SETS; i++)
{
   val = hypothesis_func(i) - data_set.y_val[i];
   result += pow(val, 2);
}

result = result / (double)(2 * NUM_OF_SETS);
return result;

}

下面是梯度下降函数。

double perform_simplified_gradient_descent(double (*hypothesis_func)(unsigned short))
{
double  temp_teta_val[NUM_OF_ATTRIBUTES + 1], summation, val;
int     i, j, k;

for(i = 0; i < NUM_OF_ATTRIBUTES + 1; i++)
   temp_teta_val[i] = 0; 

for(i = 0; i < 10; i++) //assume this is "while not converged"
 {
   for(j = 0; j < NUM_OF_ATTRIBUTES + 1; j++)
    {
      summation = 0;
      for(k = 0; k < NUM_OF_SETS; k++)
       {
         summation += (hypothesis_func(k) - data_set.y_val[k]) * data_set.x_val[k][j];   
       }

      val = ((double)LEARNING_RATE * summation) / NUM_OF_SETS);
      temp_teta_val[j] = data_set.teta_val[j] - val;
    }

    for(j = 0; j < NUM_OF_ATTRIBUTES + 1; j++)
     {
      data_set.teta_val[j] = temp_teta_val[j];
     }  

    printf("%lg\n ", perform_simplified_cost_func(hypothesis_func));
 }

return 1;
}

虽然对我来说似乎是正确的,但是当我在每个梯度下降结束时打印成本函数时,它会像:1.09104e + 011,5.234e + 019,2.51262e + 028,1.20621e + 037 ..

0 个答案:

没有答案