C语言做线性分析,C语言版的线性回归分析函数

前几天,清理出一些十年以前

DOS

下的程序及代码,看来目前也没什么用了,想打个包刻在光碟上,却发现有些代码现在可能还能起作用,其中就有计算一元回归和多元回归的代码,一看代码文件时间,居然是

1993

年的,于是稍作整理,存放在这,分析虽不十分完整,但一般应用是没问题的,最起码,可提供给那些刚学

C

的学生们参考。

先看看一元线性回归函数代码:

//

求线性回归方程:Y=a+bx

//

dada[rows*2]数组:X,Y;rows:数据行数;a,b:返回回归系数

//

SquarePoor[4]:返回方差分析指标:回归平方和,剩余平方和,回归平方差,剩余平方差

//

返回值:0求解成功,-1错误

int

LinearRegression(

double

*

data,

int

rows,

double

*

a,

double

*

b,

double

*

SquarePoor)

{

int

m;

double

*

p,Lxx

=

0.0

,Lxy

=

0.0

,xa

=

0.0

,ya

=

0.0

;

if

(data

==

0

||

a

==

0

||

b

==

0

||

rows

<

1

)

return

-

1

;

for

(p

=

data,m

=

0

;m

<

rows;m

++

)

{

xa

+=

*

p

++

;

ya

+=

*

p

++

;

}

xa

/=

rows;

//

X平均值

ya

/=

rows;

//

Y平均值

for

(p

=

data,m

=

0

;m

<

rows;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*Xa

if

(SquarePoor

==

0

)

return

0

;

//

方差分析

SquarePoor[

0

]

=

SquarePoor[

1

]

=

0.0

;

for

(p

=

data,m

=

0

;m

<

rows;m

++

,p

++

)

{

Lxy

=

*

a

+

*

b

*

*

p

++

;

SquarePoor[

0

]

+=

((Lxy

-

ya)

*

(Lxy

-

ya));

//

U(回归平方和)

SquarePoor[

1

]

+=

((

*

p

-

Lxy)

*

(

*

p

-

Lxy));

//

Q(剩余平方和)

}

SquarePoor[

2

]

=

SquarePoor[

0

];

//

回归方差

SquarePoor[

3

]

=

SquarePoor[

1

]

/

(rows

-

2

);

//

剩余方差

return

0

;

}

为了理解代码,把几个与代码有关的公式写在下面(回归理论和公式推导就免了,网上搜索到处是,下面的公式图片也是网上搜的,有些公式图形网上没找到或者不合适,可参见后面多元回归中的公式):

1、回归方程式:

2、回归系数:

其中:

3、回归平方和:

4、剩余平方和:

实例计算:

double

data1[

12

][

2

]

=

{

//

XY

{

187.1

,

25.4

},

{

179.5

,

22.8

},

{

157.0

,

20.6

},

{

197.0

,

21.8

},

{

239.4

,

32.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

}

};

void

Display(

double

*

dat,

double

*

Answer,

double

*

SquarePoor,

int

rows,

int

cols)

{

double

v,

*

p;

int

i,j;

printf(

"

回归方程式: Y=%.5lf

"

,Answer[

0

]);

for

(i

=

1

;i

<

cols;i

++

)

printf(

"

+%.5lf*X%d

"

,Answer[i],i);

printf(

"

"

);

printf(

"

回归显著性检验:

"

);

printf(

"

回归平方和:%12.4lf回归方差:%12.4lf

"

,SquarePoor[

0

],SquarePoor[

2

]);

printf(

"

剩余平方和:%12.4lf剩余方差:%12.4lf

"

,SquarePoor[

1

],SquarePoor[

3

]);

printf(

"

离差平方和:%12.4lf标准误差:%12.4lf

"

,SquarePoor[

0

]

+

SquarePoor[

1

],sqrt(SquarePoor[

3

]));

printf(

"

F检验:%12.4lf相关系数:%12.4lf

"

,SquarePoor[

2

]

/

SquarePoor[

3

],

sqrt(SquarePoor[

0

]

/

(SquarePoor[

0

]

+

SquarePoor[

1

])));

printf(

"

剩余分析:

"

);

printf(

"

观察值估计值剩余值剩余平方

"

);

for

(i

=

0

,p

=

dat;i

<

rows;i

++

,p

++

)

{

v

=

Answer[

0

];

for

(j

=

1

;j

<

cols;j

++

,p

++

)

v

+=

*

p

*

Answer[j];

printf(

"

%12.2lf%12.2lf%12.2lf%12.2lf

"

,

*

p,v,

*

p

-

v,(

*

p

-

v)

*

(

*

p

-

v));

}

system(

"

pause

"

);

}

int

main()

{

double

Answer[2

],SquarePoor[

4

];

if

(LinearRegression((

double

*

)data1,

12

,

&

Answer[

0

],

&

Answer[

1

],SquarePoor)

==

0

)

Display((

double

*

)data1,Answer,SquarePoor,

12

,

2

);

return

0

;

}

运行结果:

a4dcc569521c39daf8845cfea7581f55.png

上面的函数和例子程序不仅计算了回归方程式,还计算了显著性检验指标,例如F检验指标,我们可以在统计F分布表上查到F0.01(1,10)=10.04(注:括号里的1,10分别为回归平方和和剩余平方和所拥有的自由度),小于计算的F检验值25.94,可以认为该回归例子高度显著。

如果使用图形界面,可以根据原始数据和计算结果绘制各种图表,如散点图、趋势图、控制图等。很多非线性方程可以借助数学计算,转化为直线方程进行回归分析。

同一元线性回归相比,多元线性回归分析代码可就复杂多了,必须求解线性方程,因此本代码中包含一个可独立使用的线性方程求解函数:

void

FreeData(

double

**

dat,

double

*

d,

int

count)

{

int

i,j;

free(d);

for

(i

=

0

;i

<

count;i

++

)

free(dat[i]);

free(dat);

}

//

解线性方程。data[count*(count+1)]矩阵数组;count:方程元数;

//

Answer[count]:求解数组。返回:0求解成功,-1无解或者无穷解

int

LinearEquations(

double

*

data,

int

count,

double

*

Answer)

{

int

j,m,n;

double

tmp,

**

dat,

*

d

=

data;

dat

=

(

double

**

)malloc(count

*

sizeof

(

double

*

));

for

(m

=

0

;m

<

count;m

++

,d

+=

(count

+

1

))

{

dat[m]

=

(

double

*

)malloc((count

+

1

)

*

sizeof

(

double

));

memcpy(dat[m],d,(count

+

1

)

*

sizeof

(

double

));

}

d

=

(

double

*

)malloc((count

+

1

)

*

sizeof

(

double

));

for

(m

=

0

;m

<

count

-

1

;m

++

)

{

//

如果主对角线元素为0,行交换

for

(n

=

m

+

1

;n

<

count

&&

dat[m][m]

==

0.0

;n

++

)

{

if

(dat[n][m]

!=

0.0

)

{

memcpy(d,dat[m],(count

+

1

)

*

sizeof

(

double

));

memcpy(dat[m],dat[n],(count

+

1

)

*

sizeof

(

double

));

memcpy(dat[n],d,(count

+

1

)

*

sizeof

(

double

));

}

}

//

行交换后,主对角线元素仍然为0,无解,返回-1

if

(dat[m][m]

==

0.0

)

{

FreeData(dat,d,count);

return

-

1

;

}

//

消元

for

(n

=

m

+

1

;n

<

count;n

++

)

{

tmp

=

dat[n][m]

/

dat[m][m];

for

(j

=

m;j

<=

count;j

++

)

dat[n][j]

-=

tmp

*

dat[m][j];

}

}

for

(j

=

0

;j

<

count;j

++

)

d[j]

=

0.0

;

//

求得count-1的元

Answer[count

-

1

]

=

dat[count

-

1

][count]

/

dat[count

-

1

][count

-

1

];

//

逐行代入求各元

for

(m

=

count

-

2

;m

>=

0

;m

--

)

{

for

(j

=

count

-

1

;j

>

m;j

--

)

d[m]

+=

Answer[j]

*

dat[m][j];

Answer[m]

=

(dat[m][count]

-

d[m])

/

dat[m][m];

}

FreeData(dat,d,count);

return

0

;

}

//

求多元回归方程:Y=B0+B1X1+B2X2+...BnXn

//

data[rows*cols]二维数组;X1i,X2i,...Xni,Yi(i=0torows-1)

//

rows:数据行数;cols数据列数;Answer[cols]:返回回归系数数组(B0,B1...Bn)

//

SquarePoor[4]:返回方差分析指标:回归平方和,剩余平方和,回归平方差,剩余平方差

//

返回值:0求解成功,-1错误

int

MultipleRegression(

double

*

data,

int

rows,

int

cols,

double

*

Answer,

double

*

SquarePoor)

{

int

m,n,i,count

=

cols

-

1

;

double

*

dat,

*

p,a,b;

if

(data

==

0

||

Answer

==

0

||

rows

<

2

||

cols

<

2

)

return

-

1

;

dat

=

(

double

*

)malloc(cols

*

(cols

+

1

)

*

sizeof

(

double

));

dat[

0

]

=

(

double

)rows;

for

(n

=

0

;n

<

count;n

++

)

//

n=0tocols-2

{

a

=

b

=

0.0

;

for

(p

=

data

+

n,m

=

0

;m

<

rows;m

++

,p

+=

cols)

{

a

+=

*

p;

b

+=

(

*

p

*

*

p);

}

dat[n

+

1

]

=

a;

//

dat[0,n+1]=Sum(Xn)

dat[(n

+

1

)

*

(cols

+

1

)]

=

a;

//

dat[n+1,0]=Sum(Xn)

dat[(n

+

1

)

*

(cols

+

1

)

+

n

+

1

]

=

b;

//

dat[n+1,n+1]=Sum(Xn*Xn)

for

(i

=

n

+

1

;i

<

count;i

++

)

//

i=n+1tocols-2

{

for

(a

=

0.0

,p

=

data,m

=

0

;m

<

rows;m

++

,p

+=

cols)

a

+=

(p[n]

*

p[i]);

dat[(n

+

1

)

*

(cols

+

1

)

+

i

+

1

]

=

a;

//

dat[n+1,i+1]=Sum(Xn*Xi)

dat[(i

+

1

)

*

(cols

+

1

)

+

n

+

1

]

=

a;

//

dat[i+1,n+1]=Sum(Xn*Xi)

}

}

for

(b

=

0.0

,m

=

0

,p

=

data

+

n;m

<

rows;m

++

,p

+=

cols)

b

+=

*

p;

dat[cols]

=

b;

//

dat[0,cols]=Sum(Y)

for

(n

=

0

;n

<

count;n

++

)

{

for

(a

=

0.0

,p

=

data,m

=

0

;m

<

rows;m

++

,p

+=

cols)

a

+=

(p[n]

*

p[count]);

dat[(n

+

1

)

*

(cols

+

1

)

+

cols]

=

a;

//

dat[n+1,cols]=Sum(Xn*Y)

}

n

=

LinearEquations(dat,cols,Answer);

//

计算方程式

//

方差分析

if

(n

==

0

&&

SquarePoor)

{

b

=

b

/

rows;

//

b=Y的平均值

SquarePoor[

0

]

=

SquarePoor[

1

]

=

0.0

;

p

=

data;

for

(m

=

0

;m

<

rows;m

++

,p

++

)

{

for

(i

=

1

,a

=

Answer[

0

];i

<

cols;i

++

,p

++

)

a

+=

(

*

p

*

Answer[i]);

//

a=Ym的估计值

SquarePoor[

0

]

+=

((a

-

b)

*

(a

-

b));

//

U(回归平方和)

SquarePoor[

1

]

+=

((

*

p

-

a)

*

(

*

p

-

a));

//

Q(剩余平方和)(*p=Ym)

}

SquarePoor[

2

]

=

SquarePoor[

0

]

/

count;

//

回归方差

if (rows - cols > 0.0)

SquarePoor[3] = SquarePoor[1] / (rows - cols); // 剩余方差

else

SquarePoor[3] = 0.0;

}

free(dat);

return

n;

}

为了理解代码,同样贴几个主要公式在下面,其中回归平方和和剩余平方和公式和一元回归相同:

1、回归方程式:,

2、回归系数方程组:

3、F检验:

4、相关系数:,其中,Syy是离差平方和(回归平方和与剩余平方和之和)。该公式其实就是U/(U+Q)的平方根(没找到这个公式的图)。

5、回归方差:U / m,m为回归方程式中自变量的个数(没找到图)。

6、剩余方差:Q / (n - m - 1),n为观察数据的样本数,m同上(没找到图)。

7、标准误差:也叫标准误,就是剩余方差的平方根(没找到图)。

下面是一个多元回归的例子:

double

data[

15

][

5

]

=

{

//

X1X2X3X4Y

{

316

,

1536

,

874

,

981

,

3894

},

{

385

,

1771

,

777

,

1386

,

4628

},

{

299

,

1565

,

678

,

1672

,

4569

},

{

326

,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python里str什么意思_Python 3 字符串中的 STR 和 Bytes 究竟有什么区别?

原标题&#xff1a;Python 3 字符串中的 STR 和 Bytes 究竟有什么区别&#xff1f; Python2的字符串有两种&#xff1a;str和Unicode&#xff0c;Python3的字符串也有两种&#xff1a;str和Bytes。Python2的str相当于Python3的Bytes&#xff0c;而Unicode相当于Python3的Bytes。…

word 插入代码_突破Word页码困境,这招简单又实用的自动更新法,90%的人还不会!...

微信扫码观看全套Excel、Word、PPT视频在工作和学习中&#xff0c;常会遇到这样的情况&#xff0c;对于一篇既含有封面&#xff0c;又含有目录的文档&#xff0c;要求对它的页码进行如下设置&#xff1a;在文档底部靠右位置插入页码&#xff0c;页码形式为“第几页&#xff0c;…

接口 vs 抽象类 的区别

文章目录1. 抽象类2. 接口类3. 如何选择学习自 极客时间《设计模式之美》 1. 抽象类 2. 接口类 3. 如何选择 表示 is - a 关系&#xff0c;解决代码复用&#xff1a;抽象类&#xff08;自下而上&#xff0c;子类的代码重复&#xff0c;抽象成上层父类&#xff09; 表示 has - …

数据结构与算法 pdf_整理一个月完成的数据结构与算法PDF和测试代码免费拿

点击上方「10分钟编程」关注我呦让我们每天「博学」一点点数据结构与算法作为一名2021届的学生&#xff0c;今年7月份就要面临秋招了&#xff0c;那么对于应届生来说&#xff0c;要想脱颖而出&#xff0c;笔试就显得太重要了&#xff0c;算法题是笔试环节的最重要组成部分&…

天池 在线编程 部门统计(哈希)

文章目录1. 题目2. 解题1. 题目 描述 公司给你提供了所有员工的信息&#xff0c;包括其ID&#xff0c;姓名和所属部门。 以及他们之间的朋友关系&#xff0c;每个关系中由2个ID组成&#xff0c;如 “1, 2” 代表1号员工和2号员工是朋友。 朋友关系不具有传递性&#xff0c;即B…

android 过滤emoji表情符号,android怎样过滤字符串中的emoji表情

满意答案jdubysct2016.03.15采纳率&#xff1a;43% 等级&#xff1a;8已帮助&#xff1a;863人解决方案对于字符串处理,首选就是正则表达式去处理,而在android系统中可以自定义InputFilter去过滤需要处理掉的字符串,代码如下InputFilter emojiFilter new InputFilter ( ) {…

c++exe程序在别人电脑上双击无法打开_Windows10电脑磁盘占用率过高,用这二招轻松解决...

在操作计算机时&#xff0c;可能会看到类似“Srtasks.Exe”的信息&#xff0c;这个Srtasks.Exe表明Windows10电脑磁盘占用率过高。这是被称为“Microsoft系统保护后台任务”的可信Microsoft进程的可执行文件&#xff0c;Windows 10的“任务计划程序”经常使用该进程自动创建还原…

链接聚合是将一组物理接口_500字描述华为VLAN聚合工作原理 你看懂了吗?

VLAN聚合的工作过程和通行情况是如何的呢&#xff1f;工作原理如下&#xff1a;和普通VLAN都有一个三层逻辑接口和若干物理接口&#xff0c;VLAN聚合定义的Super-VLAN和Sub-VLAN比较特殊&#xff1a;Sub-VLAN&#xff1a;只包含物理接口&#xff0c;不能建立三层VLANIF接口&…

天池 在线编程 区分用户名(哈希)

文章目录1. 题目2. 解题1. 题目 描述 给出一组用户名&#xff0c;如果有重复的用户名&#xff0c;则在用户名后添加数字区别&#xff0c;并返回修改后的数组。 样例 1: 输入&#xff1a;["aa", "bb", "cc", "bb", "aa", &…

蓝桥杯 之 基础练习10:十进制转十六进制

【循环 整除 求余 判断】 /*问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号&#xff0c;分别表示十进制数的0至15。十六进制的计数方法是满16进1&#xff0c;所以十进制数16在十六进制中是10&#xff0c;…

天池 在线编程 区间合并(字符串)

文章目录1. 题目2. 解题1. 题目 描述 现在给你两个字符串区间(按字典顺序), 请你判断两个区间是否可以合并。 字符串区间[a, b)&#xff0c;包括所有以a开头的字符串。 例如&#xff0c;区间[a, b)和区间[ab,c)是可以合并的&#xff0c; 区间[a,b)和区间[b, c]也是可以合并的…

LeetCode 1812. 判断国际象棋棋盘中一个格子的颜色

文章目录1. 题目2. 解题1. 题目 给你一个坐标 coordinates &#xff0c;它是一个字符串&#xff0c;表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。 如果所给格子的颜色是白色&#xff0c;请你返回 true&#xff0c;如果是黑色&#xff0c;请返回 false 。 给…

dev c++ 代码补全_zsh配置与代码自动补全+tmux配置

先上链接ohmyzsh​github.comzsh-autosuggestions​github.comgpakosz/.tmux​github.com问题描述代码需要&#xff0c;更换了服务器&#xff0c;发现新服务器上zsh没有自动补全&#xff0c;难受得不行&#xff0c;并且没有个性化的配置&#xff0c;强迫症顶不住&#xff0c;tm…

京东抢购助手_[Windows] 京东极速抢购助手V2.0,支持京东健康+扫货抢购

本软件仅供学习交流&#xff0c;完全免费&#xff0c;同时也为帮助有缘人能买到自用的口罩&#xff0c;度过这段特殊时期&#xff01;请勿用于其它用途&#xff0c;谢谢&#xff01;如有违规&#xff0c;请删帖&#xff01;下载地址&#xff1a;https://www.lanzous.com/ia3bfl…

SQL Server 和 Oracle 以及 MySQL 有哪些区别?

SQL&#xff0c;在这里我理解成SQL Server。三者是目前市场占有率最高&#xff08;依安装量而非收入&#xff09;的关系数据库&#xff0c;而且很有代表性。排行第四的DB2&#xff08;属IBM公司&#xff09;&#xff0c;与Oracle的定位和架构非常相似&#xff0c;就不赘述了。 …

LeetCode 1813. 句子相似性 III

文章目录1. 题目2. 解题1. 题目 一个句子是由一些单词与它们之间的单个空格组成&#xff0c;且句子的开头和结尾没有多余空格。 比方说&#xff0c;"Hello World" &#xff0c;"HELLO" &#xff0c;"hello world hello world" 都是句子。 每个单…

vim配置python开发环境_GitHub - TTWShell/legolas-vim: Vim配置,为python、go开发者打造的IDE。...

legolas-vim个人vim配置。支持python、go等自动提示&#xff0c;支持python、go的函数跳转&#xff08;python支持虚拟环境&#xff09;。 最终效果图&#xff08;函数列表的feature已移除&#xff0c;因为大项目会导致性能问题&#xff09;&#xff1a;支持Python自动补全的最…

平面设计中的网格系统pdf_平面设计基础知识

导语&#xff1a;“ 给大家推荐优质书籍&#xff0c;包含平面设计基础入门知识的书籍分享”。平面设计基础知识分享书籍名称&#xff1a;《写给大家看的设计书》作者&#xff1a;[美]罗宾威廉姆斯著平面设计的四个原则&#xff1a;复杂的设计原理在《写给大家看的设计书》中凝炼…

LeetCode 1814. 统计一个数组中好对子的数目(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个数组 nums &#xff0c;数组中只包含非负整数。 定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。 比方说 rev(123) 321 &#xff0c; rev(120) 21 。我们称满足下面条件的下标对 (i, j) 是 好的 &#xff1a; 0 < i <…

如何看当前windows是utf8还是gbk_监理工程师5月份出教材,现在如何备考?

监理工程师教材预计5月份出版&#xff0c;相信考生都知道监理工程师教材对于考生复习的重要性&#xff0c;那么现在考生应该如何学习呢?听小编给你说一说。教材没有发布之前怎么学习?教材改动比较大&#xff0c;没有发布之前我们就不要学习了么?小编不这么认为&#xff0c;监…