关闭

一些数值计算的知识

标签: 机器学习数学
555人阅读 评论(0) 收藏 举报
分类:

标签:机器学习


计算机进行计算时有几个问题:

  1. 用理论上等价的算法,在实际计算中会产生误差。如何保证数值稳定性?
  2. 数据量大难以计算?利用迭代算法

了解并运用一些数学知识有助于更好地进行机器学习。


正定矩阵

A是对称正定矩阵1,则

AT=A,vTAv>0(v0)

性质:

  1. 所有特征值大于0
  2. 存在满秩矩阵X,A=XXT
  3. 可作为高斯分布的协方差矩阵

而当vTAv0时,A为半正定矩阵,此时性质1,2,3均不成立,它只能作为退化的协方差矩阵。


Cholesky分解

对于对称正定矩阵,找到下三角矩阵L,满足LLT=A,之后有关A的运算用L来代替,如图即可唯一分解出L

L的性质为:对角元全大于0.

分解的复杂度为O(n3)。

应用:

  1. Ax=b已知A,b求x
    一般的求A1复杂度较高,因此带入分解因子LLTx=b,换元如下
    [1] : Lv=b,
    [2] : LTx=v
    先求v,再求x,利用L是下三角矩阵的性质,复杂度为O(n2)
  2. log|A|
    log|A|=2log|L|=2logni=1li,i
  3. bTA1b
    bTA1b=||v||2,代入bT(LLT)1b=||v||2,得Lv=b,只需O(n2)求出v。
  4. 多元高斯分布换元
    Σ=LLT,μ=La稳定性更好,复杂度更小。

奇异值分解(SVD)

A=UΛVTRm×n,UTU=I,VTV=I,Λ,λi0
奇异值矩阵ΛRd×dd=min(m,n)

性质:

  1. ATA=(UΛVT)TUΛVT=VΛ2VT
  2. A对称时,U=VD,D为对称矩阵,di{1,1}
  3. 若A正定,SVD就成为特征分解
  4. 复杂度为O(n3)
  5. 比Cholesky分解慢,但是准确

应用:

  1. 主成分分析(PCA),用于降维
  2. 线性近似
  3. 规范化(Laplace)

网上有一篇博客讲得很好,奇异值分解(SVD)原理详解及推导


共轭梯度算法(Conjugate Gradient Algorithm, CG)

共轭梯度法是介于最速下降法牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。

用于找到局部最小值,每次朝着变化梯度最大的方向走,直到变化为0,即到了最小值。

若非零向量u,v满足uTAv=0(A),则u,v是关于A正交的,也称共轭

如下列问题:
对于正定矩阵A,求出最优参数X=argmin{q(x)=12xTAxbTx}
首先求导g(x)=q(x)=Axb

  1. 初始位置为x0
  2. 遍历k个方向,令gk1=g(xk1),以及以前的方向来确认dk,即下一步的方向,再偏移到该方向使xk=xk1+αkdk,走多远由αk决定,αk=argmin(q(xk))
  3. 重复步骤2直到q是最小值。

步骤里要解决的问题有:

  1. dk的取向?
    要使得下降最快,应该朝着最陡的方向(Steepest Descent),即dk=gk1。比SD更好的办法是新的梯度总是正交于旧的方向。由此可以得到
    gk+1=A(xk+αk+1dk+1)b=gk+αk+1Adk+1  (Δ)
    0=gTk+1dk=gTkdk+αk+1dTk+1Adk
    再归纳得到,当A为对称矩阵时
    dTjAdk=0(jk)
    dj,dk共轭。
    一直走到某个位置xk,s.t.gTkdk=0.
  2. αk
    为了方便计算引入dk+1=gk+βkdk
    gTkdk=0,并将gk展开,可得
    gTk1dk+αkdTkAdk=0  ()
    αk=gTk1dkdTkAdk=gTk1(gk1+βk1dk1)dTkAdk=||gk1||2dTkAdk  ()
    dTk+1Adk=0,并将dk+1展开,得
    (gk+βkdk)TAdk=0
    βk=gTkAdkdTkAdk=()gTk(αkAdk)gTk1dk=()gTk(αkAdk)||gk1||2=(Δ)gTk(gkgk1)||gk1||2=||gk||2||gk1||2

向量微积分

函数:
df(x)=f(x+(dx))f(x)=(f(x))T(dx)+O(||dx||2)
d(XY)=(dX)Y+X(dY)

矩阵:
d(X1)=X1(dX)X1
d(log|X|)=trX1(dX)
d|X|=d(elog|X|)=|X|(d log|X|)

