从txt中读取矩阵和三元线性回归的C++实现

上传人:liy****000 文档编号:115389605 上传时间:2019-11-13 格式:DOCX 页数:12 大小:18.53KB
返回 下载 相关 举报
从txt中读取矩阵和三元线性回归的C++实现_第1页
第1页 / 共12页
从txt中读取矩阵和三元线性回归的C++实现_第2页
第2页 / 共12页
从txt中读取矩阵和三元线性回归的C++实现_第3页
第3页 / 共12页
从txt中读取矩阵和三元线性回归的C++实现_第4页
第4页 / 共12页
从txt中读取矩阵和三元线性回归的C++实现_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《从txt中读取矩阵和三元线性回归的C++实现》由会员分享,可在线阅读,更多相关《从txt中读取矩阵和三元线性回归的C++实现(12页珍藏版)》请在金锄头文库上搜索。

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+

11、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) * (*(arr+2*n+0);result = det1 - det2 + det3;return result;/ 计算x的n次方 int power(int x,unsigned int n)int result = 1;if(0 = n)return 1;while(n)result *= x;-n;return r

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号