资源简介

梯度下降C++的简单实现,没有做优化,包含源码,可执行程序以及测试集、训练集和结果。

资源截图

代码片段和文件信息

/*
*@AUTHOR: Foolment
*@DATE: 2013-3-25
*@DESCRIBE: Implement the algorithm of gradient descent.
*/

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define _TRAIN_FILE_NAME “train.csv“ //训练集文件名
#define _TEST_FILE_NAME “test.csv“ //测试集文件名
#define _OUTPUT_FILE_NAME “output.csv“ //输出文件名
#define _CUT_OFF_CHAR ‘‘ //读入文件分隔符

const double __ALPHA = 0.001; //步长
const int _DIMENSION = 47; //向量维度,第一维为1
const int _TRAIN_FILE_ROW = 9127; //训练集数据行数,包括第一行
const int _TEST_FILE_ROW = 6085; //测试集数据行数,包括第一行
const int _ITERATIONS = 10000; //迭代次数

const int _TRAIN_ROW = _TRAIN_FILE_ROW - 1; //实际训练集数据行数,去掉第一行
const int _TEST_ROW = _TEST_FILE_ROW - 1; //实际测试集数据行数,去掉第一行

double TrainData[_TRAIN_ROW][_DIMENSION]; //存储训练集二维数组
double Y[_TRAIN_ROW]; //存储训练集label向量,训练集的结果
double Theta[_DIMENSION]; //预测函数的系数theta,梯度下降要求的向量
double ThetaTemp[_DIMENSION]; //临时theta,保护每一次迭代时所有theta是同时更新
double Derivative[_DIMENSION]; //偏导数(这里用数组的原因是为了以后的优化)
double TestData[_TEST_ROW][_DIMENSION]; //测试集数据
double Result[_TEST_ROW]; //存储预测结果


void readTrainData(); //读入训练集数据
void readTestData(); //读入测试集数据
void gradientDescent(); //梯度下降算法
double getPartialDerivative(int); //计算偏导数的值
double H(int double[][_DIMENSION]); //求函数值
void predict(); //预测测试集
void outputResult(); //输出结果

int main()
{

memset(Theta 0 sizeof(Theta));
readTrainData();
readTestData();
gradientDescent();
predict();
outputResult();
system(“pause“);
return 0;
}

void readTrainData()
{
ifstream fin;
fin.open(_TRAIN_FILE_NAME);

string str;
const char* cstr;
double n;

//跳过第一行
getline(fin str);

for (int i = 0; i < _TRAIN_ROW; i++)
{
TrainData[i][0] = 1;
for (int j = 0; j < _DIMENSION; j++)
{
if (j == _DIMENSION - 1)
getline(fin str);
else
getline(fin str _CUT_OFF_CHAR);
cstr = str.c_str();
n = atof(cstr);
if (j == 0)
{
Y[i] = n;
}
else
{
TrainData[i][j] = n;
}
}
}

fin.close();
}

void readTestData()
{
ifstream fin;
fin.open(_TEST_FILE_NAME);

string str;
const char* cstr;
double n;

//跳过第一行
getline(fin str);

for (int i = 0; i < _TEST_ROW; i++)
{
TestData[i][0] = 1;
for (int j = 1; j < _DIMENSION; j++)
{
if (j == _DIMENSION - 1)
getline(fin str);
else
getline(fin str _CUT_OFF_CHAR);
cstr = str.c_str();
n = atof(cstr);
TestData[i][j] = n;
}
}
fin.close();
}

void gradientDescent()
{
for (int i = 0; i < _ITERATIONS; i++)
{
for (int j = 0; j < _DIMENSION; j++)
{
Derivative[j] = getPartialDerivative(j);
ThetaTemp[j] = Theta[j] - __ALPHA * Derivative[j];
}
for (int j = 0; j < _DIMENSION; j++)
{
Theta[j] = ThetaTemp[j];
}
}
}

double getPartialDerivative(int index)
{
double sum = 0;
for (int

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      62209  2013-03-27 12:08  output.csv

     文件    1448365  2013-03-23 14:53  test.csv

     文件    2186370  2013-03-23 14:53  train.csv

     文件       4031  2013-03-27 12:44  main.cpp

     文件      58870  2013-03-27 11:46  main.exe

----------- ---------  ---------- -----  ----

              3759845                    5


评论

共有 条评论