资源简介
梯度下降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
- 上一篇:操作系统—页面置换算法C++实现
- 下一篇:C++ 教学管理系统
相关资源
- CCS FFT c语言算法
- 小波变换算法 c语言版
- 3des加密算法C语言实现
- DES加密算法C语言实现
- 线性回归算法c语言实现
- 基于C语言的模拟退火算法
- C语言实现的DES对称加密算法
- 用VC6.0实现多边形扫描线填充算法
- c语言编写的货郎担算法
- Em算法(使用C++编写)
- STM32烧写算法flash包
- 永磁同步电机的FOC控制算法
- Proteus仿真:PID算法输出.rar
- 一个模糊PID温度控制算法源代码
- 经典滤波算法
- KMP算法C语言程序
- SVM算法实现(源码+文档)
- 算法A律U律实现
- 人工蜂群算法.docx
- BlowFish加密算法
- C语言常用算法源代码
- c++数组快排算法
- 算法表达式求值.cpp
- PID算法.c
- QR二维码C++源码 算法实现
- 基于opencv漫水填充算法综合
- 信息学奥赛一本通——算法部分
- 银行家算法分配资源的模拟实现(m
- C语言程序设计50例.docx
- 常见排序算法比较.cpp
评论
共有 条评论