0
点赞
收藏
分享

微信扫一扫

梯度下降法解多元线性回归(C++) - CodeFight compute


题意 :


题解:





  但问题的关键是在开始实现的时候,我发现总是不收敛,cost function随着每次迭代变化却越来越大(有种每次都是矫枉过正的感觉)。在想是不是步长rate设置得不够好,但尝试了很多不同的步长,都无法得到想要的结果。最终发现是自己漏了一个很重要的步骤,一定要做归一化!!如果数据集中每个变量差别很大,或者一个数据的每个特征取值相差很大,会很难找到合适的步长的。归一化有很多种方法,我的处理是取测试集的平均值。

double rd(double x){
char buff[100];
double a;
sprintf(buff,"%.2lf",x);
sscanf(buff,"%lf",&a);
return a;
}
int compute(vector<vector<int>> engineers, vector<int> candidate) {
int n=engineers.size();
double v[3][5],sum[3],E[n][3];
for (int j=0;j<3;j++){
sum[j]=1;
for (int i=0;i<n;i++)
sum[j]+=engineers[i][j];
sum[j]/=n;
}
sum[0]=1;
for (int i=0;i<n;i++)
for (int j=0;j<3;j++)
E[i][j]=engineers[i][j]/sum[j];
memset(v,0,sizeof(v));
double h[3],p[3],rate=0.01,pre=1e+50,now;
for (int i=0;i<3;i++)
h[i]=0;
for (int times=0;times<2000000;times++){
for (int i=0;i<3;i++)
p[i]=h[i];
for (int i=0;i<n;i++){
double d = E[i][0] - (p[0] + p[1]*E[i][1] + p[2]* E[i][2]);
h[0]+=rate*d;
for (int j=1;j<3;j++)
h[j]+=rate*E[i][j]*d;
}
}
h[1]/=sum[1];
h[2]/=sum[2];
for (int i=0;i<3;i++)
h[i]=rd(h[i]);
return (int)(h[0] + candidate[0]*h[1] + candidate[1]*h[2]);
}



举报

相关推荐

0 条评论