勾配降下アルゴリズムは多重線形回帰問題c++の実現を解決する
4596 ワード
データの標準化されたバージョンがなく、効率が非常に低く、トレーニングの結果がよくありません.
次に、データを正規化したバージョンを示します.より効率的です.
トレーニングデータはここにあります.
転載先:https://www.cnblogs.com/zyf3855923/p/11460864.html
#include
#define maxn 105
#include
#include
using namespace std;
int n,m; //n ,m
double theta[maxn];//
double temp[maxn];
double data[maxn][maxn];//
double Y[maxn];//
double hx[maxn];
const double eps=1e-9;
double alpha=0.00001;
double h(int x)//
{
double res=0;
for(int i=0;i<=n;++i)
{
res+=theta[i]*data[x][i];
}
return res;
}
double J_theta()// cost function
{
double res=0;
for(int i=1;i<=m;++i)
{
res+=(h(i)-Y[i])*(h(i)-Y[i]);
}
res=res/(2*m);
return res;
}
double f(int x)//
{
double res=0;
for(int i=1;i<=m;++i)
{
res+=hx[i]*data[i][x];
}
res/=m;
return res;
}
void Gradient_Descent()//
{
for(int i=1;i<=m;++i)
{
data[i][0]=1;
}
for(int i=0;i<=n;++i)
{
theta[i]=1;//
}
double now,nex;
do
{
now=J_theta();
for(int i=1;i<=m;++i)
{
hx[i]=h(i)-Y[i];
}
for(int i=0;i<=n;++i)
{
temp[i]=theta[i]-alpha*f(i);
}
for(int i=0;i<=n;++i)
{
theta[i]=temp[i];
}
nex=J_theta();
//cout<eps);
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
cin>>data[i][j];
}
}
for(int i=1;i<=m;++i)
{
cin>>Y[i];
}
Gradient_Descent();
for(int i=0;i<=n;++i)
{
printf("%.2lf
",theta[i]);
}
return 0;
}
次に、データを正規化したバージョンを示します.より効率的です.
#include
#define maxn 105
#include
#include
#include
using namespace std;
int n,m; //n ,m
double theta[maxn];//
double temp[maxn];
double data[maxn][maxn];//
double Y[maxn];//
double hx[maxn];
const double eps=1e-9;
double alpha=0.001;
double ave[maxn];
void Mean_Normaliazation()
{
for(int i=0;i<=n;++i)
{
double maxim=-1e9;
double minum=1e9;
double tmp=0;
for(int j=1;j<=m;++j)
{
tmp+=data[j][i];
}
tmp/=m;
double mb=0;
for (int j=1;j<=m;++j)
{
mb+=(data[j][i]-tmp)*(data[j][i]-tmp);
}
mb/=m;
mb=sqrt(mb);
for(int j=1;j<=m;++j)
{
data[j][i]=(data[j][i]-tmp)/mb;
}
}
double maxim=-1e9;
/*double tmp=0;
for(int i=1;i<=m;++i)
{
maxim=max(Y[i],maxim);
tmp+=Y[i];
}
tmp/=m;
for(int i=1;i<=m;++i)
{
Y[i]=(Y[i]-tmp)/maxim;
}*/
}
double h(int x)//
{
double res=0;
for(int i=0;i<=n;++i)
{
res+=theta[i]*data[x][i];
}
return res;
}
double J_theta()// cost function
{
double res=0;
for(int i=1;i<=m;++i)
{
res+=(h(i)-Y[i])*(h(i)-Y[i]);
}
res=res/(2*m);
return res;
}
double f(int x)//
{
double res=0;
for(int i=1;i<=m;++i)
{
res+=hx[i]*data[i][x];
}
res/=m;
return res;
}
void Gradient_Descent()//
{
for(int i=1;i<=m;++i)
{
data[i][0]=1;
}
for(int i=0;i<=n;++i)
{
theta[i]=1;//
}
double now,nex;
do
{
now=J_theta();
for(int i=1;i<=m;++i)
{
hx[i]=h(i)-Y[i];
}
for(int i=0;i<=n;++i)
{
temp[i]=theta[i]-alpha*f(i);
}
for(int i=0;i<=n;++i)
{
theta[i]=temp[i];
}
nex=J_theta();
//cout<eps);
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
cin>>data[i][j];
}
}
for(int i=1;i<=m;++i)
{
cin>>Y[i];
}
Mean_Normaliazation();
Gradient_Descent();
for(int i=0;i<=n;++i)
{
printf("%.2lf
",theta[i]);
}
return 0;
}
トレーニングデータはここにあります.
2 10
100 4
50 3
100 4
100 2
50 2
80 2
75 3
65 4
90 3
90 2
9.3 4.8 8.9 6.5 4.2 6.2 7.4 6.0 7.6 9.3 4.8 8.9 6.5
転載先:https://www.cnblogs.com/zyf3855923/p/11460864.html