資源簡介
梯度下降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? {
TrainData[i][0]?=?1;
for?(int?j?=?0;?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? {
TestData[i][0]?=?1;
for?(int?j?=?1;?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? {
for?(int?j?=?0;?j? {
Derivative[j]?=?getPartialDerivative(j);
ThetaTemp[j]?=?Theta[j]?-?__ALPHA?*?Derivative[j];
}
for?(int?j?=?0;?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++ 教學管理系統
評論
共有 條評論