对于向量、矩阵求导,只要找到对应的自变量和应变量的位置即可降维求导。


  1. 在双线性代数中,正定矩阵的性质类似复数中的正实数。与正定矩阵相对应的线性算子是对称正定双线性形式(复域中则对应埃尔米特正定双线性形式)。
0
0
查看评论

关于吸血鬼的一点知识

在欧洲,从历史开始的时候,就蔓延着吸血鬼的传说。成千上万的人们相信这一传说并在黑暗里因为这个传说而颤抖。 吸血鬼是一个古老而神秘的种族。理论上来讲,所谓吸血鬼,可以理解成为某种程度上的死尸。他们没有心跳和脉搏,也没有呼吸,没有体温,而且永生不老。同时,他们有自己的思想,会思考,会交谈,也会四处走动,...
  • nimeimei
  • nimeimei
  • 2005-10-17 10:49
  • 1392

一些mysql的知识以及go语言操作mysql,mysqld服务

go语言操作mysql优质链接: http://www.cnblogs.com/hupengcool/p/4143238.html 数据库驱动: 刚接触数据库是在命令框中使用数据库,而数据驱动就是可以通过其他的方式调用sql语句, 同样去操作数据库,进行数据存储。 mysql用户管理: 修改root...
  • ZzZz_ing
  • ZzZz_ing
  • 2016-11-23 14:14
  • 272

推荐一些学习网站运营知识的好地方?

<br />网站运营的关键点在于执行:确定了网站的大方向,制定了运营计划后,执行是网站运营成功的关键所在。如果在网站运营之中加上点创新及需求调研,那成功就指日可待了。正所谓:好产品是运营出来的!笔者从事网站运营工作有几年经验,总结了一些经常去学习的地方,现分享给新手(无论是个人站长还是刚...
  • jnwsylzyzc
  • jnwsylzyzc
  • 2010-09-08 11:16
  • 221

细说C++中那些容易忽略而又非常重要的知识点

C++基础重要知识点: 1、C++对C语言的加强之register关键字: ①、C语言中register关键字请求编译器对局部变量存储在寄存器中,无法取到register变量的地址; ②、C++中依然支持register关键字,C++编译器有自己的优化方式,不使用register也...
  • qq_18824491
  • qq_18824491
  • 2017-12-25 10:24
  • 66

C++一些容易忽略的知识点

C和C++的区别以及联系:先看下C语言: C语言是一种面向过程的编程语言,是由数据结构和算法组成的C语言程序设计,强调的是运行效率。 1、C语言的历史: *1969至1973年; 美国贝尔实验室;*2、C语言的功能: 结构化程序设计;3、C语言的优点: 高...
  • qq_30070433
  • qq_30070433
  • 2017-03-31 23:33
  • 166

一些冷门却有用的小知识

1.android:duplicateParentState 要做一个效果,组件RelativeLayout上有两个TextView,这两个TextView具有不同的颜色值,当RelativeLayout被点击时,整个item有高亮背景。同时这两个TextView要变色。就是父控件响应点击事件,子V...
  • ymangu
  • ymangu
  • 2015-05-12 09:39
  • 493

关于Service,你要知道的一些知识

Service到底是什么? 服务,它是在后台运行一些耗时的任务同时不与用户交互或用于其他应用程序使用,比如下载,更新天气等等。必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。
  • qq_36935704
  • qq_36935704
  • 2017-05-31 18:54
  • 118

C++中类的易忽略知识点(初级)

1.类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需要的各种私有函数。封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部...
  • wk_bjut_edu_cn
  • wk_bjut_edu_cn
  • 2018-01-27 16:42
  • 44

SQL Server中的一些知识

如果要在数据库中判断有没有某个表或存储过程,或触发器等等。都可以从数据库中的sysobjects表中查找。比如:要判断数据库pubs中有没有表authors,可以这样查询:        Select * form &#...
  • shipfi
  • shipfi
  • 2004-11-26 11:33
  • 635

Linux基础------Shell数值计算的几种方法

在Linux下总会遇到数值计算问题,由于Linux下变量都属于弱变量,没有变量类型的概念(貌似脚本语言都是这样)。 例如定义一个变量:x=1 此时的变量x默认是一个字符串,即使看着像一个数字,所以当尝试用如下的方法去进行计算的时候,得到的结果却不是想要的 echo $x+=1  ...
  • u010127879
  • u010127879
  • 2014-03-20 16:38
  • 1930
    个人资料
    • 访问:68689次
    • 积分:1522
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:2篇
    • 译文:1篇
    • 评论:45条
    最新评论