资源简介

利用梯度下降算法,进行机器学习.利用C++实现下降算法.

资源截图

代码片段和文件信息

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

//Term存放每条数据flag为True表示1false表示-1
struct Term
{
bool flag;
map pairs;
double score;
};

//损失函数
int lostFunction(Term[] int map);
//进行梯度下降的迭代过程
void doGradient(int T int sampleNum Term[]);
//得到梯度的值
void changeGradient(Term[] int map*);
//给每条数据打分如果分数大于0那么认为是+1的;小于0认为是-1的
double getScore(Term map*);
void testTestData(map);
void inputData(char* int Term[]);
void getTerm(string Term*);
void getKeyValue(string int* double*);

map weight;

int main()
{
Term trainData[2000];
cout << “input the train data“ << endl << endl;
inputData(“train.dat“ 2000 trainData);

cout << “initial the Weight vector“ << endl;
for (int i=1; i<10000; i++)
weight[i] = 1.0;

cout << “Gradient decent iterating...“ < doGradient(25 2000 trainData);

cout << “Run on test.dat“ << endl;
testTestData(weight);
//从结果看有overfitting的存在
//该梯度算法实现中没有加入Regularization一项

return 0;
}

void inputData(char* file int n Term terms[])
{
ifstream infile;
string s;
Term term;
char cs[7000];
infile.open(file);
for (int i=0; i {
infile.getline(cs 7000);
if (cs[0] == ‘#‘)
{
i--;
continue;
}
s = cs;
terms[i].pairs.clear();
getTerm(s &terms[i]);
}
infile.close();
}

void doGradient(int T int sampleNum Term terms[])
{
map gradient;
map tempWeight;
int error = 0;
bool goOn = false;

error = lostFunction(terms sampleNum weight);
for (int t=0; t {
//求得梯度
gradient.clear();
changeGradient(terms sampleNum &gradient);

goOn = false;
double alpha = 4.5;
//不断变小步长直到小于.000001为止求得合理的步长
while (alpha > 0.0000001)
{
map::iterator it = weight.begin();
for (; it!=weight.end(); it++)
tempWeight[it->first] = it->second + alpha * gradient[it->first];
int error1 = lostFunction(terms sampleNum tempWeight);
if (error1 < error)
{
cout << “Iterating Times “<< t << “:“ < cout << “train data error is : “ <<  error << endl;
cout << “train data rate is : “ << 1.0- error*1.0/2000.0 << endl;
weight = tempWeight;
error = error1;
goOn = true;
break;
}
alpha /= 2.0;
}
if (!goOn)
break;
cout << endl;
}
}

int lostFunction(Term terms[] int sampleNum map w)
{
int wrong = 0;
for (int i=0; i {
terms[i].score = getScore(terms[i] &w);
if (terms[i].flag && terms[i].score<0)
{
wrong++;
}
else if (terms[i].flag==false && terms[i].score>0)
{
wrong++;
}
}
return wrong;
}

void changeGradient(Term terms[] int sampleNum map* g)
{
for (int i=0; i {
map::iterator it = terms[i].pairs.begin();
for (; it!=terms[i].pairs.end(); it++)
{
//根据梯度下降的公式应该是(*g)[it->first]+=it-second
//由于it->second都是值比较小的数导致梯度下降不明显
//所以这里使用 +=和-= 

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

     文件       4671  2011-06-16 16:39  机器学习_梯度下降算法实现\gradient.cpp

     文件     536475  1997-11-17 18:11  机器学习_梯度下降算法实现\test.dat

     文件    2154343  1997-11-17 18:12  机器学习_梯度下降算法实现\train.dat

     文件       1869  2011-06-16 17:22  机器学习_梯度下降算法实现\实验报告.txt

     目录          0  2011-06-16 17:22  机器学习_梯度下降算法实现

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

              2697358                    5


评论

共有 条评论