ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:57.62KB ,
资源ID:14498605      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14498605.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言版的线性回归函数.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

C语言版的线性回归函数.docx

1、C语言版的线性回归函数C语言版的线性回归分析函数 分类: C/C+ 2007-08-03 23:39 13840人阅读 评论(31) 收藏 举报 语言c数学计算delphisystem 前几天,清理出一些十年以前DOS下的程序及代码,看来目前也没什么用了,想打个包刻在光碟上,却发现有些代码现在可能还能起作用,其中就有计算一元回归和多元回归的代码,一看代码文件时间,居然是1993年的,于是稍作整理,存放在这,分析虽不十分完整,但一般应用是没问题的,最起码,可提供给那些刚学C的学生们参考。先看看一元线性回归函数代码:/求线性回归方程:Y=a+bx/dadarows*2数组:X,Y;rows:数据行

2、数;a,b:返回回归系数/SquarePoor4:返回方差分析指标:回归平方和,剩余平方和,回归平方差,剩余平方差/返回值:0求解成功,-1错误intLinearRegression(double*data,introws,double*a,double*b,double*SquarePoor)intm;double*p,Lxx=0.0,Lxy=0.0,xa=0.0,ya=0.0;if(data=0|a=0|b=0|rows1)return-1;for(p=data,m=0;mrows;m+)xa+=*p+;ya+=*p+;xa/=rows;/X平均值ya/=rows;/Y平均值for(p=d

3、ata,m=0;mrows;m+,p+=2)Lxx+=(*p-xa)*(*p-xa);/Lxx=Sum(X-Xa)平方)Lxy+=(*p-xa)*(*(p+1)-ya);/Lxy=Sum(X-Xa)(Y-Ya)*b=Lxy/Lxx;/b=Lxy/Lxx*a=ya-*b*xa;/a=Ya-b*Xaif(SquarePoor=0)return0;/方差分析SquarePoor0=SquarePoor1=0.0;for(p=data,m=0;mrows;m+,p+)Lxy=*a+*b*p+;SquarePoor0+=(Lxy-ya)*(Lxy-ya);/U(回归平方和)SquarePoor1+=(*

4、p-Lxy)*(*p-Lxy);/Q(剩余平方和)SquarePoor2=SquarePoor0;/回归方差SquarePoor3=SquarePoor1/(rows-2);/剩余方差return0;为了理解代码,把几个与代码有关的公式写在下面(回归理论和公式推导就免了,网上搜索到处是,下面的公式图片也是网上搜的,有些公式图形网上没找到或者不合适,可参见后面多元回归中的公式):1、回归方程式:2、回归系数: 其中: 3、回归平方和:4、剩余平方和:实例计算:doubledata1122=/XY187.1,25.4,179.5,22.8,157.0,20.6,197.0,21.8,239.4,3

