一、原始数据

说明:

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依次对应,经过整理后可得:

XXB^=XY,   即B^=(XX)-1XY。

三、相关代码:

//矩阵的转置     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

二元线性回归的部分相关代码整理及说明。相关推荐

  1. 该系列主要整理收集在使用C#开发WinForm应用文章及相关代码来源于WinForms小组...

    该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm ...

  2. 全排列及相关扩展算法(七)——组合数的字典序(另含全章代码整理)

    1.引入概念:要列出一个集合{1,2,3,4}的所有子集是很容易的,我们可以按照二进制数的顺序,0000,0001,0010,0011,0100,0101,0110,0111......来表示我们要取 ...

  3. 《统计学习导论》R语言代码整理

    <统计学习导论>R语言代码整理 一.特殊函数 二.基本函数 三.画图 一些函数 一些参数 type pch (plotting character) lty(line types) 特定问 ...

  4. Python数据处理相关语法整理

    Python数据处理相关语法整理 简介 Python自身特性总结 编程Tips 拿到新电脑配环境时做的事: 一些加速python代码的技巧 Python项目代码结构 量化策略指标计算 绝对收益率 最大 ...

  5. Redis面试题相关知识整理

    Redis面试题相关知识整理 1.Redis的应用场景 2.Redis的特点 3.Redis对各种数据类型的操作 4.Redis的持久化机制 5.Redis的缓存穿透/缓存击穿/缓存雪崩问题 6.Re ...

  6. Python实现——二元线性回归(最小二乘法)

    2019/3/30 二元线性回归--矩阵公式法_又名:对于python科学库的糟心尝试_ 二元线性回归严格意义上其实不过是换汤不换药,我对公式进行推导,其实也就是跟以前一样的求偏导并使之为零,并且最终 ...

  7. 【转】医学影像处理相关知识整理(一)

    转自:医学影像处理相关知识整理(一) - 知乎 Segmentation to RT structure 近日做医疗影像处理相关的内容,感慨于这方面资料不全.散碎,遂记录自己获得的一些资料以供日后查阅 ...

  8. keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关知识整理.doc...

    Keil软件"C语言"与"汇编"混编 相关知识整理 用Keil在C中嵌入汇编1 在Keil中嵌入汇编2 介绍直接嵌入汇编代码的方法4 采用汇编可能会有的好处5 ...

  9. 转:基于iOS上MDM技术相关资料整理及汇总

    转自:http://www.mbaike.net/mdm/6.html 一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企 ...

最新文章

  1. 2021春季学期-创新设计与实践-课程结构设计
  2. 基于i.MX RT1060的可编程视觉模块
  3. ARM公布“物联网”嵌入式mbed OS系统软件平台
  4. 《软件测试方法和技术》,《软件测试方法和技术》.ppt
  5. win10用一会就蓝屏重启_电脑出现蓝屏?教你如何解决
  6. 【浏览器】浏览器下载CSV文件的方法
  7. 【Antlr】 Antlr 错误与恢复
  8. 鼠标悬浮标签显示提示内容
  9. 【每日一linux命令4】常用参数:
  10. [MSDN]Design Guidelines for Developing Class Libraries with .NET Framework 4
  11. PHP脚本调用systemctl,centos7之systemctl
  12. 医学诊断报告生成论文综述
  13. 基于ESP32制作流光溢彩氛围灯
  14. python适合什么发型-下面不属于python特性的是( )。
  15. vue-element-admin 增删改查(五)
  16. 产品概念之2/4:三层次理论 —— 生产者主导视角的产品概念
  17. 冰点还原精灵7.0密码忘记的解决方案
  18. 如何将EndNote中的参考文献插入到word中
  19. Android-UI开发(一)
  20. 网易员工哀叹:来公司一年,被裁员搞得没心情上班,想考公务员

热门文章

  1. Pygame游戏制作
  2. 查询mysql版本号
  3. Online 学习网站
  4. matlab读取grib三维数据,matlab读取grib2文件
  5. Levenshtein Distance (LD算法) 编辑距离算法原理
  6. Python复数类型
  7. 图像分割 | 人体实例分割数据
  8. 关于home 的英语
  9. “APM+NPM”远大于1 最新Riverbed SteelCentral全方位监控数字体验
  10. [小白的Web全栈之旅]独立开发电子商务网站--项目介绍