当三个或三个以上的变量之间存在着线性的相关关系,也就是说一个因变量与两个或两个以上的自变量线性相关,这种情况的回归分析叫做多元线性回归分析。
在一个过程中,有一个输出y和k个输入xj,j=1,2,3,...k。这个过程可以用下述模型描述,次式为k个独立变量的多元线性回归模型。
称为回归系数。如果数据矩阵表示为
,
,
,则估计值可用以下矩阵方程求得
。
为了衡量回归效果,还需要计算以下5个量:
偏差平方和
平均标准差
复相关系数 ,式中
,当r接近于1时,说明相对误差
接近于零,线性回归效果好
偏相关系数 式中
,vj越大时,说明Bj对于y的作用月明显.
回归平方和
与一元线性回归相同,多元线性回归同样可用最小二乘法求解.
我们可以用多元线性方程:y=a+b1x1+b2x2+b3x3+...+bnxn来描述。
为使偏差平方和取得最小值,分别求偏导数
,并让他们等于零,整理得方程
,通过求解此线性方程组可得回归直线的系数。
多元线性回归的实现:
//列选主元高斯消去法求解线性方程组
//a:线性方程组的增广矩阵
//N:N阶线性方程组
//result:方程组的解
bool LinearEquations(double *a,int N,double *result)
{
double maxValue;
int nPos=0;
for(int k=0;k<N-1;k++)
{
maxValue=abs(a[k*(N+1)+k]);
nPos=k;
for(int i=k+1;i<N;i++)
{
//寻找每一列中的最大值所在的行
if(abs(a[i*(N+1)+k])>maxValue)
{
maxValue=abs(a[i*(N+1)+k]);
nPos=i;
}
}
if(maxValue!=0)
{
if(nPos!=k)
{
//交换第nPos行与第k行的元素
for(int l=0;l<N+1;l++)
{
double tmp=a[nPos*(N+1)+l];
a[nPos*(N+1)+l]=a[k*(N+1)+l];
a[k*(N+1)+l]=tmp;
}
}
}
else
{
printf("方程组无解\n");
return false;
}
//消元
for(int i=k+1;i<N;i++)
{
for(int j=k+1;j<N+1;j++)
{
a[i*(N+1)+j]-=a[i*(N+1)+k]/a[k*(N+1)+k]*a[k*(N+1)+j];
}
}
}
//回带求解
result[N-1]=a[(N-1)*(N+1)+N]/a[(N-1)*(N+1)+N-1];
for(int k=N-1-1;k>=0;k--)
{
double tmp=0;
for(int j=k+1;j<N;j++)
{
tmp+=a[k*(N+1)+j]*result[j];
}
result[k]=(a[k*(N+1)+N]-tmp)/a[k*(N+1)+k];
}
return true;
}
//x:测试点点的增广矩阵,二维数组
//x11,x12,x13...x1n,y1
//................
//xn1,xn2,xn3....xnn,yn
//M:测试点得行数
//N:列数
void MultipleLinearRegression(double *x,int M,int N,double *y)
{
//回归系数
double *RegressionCoefficient=new double[N];
double *pBuffer=(double*)malloc(sizeof(double)*M*(N+1));
double **L=(double**)malloc(sizeof(double*)*M);
memset(pBuffer,0,sizeof(double)*M*(N+1));
for(int i=0;i<M;i++)
{
L[i]=pBuffer+i*(N+1);
}
L[0][0]=M;
double a,b,c;
for(int i=0;i<N-1;i++)
{
a=b=c=0;
for(int j=0;j<M;j++)
{
a+=x[j*N+i];
c+=x[j*N+i]*x[j*N+N-1];
b+=x[j*N+i]*x[j*N+i];
}
L[0][i+1]=a;
L[i+1][0]=a;
L[i+1][i+1]=b;
for(int z=i+1;z<N;z++)
{
a=0;
for(int j=0;j<M;j++)
{
a+=x[j*N+i]*x[j*N+z];
}
L[i+1][z+1]=a;
L[z+1][i+1]=a;
}
L[i+1][N]=c;
}
L[0][N]=0;
for(int i=0;i<M;i++)
{
L[0][N]+=x[i*N+N-1];
}
LinearEquations((double*)&L[0][0],N,RegressionCoefficient,N);
free(L);
free(pBuffer);
delete []RegressionCoefficient;
}
//测试
int main()
{
double x[]={1.1,2.0,3.2,10.1,
1.0,2.0,3.2,10.2,
1.2,1.8,3.0,10.0,
1.2,1.8,3.0,10.1,
1.1,1.9,2.9,10.1,
0.9,2.1,2.9,10.0};
MultipleLinearRegression(t2,6,4,NULL);
return 0;
}