5、2.4,217.8,24.4,227.1,29.3,233.4,27.9,242.0,27.8,251.9,34.2,230.0,29.2,271.8,30.0;voidDisplay(double*dat,double*Answer,double*SquarePoor,introws,intcols)doublev,*p;inti,j;printf(回归方程式: Y=%.5lf,Answer0);for(i=1;icols;i+)printf(+%.5lf*X%d,Answeri,i);printf( );printf(回归显著性检验: );printf(回归平方和:%12.4lf回归方差:

6、%12.4lf ,SquarePoor0,SquarePoor2);printf(剩余平方和:%12.4lf剩余方差:%12.4lf ,SquarePoor1,SquarePoor3);printf(离差平方和:%12.4lf标准误差:%12.4lf ,SquarePoor0+SquarePoor1,sqrt(SquarePoor3);printf(F检验:%12.4lf相关系数:%12.4lf ,SquarePoor2/SquarePoor3,sqrt(SquarePoor0/(SquarePoor0+SquarePoor1);printf(剩余分析: );printf(观察值估计值剩余值剩

7、余平方 );for(i=0,p=dat;irows;i+,p+)v=Answer0;for(j=1;jcols;j+,p+)v+=*p*Answerj;printf(%12.2lf%12.2lf%12.2lf%12.2lf ,*p,v,*p-v,(*p-v)*(*p-v);system(pause);intmain()doubleAnswer2,SquarePoor4;if(LinearRegression(double*)data1,12,&Answer0,&Answer1,SquarePoor)=0)Display(double*)data1,Answer,SquarePoor,12,2)

8、;return0; 运行结果:上 面的函数和例子程序不仅计算了回归方程式,还计算了显著性检验指标,例如F检验指标,我们可以在统计F分布表上查到 F0.01(1,10)=10.04(注:括号里的1,10分别为回归平方和和剩余平方和所拥有的自由度),小于计算的F检验值25.94,可以认为该回 归例子高度显著。如果使用图形界面,可以根据原始数据和计算结果绘制各种图表,如散点图、趋势图、控制图等。很多非线性方程可以借助数学计算,转化为直线方程进行回归分析。同一元线性回归相比,多元线性回归分析代码可就复杂多了,必须求解线性方程,因此本代码中包含一个可独立使用的线性方程求解函数:voidFreeData(

9、double*dat,double*d,intcount)inti,j;free(d);for(i=0;icount;i+)free(dati);free(dat);/解线性方程。datacount*(count+1)矩阵数组;count:方程元数;/Answercount:求解数组。返回:0求解成功,-1无解或者无穷解intLinearEquations(double*data,intcount,double*Answer)intj,m,n;doubletmp,*dat,*d=data;dat=(double*)malloc(count*sizeof(double*);for(m=0;mco

10、unt;m+,d+=(count+1)datm=(double*)malloc(count+1)*sizeof(double);memcpy(datm,d,(count+1)*sizeof(double);d=(double*)malloc(count+1)*sizeof(double);for(m=0;mcount-1;m+)/如果主对角线元素为0,行交换for(n=m+1;ncount&datmm=0.0;n+)if(datnm!=0.0)memcpy(d,datm,(count+1)*sizeof(double);memcpy(datm,datn,(count+1)*sizeof(dou

11、ble);memcpy(datn,d,(count+1)*sizeof(double);/行交换后,主对角线元素仍然为0,无解,返回-1if(datmm=0.0)FreeData(dat,d,count);return-1;/消元for(n=m+1;ncount;n+)tmp=datnm/datmm;for(j=m;j=count;j+)datnj-=tmp*datmj;for(j=0;j=0;m-)for(j=count-1;jm;j-)dm+=Answerj*datmj;Answerm=(datmcount-dm)/datmm;FreeData(dat,d,count);return0;/

12、求多元回归方程:Y=B0+B1X1+B2X2+.BnXn/datarows*cols二维数组;X1i,X2i,.Xni,Yi(i=0torows-1)/rows:数据行数;cols数据列数;Answercols:返回回归系数数组(B0,B1.Bn)/SquarePoor4:返回方差分析指标:回归平方和,剩余平方和,回归平方差,剩余平方差/返回值:0求解成功,-1错误intMultipleRegression(double*data,introws,intcols,double*Answer,double*SquarePoor)intm,n,i,count=cols-1;double*dat,*

13、p,a,b;if(data=0|Answer=0|rows2|cols2)return-1;dat=(double*)malloc(cols*(cols+1)*sizeof(double);dat0=(double)rows;for(n=0;ncount;n+)/n=0tocols-2a=b=0.0;for(p=data+n,m=0;mrows;m+,p+=cols)a+=*p;b+=(*p*p);datn+1=a;/dat0,n+1=Sum(Xn)dat(n+1)*(cols+1)=a;/datn+1,0=Sum(Xn)dat(n+1)*(cols+1)+n+1=b;/datn+1,n+1=

14、Sum(Xn*Xn)for(i=n+1;icount;i+)/i=n+1tocols-2for(a=0.0,p=data,m=0;mrows;m+,p+=cols)a+=(pn*pi);dat(n+1)*(cols+1)+i+1=a;/datn+1,i+1=Sum(Xn*Xi)dat(i+1)*(cols+1)+n+1=a;/dati+1,n+1=Sum(Xn*Xi)for(b=0.0,m=0,p=data+n;mrows;m+,p+=cols)b+=*p;datcols=b;/dat0,cols=Sum(Y)for(n=0;ncount;n+)for(a=0.0,p=data,m=0;mro

15、ws;m+,p+=cols)a+=(pn*pcount);dat(n+1)*(cols+1)+cols=a;/datn+1,cols=Sum(Xn*Y)n=LinearEquations(dat,cols,Answer);/计算方程式/方差分析if(n=0&SquarePoor)b=b/rows;/b=Y的平均值SquarePoor0=SquarePoor1=0.0;p=data;for(m=0;mrows;m+,p+)for(i=1,a=Answer0;i 0.0) SquarePoor3 = SquarePoor1 / (rows - cols); / 剩余方差else SquarePoo

16、r3 = 0.0;free(dat);returnn;为了理解代码,同样贴几个主要公式在下面,其中回归平方和和剩余平方和公式和一元回归相同:1、回归方程式:, 2、回归系数方程组:3、F检验:4、相关系数:,其中,Syy是离差平方和(回归平方和与剩余平方和之和)。该公式其实就是U/(U+Q)的平方根(没找到这个公式的图)。5、回归方差:U / m,m为回归方程式中自变量的个数(没找到图)。6、剩余方差:Q / (n - m - 1),n为观察数据的样本数,m同上(没找到图)。7、标准误差:也叫标准误,就是剩余方差的平方根(没找到图)。下面是一个多元回归的例子:doubledata155=/X1

17、X2X3X4Y316,1536,874,981,3894,385,1771,777,1386,4628,299,1565,678,1672,4569,326,1970,785,1864,5340,441,1890,785,2143,5449,460,2050,709,2176,5599,470,1873,673,1769,5010,504,1955,793,2207,5694,348,2016,968,2251,5792,400,2199,944,2390,6126,496,1328,749,2287,5025,497,1920,952,2388,5924,533,1400,1452,2093

18、,5657,506,1612,1587,2083,6019,458,1613,1485,2390,6141,;voidDisplay(double*dat,double*Answer,double*SquarePoor,introws,intcols)doublev,*p;inti,j;printf(回归方程式: Y=%.5lf,Answer0);for(i=1;icols;i+)printf(+%.5lf*X%d,Answeri,i);printf( );printf(回归显著性检验: );printf(回归平方和:%12.4lf回归方差:%12.4lf ,SquarePoor0,Squar

19、ePoor2);printf(剩余平方和:%12.4lf剩余方差:%12.4lf ,SquarePoor1,SquarePoor3);printf(离差平方和:%12.4lf标准误差:%12.4lf ,SquarePoor0+SquarePoor1,sqrt(SquarePoor3);printf(F检验:%12.4lf相关系数:%12.4lf ,SquarePoor2/SquarePoor3,sqrt(SquarePoor0/(SquarePoor0+SquarePoor1);printf(剩余分析: );printf(观察值估计值剩余值剩余平方 );for(i=0,p=dat;irows;i+,p+)v=Answer0;for(j=1;jcols;j+,p+)

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2