最小二乘法
2010-05-19 21:02
99 查看
#include <iostream>
using namespace std;
float gs(float a[10][10],float b[10],int n )//
{int i,j,k,l;
float s;
k=1;
while(k!=n+1)
{
if(a[k][k]!=0)
{
for(i=k+1;i<=n+1;i++)
{
a[i][k]=a[i][k]/a[k][k];
b[i]=b[i]-a[i][k]*b[k];
for(j=k+1;j<=n+1;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
}
k=k+1;
}
for(k=n+1;k>=1;k--)
{
s=0;
for(l=k+1;l<=n+1;l++)
s=s+a[k][l]*b[l];
b[k]=(b[k]-s)/a[k][k];
}
return 0;
}
void generateC(float c[10][10],float x[10],int m,int n)//生成中间矩阵C
{
for(int i=1;i<=m;i++)
{c[i][1]=1;
for(int j=2;j<=n+1;j++)
c[i][j]=x[i]*c[i][j-1];
}
}
void juzhenT(float ct[10][10],float c[10][10],int m,int n)//生成矩阵C的转置矩阵
{
for(int i=1;i<=n+1;i++)
for(int j=1;j<=m;j++)
ct[i][j]=c[j][i];
}
int main(void)
{float x[10],y[10],c[10][10],ct[10][10],A[10][10],B[10];
int m,n,i,j;
cout<<"请输入样本数据的个数和未知数的最高次方数"<<endl;
cin>>m>>n;
cout<<"x[i]"<<endl;
for(i=1;i<=m;i++)
cin>>x[i];
cout<<"y[i]"<<endl;
for(i=1;i<=m;i++)
cin>>y[i];
generateC(c,x,m,n);
juzhenT(ct,c,m,n);
for(i=1;i<=n+1;i++)//
for(int k=1;k<=n+1;k++)
{
A[i][k]=0;
for(j=1;j<=m;j++)
{
A[i][k]=A[i][k]+ct[i][j]*c[j][k];
}
}
for(i=1;i<=n+1;i++)//
{ B[i]=0;
for(j=1;j<=m;j++)
B[i]=B[i]+ct[i][j]*y[j];
}
gs(A,B,n );
for(i=1;i<=n+1;i++)
cout<<B[i]<<endl;
cout<<"这组数据的近似函数关系为:y="<<B[1]<<"+"<<B[2]<<"x"<<endl;
return 0;
}
using namespace std;
float gs(float a[10][10],float b[10],int n )//
{int i,j,k,l;
float s;
k=1;
while(k!=n+1)
{
if(a[k][k]!=0)
{
for(i=k+1;i<=n+1;i++)
{
a[i][k]=a[i][k]/a[k][k];
b[i]=b[i]-a[i][k]*b[k];
for(j=k+1;j<=n+1;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
}
k=k+1;
}
for(k=n+1;k>=1;k--)
{
s=0;
for(l=k+1;l<=n+1;l++)
s=s+a[k][l]*b[l];
b[k]=(b[k]-s)/a[k][k];
}
return 0;
}
void generateC(float c[10][10],float x[10],int m,int n)//生成中间矩阵C
{
for(int i=1;i<=m;i++)
{c[i][1]=1;
for(int j=2;j<=n+1;j++)
c[i][j]=x[i]*c[i][j-1];
}
}
void juzhenT(float ct[10][10],float c[10][10],int m,int n)//生成矩阵C的转置矩阵
{
for(int i=1;i<=n+1;i++)
for(int j=1;j<=m;j++)
ct[i][j]=c[j][i];
}
int main(void)
{float x[10],y[10],c[10][10],ct[10][10],A[10][10],B[10];
int m,n,i,j;
cout<<"请输入样本数据的个数和未知数的最高次方数"<<endl;
cin>>m>>n;
cout<<"x[i]"<<endl;
for(i=1;i<=m;i++)
cin>>x[i];
cout<<"y[i]"<<endl;
for(i=1;i<=m;i++)
cin>>y[i];
generateC(c,x,m,n);
juzhenT(ct,c,m,n);
for(i=1;i<=n+1;i++)//
for(int k=1;k<=n+1;k++)
{
A[i][k]=0;
for(j=1;j<=m;j++)
{
A[i][k]=A[i][k]+ct[i][j]*c[j][k];
}
}
for(i=1;i<=n+1;i++)//
{ B[i]=0;
for(j=1;j<=m;j++)
B[i]=B[i]+ct[i][j]*y[j];
}
gs(A,B,n );
for(i=1;i<=n+1;i++)
cout<<B[i]<<endl;
cout<<"这组数据的近似函数关系为:y="<<B[1]<<"+"<<B[2]<<"x"<<endl;
return 0;
}
相关文章推荐
- BP 神经网络中的基础算法之一 —— 最小二乘法(LS 算法)
- HDU 4307 Matrix 最小割 矩阵乘法展开
- Spark交替最小二乘法(ALS)
- 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导
- [机器学习]最小二乘法python代码
- 最小二乘法
- 线性回归之最小二乘法简要解析
- 矩阵链乘法求两矩阵相乘所需的最小次数(算法3.6&3.7)
- 机器学习(3)之最小二乘法的概率解释与局部加权回归
- 最小乘法次数
- 统计思维(实例9)——线性最小二乘法
- 线性最小二乘法
- 最小乘法次数
- 最小二乘法的再认识
- 普通最小二乘法的推导证明(转载)
- [协同过滤]:交替最小二乘法
- ZOJ 3609 Modular Inverse(求最小乘法逆元)
- 用c++写成的最小二乘法的源代码
- 最小二乘法(高斯)
- 用C语言实现最小二乘法算法