从txt中读取矩阵和三元线性回归的C++实现_第1页
从txt中读取矩阵和三元线性回归的C++实现_第2页
从txt中读取矩阵和三元线性回归的C++实现_第3页
从txt中读取矩阵和三元线性回归的C++实现_第4页
从txt中读取矩阵和三元线性回归的C++实现_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、三元线性回归主要是研究因变量y与三个自变量之间的线性关系。其数学模型为:y=a0+a1x1+a2k2+a3x3具体参考线性回归相关理论计算公式。(理论部分链接由于审核问题不便给出,请自行百度)本次代码数据均来源文库中的数据,并经过验证可行。下面给出其C+实现代码:/*功能:从.txt中读取一组n*4(n3)的矩阵,(或者自己在代码中直接输入数组矩阵)计算其线性回归系数并计算其相关系数*/#include #include #include #include using namespace std;/ 打印二元数组,arr表示数组首地址,row表示行(1表示一元数组),col表示列 void p

2、rintArray(double* arr,int row,int col);/ 获取.txt文件中矩阵的列数 int getColumns(const char * fileName);/ 获取.txt文件中矩阵的行数 int getRows(const char * fileName);/ 计算方程组的系数 row,col表示行列,a,b表示角标 double Lab(double *arr,int row,int col,int a,int b);/ 计算三元数组行列式的值 double det(double *arr,int n=3);/ 计算x的n次方 int power(int x

3、,unsigned int n);int main()double data;int Col,Row;int i,j;char c;/ 从arr.txt中读取矩阵/*矩阵存储格式如下: 1 1 1 11 1 1 1. . . . . . . . . .1 1 1 1 一二三四列分别代表x1,x2,x3,y*/ ifstream fin(arr.txt,ios:in);/ 获取矩阵的行和列 Col = getColumns(arr.txt);Row = getRows(arr.txt);/ 输出 cout 矩阵的列数是: Col 矩阵的行数是: Row;cout endl;double arrR

4、owCol;/ 数组初始化为0 for(i=0;i data;arrij = data;+j;/ 判断是否换行 c=fin.peek(); if(n=c) +i;j = 0; / 打印输出数组printArray(arr0,Row,Col);fin.close();cout endl;/ 计算线性方程组系数 double labArray44=0;for(i=0;i3;i+)for(j=0;j4;j+)labArrayij = Lab(arr0,Row,Col,i,j);labArray33 = Lab(arr0,Row,Col,3,3);/ printprintArray(labArray0

5、,4,4);cout endl;/ 计算线性方程组的解 double fenmu = 0;double fenzi3;double b33=labArray00,labArray01,labArray02,labArray10,labArray11,labArray12,labArray20,labArray21,labArray22;double tmp33;memcpy(tmp,b,sizeof(double)*9);fenmu = det(b0,3);cout fenmu endl;for(i = 0;i 3; +i)memcpy(tmp,b ,sizeof(double)*9);for

6、(j = 0; j 3 ;+j)tmpji = labArrayj3;fenzii = det(tmp0,3);printArray(fenzi,1,3);double a4=0;for(i = 0; i 3; +i)ai+1 = fenzii / fenmu;/ 计算a0 double sumX1=0,sumX2=0,sumX3=0,sumY=0;for(i = 0; i Row; +i)sumX1 += arri0;sumX2 += arri1;sumX3 += arri2;sumY += arri3;a0 = sumY/Row - sumX1*a1/Row - sumX2*a2/Row

7、- sumX3*a3/Row;printArray(a,1,4);cout endl;cout 线性关系为: ;cout y = a0 + a1; cout x1 + a2 x2 + a3 x3 endl;cout endl;/ 计算相关系数 double r=0,S=0;r = sqrt( (a1*labArray00+a2*labArray10+a3*labArray22) / labArray33 );S=sqrt(labArray33 (a1*labArray00+a2*labArray10+a3*labArray22) / (Row - Col) );cout 相关系数 r : se

8、tw(10) r endl; cout 剩余标准差 S : setw(10) S endl;cout endl;return 0;/ 打印二元数组,arr表示数组首地址,row表示行(1表示一元数组),col表示列 void printArray(double* arr,int row=1,int col=1)int i,j;for(i=0;irow;i+)for(j=0;jcol;j+)cout setw(10) *(arr+i*col+j); cout endl;cout tmp; +col; c = ifs.peek(); ifs.close(); return col; / 获取.tx

9、t文件中矩阵的行数 int getRows(const char *fileName) ifstream ifs; int row=0;string tmp; ifs.open(fileName,std:ios:in); if(ifs) while(getline(ifs,tmp,n) +row; ifs.close(); return row ; / 计算方程组的系数 row,col表示行列,a,b表示角标 double Lab(double *arr,int row,int col,int a,int b)int i=0;double sum1=0,sum2=0,asum=0,bsum=0

10、;for(i = 0;i row; +i)sum1 += (*(arr+i*col+a) * (*(arr+i*col+b);asum += *(arr+i*col+a);bsum += *(arr+i*col+b); sum2 = (asum*bsum)/row;return sum1-sum2; / 计算三元数组行列式的值double det(double *arr,int n=3)double result = 0;double det1,det2,det3;int i;det1 = (*arr) * (*(arr+1*n+1) * (*(arr+2*n+2) - (*(arr+1*n+2) * (*(arr+2*n+1);det2 = (*(arr+1) * (*(arr+1*n+0) * (*(arr+2*n+2) - (*(arr+1*n+2) * (*(arr+2*n+0);det3 = (*(arr+2) * (*(arr+1*n+0) * (*(arr+2*n+1) - (*(arr+1*n+1) * (

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论