二元线性回归的部分相关代码整理及说明。
一、原始数据
说明:
Y---结果数据 Xi---变量 (共k个) n组已知实验数据
Y |
X1 |
X2 |
……… |
Xk |
Y1 |
X11 |
X21 |
……… |
Xk1 |
Y2 |
X12 |
X22 |
……… |
Xk2 |
… |
… |
… |
……… |
… |
Yn |
X1n |
X2n |
Xkn |
二、有一可知其线性回归方程模式
Y=bo+b1 X1+b2 X2+………+bk Xk (+u); u:正太 分布
则有:
Y1 = 1 X11 X21 … Xk1 b0 u1
Y2 = 1 X12 X22 … Xk2 b1 + u2
… = 1 … … … … … …
Yn = 1 X1n X2n … Xkn bk uk
令Y,X,B,U依次对应,经过整理后可得:
X’XB^=X’Y, 即B^=(X’X)-1X’Y。
三、相关代码:
//矩阵的转置 k+1(n)
public double[,] MatrixTranspose(double[,] tempArray)
{
double[,] tempArrayT = new double[tempArray.GetLength(1),tempArray.GetLength(0) ];
//MessageBox.Show(tempArray.Rank);
//MessageBox.Show(tempArray.GetLength(1));
for (int i=0;i<tempArray.GetLength(0);i++) //行数
{
for(int j=0;j<tempArray.GetLength(1);j++) //列数
{
tempArrayT[j, i] = tempArray[i, j];
}
}
return tempArrayT;
}
//矩阵相乘 temparray1*tempArray2
public double[,] MatrixMul(double[,] tempArray1, double[,] tempArray2)
{
int a = tempArray1.GetLength(0);//返回矩阵的行数 转置矩阵
int b = tempArray2.GetLength(1);//获取指定维度中的元素个数,即返回矩阵的列数;
double[,] tempArray3 = new double[a, b];
//乘法运算
double sum = 0.0; //初次测试时没有考虑sum值的重新初始化问题。 通过简单实例数据测试才发现。
for (int i = 0; i < tempArray1.GetLength(0); i++)
{
for (int j = 0; j < tempArray2.GetLength(1); j++)
{
sum=0.0;
for (int k = 0; k < tempArray1.GetLength(1); k++)
{
sum += tempArray1[i, k] * tempArray2[k, j];
}
tempArray3[i, j] = sum;
}
}
return tempArray3;
}
//矩阵求逆
public static double[,] Matrix_Ni(double[,] Array)
{
int m = 0;
int n = 0;
m = Array.GetLength(0);
n = Array.GetLength(1);
double[,] array = new double[2 * m + 1, 2 * n + 1];
for (int k = 0; k < 2 * m + 1; k++) //初始化数组
{
for (int t = 0; t < 2 * n + 1; t++)
{
array[k, t] = 0.00000000;
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
array[i, j] = Array[i, j];
}
}
for (int k = 0; k < m; k++)
{
for (int t = n; t <= 2 * n; t++)
{
if ((t - k) == m)
{
array[k, t] = 1.0;
}
else
{
array[k, t] = 0;
}
}
}
for (int k = 0; k < m; k++)
{
if (array[k, k] != 1)
{
double bs = array[k, k];
array[k, k] = 1;
for (int p = k + 1; p < 2 * n; p++)
{
array[k, p] /= bs;
}
}
for (int q = 0; q < m; q++)
{
if (q != k)
{
double bs = array[q, k];
for (int p = 0; p < 2 * n; p++)
{
array[q, p] -= bs * array[k, p];
}
}
else
{
continue;
}
}
}
double[,] NI = new double[m, n];
for (int x = 0; x < m; x++)
{
for (int y = n; y < 2 * n; y++)
{
NI[x, y - n] = array[x, y];
}
}
return NI;
}
四、对多元线性回归的检测
#region 对多元线性回归的检测
//拟合程度的测定 R2(R的平方)=E(Y的拟合结果-y的平均值)的平方
public void DeterminationFittingDegree(DataSet tempDS ,double b0,double b1,double b2,double[,]NIjuzhen)
{
double S1=0.0; //回归平方和;即总变差平方和中有回归方程解释的部分
double S2 = 0.0; //残差平方和;即总变差平方和中未被回归方程解释的部分,有解释变量X中未包含的一切因素对被解释变量Y影响而造成的
double R2 = 0.0;//拟合程度:越接近1,拟合程度越高
double R22 = 0.0;
double YY = 0.0;//存放Y的平均值
b0 = double.Parse(textBox0.Text);
b1 = double.Parse(textBox1.Text);
b2 = double.Parse(textBox2.Text);
string X1 = TxtX1.Text.ToString().Trim();
string X2 = TxtX2.Text.ToString().Trim();
string Y = TxtY.Text.ToString().Trim();
//求Y的平均值
for (int i = 0; i < tempDS.Tables["DuoyuanNiHe"].Rows.Count; i++)
{
YY += double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][Y].ToString());
}
YY = YY / tempDS.Tables["DuoyuanNiHe"].Rows.Count;
//求S1:回归平方和
for (int i = 0; i < tempDS.Tables["DuoyuanNiHe"].Rows.Count;i++)
{
S1 += (b1 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X1].ToString()) + b2 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X2].ToString()) + b0 - YY)*
(b1 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X1].ToString()) + b2 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X2].ToString()) + b0 - YY);
}
//求S2:总变差
for (int i = 0; i < tempDS.Tables["DuoyuanNiHe"].Rows.Count; i++)
{
S2 += (double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][Y].ToString()) - YY) *
(double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][Y].ToString()) - YY);
}
R2 = S1 / S2;
MessageBox.Show(R2.ToString(), "拟合程度", MessageBoxButtons.OK, MessageBoxIcon.Information);
///<summary>
///回归方程的显著性检验: 因为需要用到S1和S2,故此程序直接在拟合程度方法中检验
/// </ summary >
double F = 0.0;//统计量
double S3 = 0.0; //y-y的平方和
// S1 /= 2;// 2指自变量的个数,需要手动修改 //
for (int i = 0; i < tempDS.Tables["DuoyuanNiHe"].Rows.Count; i++)
{
S3 += (double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][Y].ToString()) -
(b1 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X1].ToString()) + b2 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X2].ToString()) + b0))*
(double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][Y].ToString()) -
(b1 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X1].ToString()) + b2 * double.Parse(tempDS.Tables["DuoyuanNiHe"].Rows[i][X2].ToString()) + b0));
}
// S3 /= tempDS.Tables["DuoyuanNiHe"].Rows.Count - 2 - 1;// 2指自变量的个数,需要手动修改
// F = (S1/2) / (S3/ (tempDS.Tables["DuoyuanNiHe"].Rows.Count - 2 - 1));
F = S1 * (tempDS.Tables["DuoyuanNiHe"].Rows.Count - 2 - 1) / 2 / S3;
MessageBox.Show(F.ToString());
if(F>(3.23+6.01)/2)
{
MessageBox.Show("回归方程具有显著意义");
}
else
{
MessageBox.Show("回归效果不明显");
}
///估计标准误差 即因变量y的实际值与回归方程求出的估计值 之间的标准误差,
///估计标准误差越小,回归方程拟合程度越高
double Sy = S3 / (20 - 2 - 1);
Sy= Math.Pow(Sy, 0.5);
MessageBox.Show(Sy.ToString(), "估计标准误差", MessageBoxButtons.OK, MessageBoxIcon.Information);
///回归系数的显著性检验
/* //X1的检验
PrintArray(NIjuzhen);
double t1 = b1 / (Sy * Math.Pow(NIjuzhen[1, 1], 0.5));
/* TxtShow.AppendText("b1=");
TxtShow.AppendText(b1.ToString());
TxtShow.AppendText("\r\n");
TxtShow.AppendText("Sy=");
TxtShow.AppendText(Sy.ToString());
TxtShow.AppendText("\r\n");
TxtShow.AppendText("t1=");
TxtShow.AppendText(t1.ToString());
TxtShow.AppendText("\r\n");
t1 = Math.Abs(t1);
if (t1 > 2.56694)
{
MessageBox.Show("变量X1显著");
}
else
{
MessageBox.Show("变量X1不显著,应当剔除","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning); //在进行T检测时,此语句执行了:公式时没有问题的,原因应该是:编译器是通过数据关系来计算的,它并不能识别X1与Y在现实中的实际关系,决解方法:在确定自变量和因变量有绝对关系是,对此自变量不进行检验。
} */
//X2的检验
double t2 = b2 / (Sy * Math.Pow(NIjuzhen[2, 2], 0.5));
t2 = Math.Abs(t2);
if (t2 > 2.56694)
{
MessageBox.Show("变量X2显著");
}
else
{
MessageBox.Show("变量X2不显著,应当剔除", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
#endregion
二元线性回归的部分相关代码整理及说明。相关推荐
- 该系列主要整理收集在使用C#开发WinForm应用文章及相关代码来源于WinForms小组...
该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm ...
- 全排列及相关扩展算法(七)——组合数的字典序(另含全章代码整理)
1.引入概念:要列出一个集合{1,2,3,4}的所有子集是很容易的,我们可以按照二进制数的顺序,0000,0001,0010,0011,0100,0101,0110,0111......来表示我们要取 ...
- 《统计学习导论》R语言代码整理
<统计学习导论>R语言代码整理 一.特殊函数 二.基本函数 三.画图 一些函数 一些参数 type pch (plotting character) lty(line types) 特定问 ...
- Python数据处理相关语法整理
Python数据处理相关语法整理 简介 Python自身特性总结 编程Tips 拿到新电脑配环境时做的事: 一些加速python代码的技巧 Python项目代码结构 量化策略指标计算 绝对收益率 最大 ...
- Redis面试题相关知识整理
Redis面试题相关知识整理 1.Redis的应用场景 2.Redis的特点 3.Redis对各种数据类型的操作 4.Redis的持久化机制 5.Redis的缓存穿透/缓存击穿/缓存雪崩问题 6.Re ...
- Python实现——二元线性回归(最小二乘法)
2019/3/30 二元线性回归--矩阵公式法_又名:对于python科学库的糟心尝试_ 二元线性回归严格意义上其实不过是换汤不换药,我对公式进行推导,其实也就是跟以前一样的求偏导并使之为零,并且最终 ...
- 【转】医学影像处理相关知识整理(一)
转自:医学影像处理相关知识整理(一) - 知乎 Segmentation to RT structure 近日做医疗影像处理相关的内容,感慨于这方面资料不全.散碎,遂记录自己获得的一些资料以供日后查阅 ...
- keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关知识整理.doc...
Keil软件"C语言"与"汇编"混编 相关知识整理 用Keil在C中嵌入汇编1 在Keil中嵌入汇编2 介绍直接嵌入汇编代码的方法4 采用汇编可能会有的好处5 ...
- 转:基于iOS上MDM技术相关资料整理及汇总
转自:http://www.mbaike.net/mdm/6.html 一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企 ...
最新文章
- 2021春季学期-创新设计与实践-课程结构设计
- 基于i.MX RT1060的可编程视觉模块
- ARM公布“物联网”嵌入式mbed OS系统软件平台
- 《软件测试方法和技术》,《软件测试方法和技术》.ppt
- win10用一会就蓝屏重启_电脑出现蓝屏?教你如何解决
- 【浏览器】浏览器下载CSV文件的方法
- 【Antlr】 Antlr 错误与恢复
- 鼠标悬浮标签显示提示内容
- 【每日一linux命令4】常用参数:
- [MSDN]Design Guidelines for Developing Class Libraries with .NET Framework 4
- PHP脚本调用systemctl,centos7之systemctl
- 医学诊断报告生成论文综述
- 基于ESP32制作流光溢彩氛围灯
- python适合什么发型-下面不属于python特性的是( )。
- vue-element-admin 增删改查(五)
- 产品概念之2/4:三层次理论 —— 生产者主导视角的产品概念
- 冰点还原精灵7.0密码忘记的解决方案
- 如何将EndNote中的参考文献插入到word中
- Android-UI开发(一)
- 网易员工哀叹:来公司一年,被裁员搞得没心情上班,想考公务员