多元线性回归分析

当三个或三个以上的变量之间存在着线性的相关关系,也就是说一个因变量与两个或两个以上的自变量线性相关,这种情况的回归分析叫做多元线性回归分析。

在一个过程中,有一个输出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;
}










                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值