对于求一个类似于y=ax1+bx2的方程,控制变量进行一元线性回归和多元线性回归求系数,哪个更好?
关于多元线性回归方程和一元线性回归方程
是依据误差的平方和最小这个条件来求回归系数的。
比如一元的,y=ax+b
E=∑(y-yi)^2=∑(axi+b-yi)^2
将a,b看成变量,则E的最小值需有其偏导数为0,即
E'a=2∑(axi+b-yi)xi=0
E'b=2∑(axi+b-yi)=0
由上面两个方程即可解出a,b.
多元的时候是一样的处理,比如两元:y=ax+bu+c
E=∑(y-yi)^2=∑(axi+bui+c-yi)^2
将a,b,c看成变量,则E的最小值需有其偏导数为0,即
E'a=2∑(axi+bui+c-yi)xi=0
E'b=2∑(axi+bui+c-yi)ui=0
E'c=2∑(axi+bui+c-yi)=0
由上面三个方程即可解出a,b,c.
急求一元线性回归的C语言程序!!!
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void analysis(double * x, double * y, int n) {
double d1, d2, d3,a,b;
double sumx,sumy,sumxx,sumyy,sumxy,mx,my,mxx,myy,mxy;
int i;
// 变量的初始化
d1 = d2 = d3 =sumx=sumy=sumxx=sumyy=sumxy=0.0;
// 计算x、y的平均值
for (i = 0; i < n; i++) {
sumx += x[i];
sumy += y[i];
}
mx = sumx / n;
my = sumy / n;
printf("mx=%f my=%f\n",mx,my);
// 计算x、y平和x*y的平均值
for (i = 0; i < n; i++) {
sumxx += x[i]*x[i];
sumyy += y[i]*y[i];
sumxy += x[i]*y[i];
}
mxx = sumxx / n;
myy = sumyy / n;
mxy = sumxy / n;
printf("mxx=%f myy=%f mxy=%f\n",mxx,myy,mxy);
//
a=(n*sumxy-sumx*sumy)/(n*sumxx-sumx*sumx);
b=(sumxx*sumy-sumx*sumxy)/(n*sumxx-sumx*sumx);
printf("a=%f b=%f\n",a,b);
// 计算相关系数的数据组成部分
for (i = 0; i < n; i++) {
d1 += (x[i] - mx) * (y[i] - my);
d2 += (x[i] - mx) * (x[i] - mx);
d3 += (y[i] - my) * (y[i] - my);
}
double r = d1 / sqrt(d2 * d3);
//
printf("相关系数r=%f\n",r);
//
double *yy=(double*)malloc(sizeof(double)*n);
double sumerrorsquare=0,error;
for(i=0;i<n;i++) {
yy[i]=a*x[i]+b;
sumerrorsquare+=(yy[i]-y[i])*(yy[i]-y[i]);
}
error=sqrt(sumerrorsquare/(n-1));
printf("标准偏差s(y)=%f\n",error);
}
int main(){
double x[4]={1.0,3.0,3.0,9.0};
double y[4]={11.0,12.0,13.0,14.0};
analysis(x,y,4);
return 0;
}
求线性回归方程
方法同二元线性回归方程。
令Z=∑(Y-Yi)^2=∑(a-bX1i+cX2i-Yi)^2,
求以下三元一次方程组的解即得a,b,c:
Z'a=2∑(a-bX1i+cX2i-Yi)=0
Z'b=-2∑X1i(a-bX1i+cX2i-Yi)=0
Z'c=2∑X2i(a-bX1i+cX2i-Yi)=0
求一元线性回归方程
y=0.8319x+27.603 其中a=0.8319 ,b=27.603 这个可以在Excel中用图表的方式直接表现出来