C++代码实现梯度下降算法并给出测试用例

此处仅给出代码实现,具体原理及过程请看前面的博文

注:本测试题本机测试通过,但不知为何在OJ上老是出现运行时错误提示,有大神看出问题请指教~~

测试文件输入格式如下:

2 10 0.01 102104 3 3999001600 3 3299002400 3 3690001416 2 2320003000 4 5399001985 4 2999001534 3 3149001427 3 1989991380 3 2120001494 3 242500含义如下:

特征值的归一化方法与之前的博文不太一样,采用了另一种归一方式:

具体的实现代码如下:

#include <iostream>#include <stdio.h>#include <math.h>using namespace std;double predict(double* w,double* data,int feature_num){double sum=0;for(int i=0;i<feature_num;i++){sum+=w[i]*data[i];}return sum;}double Theta(double **training_set,int featue_num,int training_num,double* w){double sum=0;for(int i=0;i<training_num;i++){sum+=(training_set[i][featue_num]-predict(w,training_set[i],featue_num))*(training_set[i][featue_num]-predict(w,training_set[i],featue_num));}return sum/(2*training_num);}void gradient_descent(double** training_set,int feature_num,int training_num,double* w,double a,int iterator_time){while(iterator_time–){double* del_theta=new double[feature_num];for(int i=0;i<feature_num;i++){del_theta[i]=0;for(int j=0;j<training_num;j++){del_theta[i]+=(predict(w,training_set[j],feature_num)-training_set[j][feature_num])*training_set[j][i];}}//w[i]的更新必须等所有的del_theta测算出来了才可以!不然更新的会影响没更新的//上述问题在代码内表示即是下面的for循环不能和上面的合并!for(int i=0;i<feature_num;i++)w[i]-=a*del_theta[i]/(double)training_num;printf("%.3lf\n", Theta(training_set,feature_num,training_num,w));delete[] del_theta;}for(int i=0;i<feature_num-1;i++){printf("%.3lf ", w[i]);}printf("%.3lf\n", w[feature_num-1]);return;}void feature_normalize(double **feature_set,int feature_num,int training_num){//特征归一化,此处特征归一化方法略有不同于梯度下降那篇的特征归一化方法//问题:特征归一化Y的值需要归一化么?不需要!double *average=new double[feature_num];double *stanrd_divition=new double[feature_num];for(int i=1;i<feature_num;i++){double sum=0;for(int j=0;j<training_num;j++){sum+=feature_set[j][i];}average[i]=sum/training_num;}for(int i=1;i<feature_num;i++){double sum=0;for(int j=0;j<training_num;j++){sum+=(feature_set[j][i]-average[i])*(feature_set[j][i]-average[i]);}stanrd_divition[i]=sqrt((sum/(training_num-1)));}for(int i=1;i<feature_num;i++)for(int j=0;j<training_num;j++){feature_set[j][i]=(feature_set[j][i]-average[i])/(double)stanrd_divition[i];}delete[] stanrd_divition;delete[] average;}int main(){int feature_num,training_num,times;double a;//自己测试时请修改路径 freopen("in.txt","r",stdin);while(cin>>feature_num>>training_num>>a>>times){double **featurn_set=new double*[training_num];for(int i=0;i<=training_num;i++){featurn_set[i]=new double[feature_num+2];}for(int i=0;i<training_num;i++) featurn_set[i][0]=1;for(int i=0;i<training_num;i++){for(int j=1;j<=feature_num+1;j++){cin>>featurn_set[i][j];}}//在特征标准化的时候w0完全一样,就直接赋值为一,不要进行标准化了,不然会出错feature_normalize(featurn_set,feature_num+1,training_num);for(int i=0;i<training_num;i++) featurn_set[i][0]=1;double* w=new double[feature_num];for(int i=0;i<=feature_num;i++)w[i]=0;gradient_descent(featurn_set,feature_num+1,training_num,w,a,times);for(int i=0;i<feature_num+2;i++) delete[] featurn_set[i];delete[] featurn_set;delete[] w;}return 0;}

,空虚无聊的时候就读书,但一定得有自己的生活目标和计划。

C++代码实现梯度下降算法并给出测试用例

相关文章:

你感兴趣的文章:

标签云: