逻辑斯谛回归模型

    逻辑斯谛回归模型是研究因变量为二分类或多分类观察结果与影响因素之间的关系的一种概率型非线性回归模型。逻辑斯谛回归系数通过最大似然估计得到。Logistic函数如下:

         

    式中x

         

    这里是输入变量的n个特征,然后按照Logistic函数形式求出。

    假设有n个独立变量的向量,设条件概率x条件下y发生的概率(假设y=1y发生)。则Logistic函数表示为:

         

    同理,在x条件下y不发生的概率为:

    Logistic回归都是围绕Logistic函数展开的,如何求解Logistic回归模型的主要问题,采用的最大似然估计来求解这组参数。

    假设有m个观测样本,观测值分别为,设为给定条件下的概率,同理的概率为,得到一个观测值得概率为:

         

    因为各观测样本间相互独立,于是得到似然函数:

        

    对似然函数取对数:

        

    现要求向量使的最大,其中:

        

    要求的最大似然估计,我们需要确定似然函数存在局部极大值。因此,对似然函数求偏导后得:

         

    由多元函数极值的必要条件可知,若多元函数在一点取得极值,且一阶偏导存在,则该点处所有一阶偏导为0。由此,可以得出n+1个方程,如下:

         

    由此方程解出的 不一定是似然函数的极值,需要通过Hessian矩阵来判断得出的解是否为似然函数的极值。

    Hessian矩阵是一个多元函数的二阶偏导构成的方阵,描述了函数的局部曲率。对一个多元函数 ,如果他的二阶偏导都存在,那么Hessian矩阵如下:

         

    通过Hessian矩阵,我们可以判断一点M处极值的三种情况:

  1. 如果 是正定矩阵,则临界点M处是一个局部极小值;
  2. 如果 是负定矩阵,则临界点M处是一个局部极大值;
  3. 如果 是不定矩阵,则临界点M处不是极值。

对于中的n+1个方程,要求Hessian矩阵,先要求似然函数的二阶偏导,即:

         

    则似然函数的Hessian矩阵为

         

    设有矩阵X、A:

         

         

    则似然函数的Hessian矩阵可表示为:

         

    显然,矩阵A是负定的,则可以证明H也是负定的,说明似然函数存在局部极大值。因此,可以使用牛顿迭代法(Newton's Method)来求

    对一元函数,使用牛顿迭代法来求零点。假设要求 的解,首先选取一个点 作为迭代起点,通过下面的式子进行迭代,直到达到指定精度为止。

         

    由此,有时起始点选择很关键,如果函数只存在一个零点,那么这个起始点选取就无关重要。对已Logistic回归问题,Hessian矩阵对于任意数据都是负定的,所以说极值点只有一个,初始点的选取无关紧要。

    因此,对于上述Logistic回归的似然函数, 令:

         

    则由可以得到如下的迭代式子:

         

    由于Hessian矩阵是负定的,将矩阵A提取一个负号,得:

         

    然后Hessian矩阵变为

         

    这样,Hessian矩阵就是对称正定的了。那么牛顿迭代式变为:

         

    现在,关键是如何快速并有效的计算,即解方程组 。由于 是对称正定的,可以使用Cholesky矩阵分解法来解。

    若 对称正定,则存在一个对角元为正数的下三角矩阵,使得 成立。对于,可以通过以下步骤求解:

  1. 的Cholesky分解,得到
  2. 求解 ,得到
  3. 求解 ,得到

现在的关键问题是对 进行Cholesky分解。假设:

         

    通过比较两边的关系,首先由

         

再由

         

    这样,得到了矩阵 的第一列元素。假设,已经算出了 的前 列元素,通过

         

    可以得出

         

    进一步由

         

    最终:

         

    这样便通过 的前 列求出了第 列,一直递推下去即可求出 。这种方法称为平方根法。

    利用上述方法需要进行开方,这有可能损失精度和增加运算量,为了避免开方,将Cholesky分解进行改进,即:

         

    其中: 是单位下三角矩阵, 为对角均为正数的对角矩阵。把这一分解叫分解。设:

         

    则对于,求解步骤变为:

  1. 分解,得到
  2. 求解 ,得到
  3. 求解 ,得到

对比两边元素,可以得到:

         

    由此可以确定 的公式如下:

         

         

         

牛顿迭代法

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Model.MatrixDecomposition;
  5. using Model.Matrix;
  6. using System.IO;
  7. namespace Model.NewtonRaphson
  8. {
  9.     internal class NewtonRaphsonIterate
  10.     {
  11.         Cholesky_LDL_Decomposition decompositionMatrixByLDL = new Cholesky_LDL_Decomposition();
  12.         private double[,] matrix_Hessian = null;
  13.         private double[,] matrix_X = null;
  14.         private double[,] matrix_A = null;
  15.         private double[,] vector_HU = null;
  16.         private double[,] vector_U = null;
  17.         private double[,] vector_Y = null;
  18.         private double[,] vector_Omega = null;
  19.         private double[,] vector_PI = null;
  20.         private double[,] old_VectorOmega = null;
  21.         #region 属性
  22.         public double[,] MatrixL
  23.         {
  24.             get
  25.             {
  26.                 return decompositionMatrixByLDL.MatrixL;
  27.             }
  28.         }
  29.         public double[,] MatrixD
  30.         {
  31.             get
  32.             {
  33.                 return decompositionMatrixByLDL.MatrixD;
  34.             }
  35.         }
  36.         public double[,] Hessian
  37.         {
  38.             get
  39.             {
  40.                 return this.matrix_Hessian;
  41.             }
  42.         }
  43.         #endregion
  44.         /// <summary>
  45.         /// 执行牛顿迭代法
  46.         /// </summary>
  47.         /// <param name="matrix_X">输入矩阵</param>
  48.         /// <param name="vector_Y">输出向量</param>
  49.         /// <param name="error_Threashold">迭代停止阈值</param>
  50.         /// <param name="omega">计算完成的参数</param>
  51.         internal void Run(double[,] matrix_X, double[,] vector_Y, double error_Threashold, ref double[,] omega)
  52.         {
  53.             double error = 1;
  54.             this.matrix_X = matrix_X;
  55.             this.vector_Y = vector_Y;
  56.             this.vector_Omega = omega;
  57.             InitializeParameter(matrix_X.GetLength(0));
  58.             int i = 0;
  59.             while (error > error_Threashold)
  60.             {
  61.                 i++;
  62.                 error = 0;
  63.                 old_VectorOmega = (double[,])vector_Omega.Clone();
  64.                 GetMatrixAAndVectorPI();
  65.                 matrix_Hessian = MatrixOperation.MultipleMatrix(
  66.                     MatrixOperation.MatrixMultiDiagMatrix(
  67.                     MatrixOperation.TransportMatrix(matrix_X), matrix_A),
  68.                     matrix_X);
  69.                 GetMatrixU();
  70.                 decompositionMatrixByLDL.Cholesky((double[,])matrix_Hessian.Clone(), vector_U, ref vector_HU);
  71.                 vector_Omega = MatrixOperation.AddMatrix(vector_Omega, vector_HU);
  72.                 GetIterationError(ref error);
  73.                 //TODO:迭代计算
  74.             }
  75.             omega = (double[,])vector_Omega.Clone();
  76.         }
  77.         private void InitializeParameter(int rowNumber)
  78.         {
  79.             matrix_A = new double[rowNumber, 1];
  80.             vector_PI = new double[rowNumber, 1];
  81.         }
  82.         /// <summary>
  83.         /// 获取H=X^TAX的A以及PI(Xi)
  84.         /// </summary>
  85.         private void GetMatrixAAndVectorPI()
  86.         {
  87.             for (int i = 0; i < matrix_X.GetLength(0); i++)
  88.             {
  89.                 double temp_A = 0;
  90.                 //matrix_A[i, 0] += vector_Omega[0, 0];
  91.                 for (int j = 0; j < matrix_X.GetLength(1); j++)
  92.                 {
  93.                     temp_A += matrix_X[i, j] * vector_Omega[j, 0];
  94.                 }//for2
  95.                 matrix_A[i, 0] = (1.0) / (1 + Math.Exp(-temp_A));
  96.                 vector_PI[i, 0] = matrix_A[i, 0];
  97.                 matrix_A[i, 0] *= (1 - matrix_A[i, 0]);
  98.             }//for1
  99.         }
  100.         //计算HU中的U
  101.         //U=X^T(Y-PI)
  102.         private void GetMatrixU()
  103.         {
  104.             vector_U = MatrixOperation.MultipleMatrix(MatrixOperation.TransportMatrix(matrix_X),
  105.                 MatrixOperation.SubtracteMatrix(vector_Y, vector_PI));
  106.         }
  107.         /// <summary>
  108.         /// 计算每次迭代完成后的误差
  109.         /// </summary>
  110.         /// <param name="error">误差</param>
  111.         private void GetIterationError(ref double error)
  112.         {
  113.             for (int i = 0; i < vector_Omega.GetLength(0); i++)
  114.             {
  115.                 error += Math.Abs(vector_Omega[i, 0] - old_VectorOmega[i, 0]);
  116.             }
  117.         }
  118.     }
  119. }

Cholesky分解

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Model.Matrix;
  5. namespace Model.MatrixDecomposition
  6. {
  7.     internal class Cholesky_LDL_Decomposition
  8.     {
  9.         private double[,] matrix_L = null;
  10.         private double[,] matrix_D = null;
  11.         public double[,] MatrixL
  12.         {
  13.             get
  14.             {
  15.                 return this.matrix_L;
  16.             }
  17.         }
  18.         public double[,] MatrixD
  19.         {
  20.             get
  21.             {
  22.                 return this.matrix_D;
  23.             }
  24.         }
  25.         private int matrix_Dimension = 0;
  26.         #region Decomposition Matrix
  27.         /// <summary>
  28.         /// 方程AX=B
  29.         /// 利用Cholesky LDL^T分解法,求方程的解
  30.         /// </summary>
  31.         /// <param name="m_A">系数矩阵A</param>
  32.         /// <param name="v_B">列向量,B</param>
  33.         /// <param name="v_X">求得方程的解</param>
  34.         public void Cholesky(double[,] m_A, double[,] v_B, ref double[,] v_X)
  35.         {
  36.             this.matrix_Dimension = m_A.GetLength(0);
  37.             matrix_L = new double[matrix_Dimension, matrix_Dimension];
  38.             matrix_D = new double[matrix_Dimension, matrix_Dimension];
  39.             //为了计算方便,将L的严格下三角存储在A的对应位置上,
  40.             //而将D的对角元素存储A的对应对角位置上
  41.             //double[,] q = (double[,])m_A.Clone();
  42.             for (int i = 0; i < matrix_Dimension; i++)
  43.             {
  44.                 for (int j = 0; j < i; j++)
  45.                 {
  46.                     m_A[i, i] -= m_A[j, j] * m_A[i, j] * m_A[i, j];
  47.                 }//for
  48.                 for (int k = i + 1; k < matrix_Dimension; k++)
  49.                 {
  50.                     for (int n = 0; n < i; n++)
  51.                     {
  52.                         m_A[k, i] -= m_A[k, n] * m_A[n, n] * m_A[i, n];
  53.                     }//for
  54.                     m_A[k, i] /= m_A[i, i];
  55.                 }//for
  56.             }//for
  57.             this.GetLDMatrix(m_A);
  58.             this.SolveEquation(v_B,ref v_X);
  59.             //double[,] resut = MatrixOperation.MultipleMatrix(MatrixOperation.MultipleMatrix(MatrixL, MatrixD), MatrixOperation.TransportMatrix(MatrixL));
  60.         }
  61.         /// <summary>
  62.         /// 将L和D矩阵分别赋值
  63.         /// </summary>
  64.         /// <param name="m_A">经过Cholesky分解后的矩阵</param>
  65.         private void GetLDMatrix(double[,] m_A)
  66.         {
  67.             for (int i = 0; i < matrix_Dimension; i++)
  68.             {
  69.                 matrix_L[i, i] = 1;
  70.                 matrix_D[i, i] = m_A[i, i];
  71.                 for (int j = 0; j < i; j++)
  72.                 {
  73.                     matrix_L[i, j] = m_A[i, j];
  74.                 }
  75.             }
  76.         }
  77.         #endregion End Decomposition Matrix
  78.         #region Solve Equation
  79.         /// <summary>
  80.         /// 求解LY=B => Y
  81.         /// DL^TX=Y => X
  82.         /// </summary>
  83.         /// <param name="v_B">方程AX=B的列向量B</param>
  84.         /// <param name="v_X">求解结果</param>
  85.         private void SolveEquation(double[,] v_B, ref double[,] v_X)
  86.         {
  87.             v_X =(double[,])v_B.Clone();
  88.             //求解LY=B=>Y
  89.             for (int i = 0; i < matrix_Dimension; i++)
  90.             {
  91.                 for (int j = 0; j < i; j++)
  92.                 {
  93.                     v_X[i,0] -= v_X[j,0] * matrix_L[i, j];
  94.                 }
  95.                 v_X[i,0] /= matrix_L[i, i];
  96.             }
  97.             //计算DL^T
  98.             double[,] dMultiLT = MatrixOperation.MultipleMatrix(matrix_D,
  99.                 MatrixOperation.TransportMatrix(matrix_L));
  100.             //求解DL^TX=Y => X
  101.             for (int i = matrix_Dimension - 1; i >= 0; i--)
  102.             {
  103.                 for (int j = i + 1; j < matrix_Dimension; j++)
  104.                 {
  105.                     v_X[i,0] -= v_X[j,0] * dMultiLT[i, j];
  106.                 }
  107.                 v_X[i,0] /= dMultiLT[i, i];
  108.             }
  109.         }//end Method
  110.         #endregion
  111.     }
  112. }

MatrixOperation是一个有关矩阵加、减、乘以及特殊矩阵求逆的一个类。

转载于:https://www.cnblogs.com/reddatepz/p/4496362.html

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

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

相关文章

mysql监控平台怎么做_MySQL监控平台的构建方法

MySQL监控平台的构建方法发布时间&#xff1a;2020-05-23 14:13:12来源&#xff1a;亿速云阅读&#xff1a;159作者&#xff1a;鸽子概述对于MySQL的监控平台&#xff0c;相信大家实现起来有很多了&#xff1a;基于天兔的监控&#xff0c;还有基于zabbix相关的二次开发。相信很…

查看宝塔面板账号密码命令_宝塔面板升级到最新版图文教程

往期教程&#xff1a;宝塔面板教程&#xff08;1&#xff09;基于云服务器搭建宝塔面板教程最全详解宝塔面板教程&#xff08;2&#xff09;宝塔面板添加WordPress站点详细图文教程宝塔面板教程&#xff08;3&#xff09;基于宝塔面板成功配置网站SSL安全证书宝塔面板教程&…

python 对象引用、可变性 和 垃圾回收

文章目录1. 变量是标签2. 元组的相对不可变性3. 默认浅复制4. 函数的参数作为引用时5. del 和 垃圾回收6. 弱引用7. 一些可能的坑&#xff01;&#xff01;&#xff01;learn from 《流畅的python》 1. 变量是标签 >>> a [1, 2, 3] >>> b a >>&g…

关于原型的一点总结

原型&#xff08;prototype&#xff09;无疑是JavaScript中一个十分重要的概念&#xff0c;围绕着原型所涉及的原型链继承、内建对象扩展&#xff0c;JS表现出独特的面向对象特性。 1.什么是原型每个JS的函数对象中都有一个默认的prototype属性&#xff0c;它指向的就是这个函数…

python canopen_Python canopener包_程序模块 - PyPI - Python中文网

用于打开文件的python便利函数canopener(filename, moder)。本地文件的行为与open()&#xff1a;>>> canopener(local_file.txt)url也可以作为文件名传递并打开进行读取。urllib2.urlopen()是在封面下使用的&#xff0c;因此它具有同等的支持&#xff1a;>>>…

天池 在线编程 最长AB子串(哈希)

文章目录1. 题目2. 解题1. 题目 描述 给你一个只由字母’A’和’B’组成的字符串s&#xff0c;找一个最长的子串&#xff0c;要求这个子串里面’A’和’B’的数目相等&#xff0c;输出该子串的长度。 这个子串可以为空。 s的长度n满足 2<n<1000000。示例 样例1 输入: s…

Tomcat 打开一闪而过

转载于:https://www.cnblogs.com/super90/p/4504326.html

java怎么递归_Java的递归、如何与流相结合

递归技术需求&#xff1a;扫描D:\test所有子文件夹及子子文件夹下的.jpg文件。我们如果用循环来做这件事&#xff0c;我们不知道循环的结束条件&#xff0c;也不知道到底有多少层&#xff0c;所以比较麻烦。我们可以用一种新的思想&#xff1a;递归。递归举例&#xff1a;从前有…

假设有搅乱顺序的一群儿童成一个队列_数据结构与算法系列之栈amp;队列(GO)...

以下完整代码均可从这里获取栈栈的基本概念「后进先出、先进后出就是典型的栈结构」。栈可以理解成一种受了限制的线性表&#xff0c;插入和删除都只能从一端进行当某个数据集合只涉及在一端插入和删除数据&#xff0c;并且满足后进先出、先进后出的特性&#xff0c;就应该首选…

datagridview 动态插入图片_挑战一张照片制作动态PPT背景

在PPT中&#xff0c;要做出好看的页面动画效果&#xff0c;常常需要用很多图片和装饰元素。而如果你手头的素材只有一张照片&#xff0c;如何才能快速做出好看的PPT背景效果呢&#xff1f;本期内容&#xff0c;我们就来一起挑战&#xff0c;使用一张照片&#xff0c;制作PPT动态…

sed搜索某行在行末追加_示范sed指定某行插入 追加和全局替换

有时候会有这样的需求&#xff0c;在指定的行后面或者是前面追加一行&#xff0c;这个时候可以使用sed来完成&#xff0c;具体用法如下a\ 在指定的行后面追加一行b\ 在指定的行前面追加一行使用指定的行号追加内容&#xff0c;在使用行号的过程中&#xff0c;需要注意的问题有以…

LeetCode 1941. 检查是否所有字符出现次数相同

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;如果 s 是一个 好 字符串&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 &#xff0c;那么我们称字符串 s 是 好 字符串。 示例 1&#xff1a; 输入&…

java初学者定远期目标_JAVA题,新手求解

展开全部类图设计&#xff1a;类设计&#xff1a;package car;public class Car {private String id;private String name;public void setId(String id) {this.id id;}public void setName(String name) {this.name name;}/*** 获取汽车编e69da5e6ba9062616964757a686964616…

LeetCode 1942. 最小未被占据椅子的编号(set)

文章目录1. 题目2. 解题1. 题目 有 n 个朋友在举办一个派对&#xff0c;这些朋友从 0 到 n - 1 编号。 派对里有 无数 张椅子&#xff0c;编号为 0 到 infinity 。 当一个朋友到达派对时&#xff0c;他会占据 编号最小 且未被占据的椅子。 比方说&#xff0c;当一个朋友到达时…

vue路由懒加载_优化vue项目的首屏加载速度

最近使用vue-cli3构建了一个小型的博客系统&#xff0c;完工之后&#xff0c;build打包出来发现一个chunk-vendors包就有1.1m&#xff0c;部署上去之后&#xff0c;访问的时候&#xff0c;首屏加载非常慢。居然需要21s&#xff0c;体验极差。这是打包的结果截图根据这种情况&am…

LeetCode 1943. 描述绘画结果(差分思想)

文章目录1. 题目2. 解题1. 题目 给你一个细长的画&#xff0c;用数轴表示。 这幅画由若干有重叠的线段表示&#xff0c;每个线段有 独一无二 的颜色。 给你二维整数数组 segments &#xff0c;其中 segments[i] [starti, endi, colori] 表示线段为 半开区间 [starti, endi) 且…

LeetCode 1944. 队列中可以看到的人数(单调栈)

文章目录1. 题目2. 解题1. 题目 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。 给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。 一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他…

yolov2训练_一文看懂YOLO v2

我的CSDN博客&#xff1a;https://blog.csdn.net/litt1e我的公众号&#xff1a;工科宅生活概述新的YOLO版本论文全名叫“YOLO9000: Better, Faster, Stronger”&#xff0c;相较于YOLO主要有两个大方面的改进&#xff1a;第一&#xff0c;作者使用了一系列的方法对原来的YOLO多…

java的foeachr循环_for循环和Dowhile循环的应用

DoWhile循环{public static void main(String[] args) {int i 0;int sum 0;do {sum sum i;i;} while (i < 100);System.out.println(sum);}}{int a 0;while (a<0){System.out.println(a);a;}System.out.println("");do {System.out.println(a);a;}while (…

LeetCode 1945. 字符串转化后的各位数字之和

文章目录1. 题目2. 解题1. 题目 给你一个由小写字母组成的字符串 s &#xff0c;以及一个整数 k 。 首先&#xff0c;用字母在字母表中的位置替换该字母&#xff0c;将 s 转化 为一个整数&#xff08;也就是&#xff0c;‘a’ 用 1 替换&#xff0c;‘b’ 用 2 替换&#xff…