黑塞矩阵(Hessian Matrix)

在机器学习课程里提到了这个矩阵,那么这个矩阵是从哪里来,又是用来作什么用呢?先来看一下定义:

黑塞矩阵(Hessian Matrix),又译作海森矩阵、海瑟矩阵、海塞矩阵等,是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。黑塞矩阵最早于19世纪由德国数学家Ludwig Otto Hesse提出,并以其名字命名。黑塞矩阵常用于牛顿法解决优化问题。

一般来说, 牛顿法主要应用在两个方面, 1, 求方程的根; 2, 最优化.

在机器学习里,可以考虑采用它来计算n值比较少的数据,在图像处理里,可以抽取图像特征,在金融里可以用来作量化分析。

图像处理可以看这个连接:

http://blog.csdn.net/jia20003/article/details/16874237

量化分析可以看这个:

http://ookiddy.iteye.com/blog/2204127

下面使用TensorFlow并且使用黑塞矩阵来求解下面的方程:

代码如下:

#python 3.5.3  蔡军生
#http://edu.csdn.net/course/detail/2592
#
import tensorflow as tf
import numpy as np

def cons(x):
    return tf.constant(x, dtype=tf.float32)
def compute_hessian(fn, vars):
    mat = []
    for v1 in vars:
        temp = []
        for v2 in vars:
            # computing derivative twice, first w.r.t v2 and then w.r.t v1
            temp.append(tf.gradients(tf.gradients(f, v2)[0], v1)[0])
        temp = [cons(0) if t == None else t for t in temp] # tensorflow returns None when there is no gradient, so we replace None with 0
        temp = tf.stack(temp)
        mat.append(temp)
    mat = tf.stack(mat)
    return mat

x = tf.Variable(np.random.random_sample(), dtype=tf.float32)
y = tf.Variable(np.random.random_sample(), dtype=tf.float32)

f = tf.pow(x, cons(2)) + cons(2) * x * y + cons(3) * tf.pow(y, cons(2)) + cons(4)* x + cons(5) * y + cons(6)
# arg1: our defined function, arg2: list of tf variables associated with the function
hessian = compute_hessian(f, [x, y])

sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(hessian))

输出结果如下:

再来举多一个例子的源码,它就是用来计算量化分析,这个代码很值钱啊,如下:

#python 3.5.3  蔡军生
#http://edu.csdn.net/course/detail/2592
#
import numpy as np
import scipy.stats as stats
import scipy.optimize as opt

#构造Hessian矩阵
def rosen_hess(x):
    x = np.asarray(x)
    H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1)
    diagonal = np.zeros_like(x)
    diagonal[0] = 1200*x[0]**2-400*x[1]+2
    diagonal[-1] = 200
    diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
    H = H + np.diag(diagonal)
    return H
def rosen(x):
    """The Rosenbrock function"""
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
def rosen_der(x):
    xm = x[1:-1]
    xm_m1 = x[:-2]
    xm_p1 = x[2:]
    der = np.zeros_like(x)
    der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
    der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
    der[-1] = 200*(x[-1]-x[-2]**2)
    return der

x_0 = np.array([0.5, 1.6, 1.1, 0.8, 1.2])

res = opt.minimize(rosen, x_0, method=‘Newton-CG‘, jac=rosen_der, hess=rosen_hess,
                   options={‘xtol‘: 1e-8, ‘disp‘: True})
print("Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian):")
print(res)

输出结果如下:

====================== RESTART: D:/AI/sample/tf_1.43.py ======================
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 20
         Function evaluations: 22
         Gradient evaluations: 41
         Hessian evaluations: 20
Result of minimizing Rosenbrock function via Newton-Conjugate-Gradient algorithm (Hessian):
     fun: 1.47606641102778e-19
     jac: array([ -3.62847530e-11,   2.68148992e-09,   1.16637362e-08,
         4.81693414e-08,  -2.76999090e-08])
 message: ‘Optimization terminated successfully.‘
    nfev: 22
    nhev: 20
     nit: 20
    njev: 41
  status: 0
 success: True
       x: array([ 1.,  1.,  1.,  1.,  1.])
>>>

可见hessian矩阵可以使用在很多地方了吧。

1. C++标准模板库从入门到精通

http://edu.csdn.net/course/detail/3324

2.跟老菜鸟学C++

http://edu.csdn.net/course/detail/2901

3. 跟老菜鸟学python

http://edu.csdn.net/course/detail/2592

4. 在VC2015里学会使用tinyxml库

http://edu.csdn.net/course/detail/2590

5. 在Windows下SVN的版本管理与实战

http://edu.csdn.net/course/detail/2579

6.Visual Studio 2015开发C++程序的基本使用

http://edu.csdn.net/course/detail/2570

7.在VC2015里使用protobuf协议

http://edu.csdn.net/course/detail/2582

8.在VC2015里学会使用MySQL数据库

http://edu.csdn.net/course/detail/2672

可以看更多的网站:

http://blog.csdn.net/ubunfans/article/details/41520047

http://blog.csdn.net/baimafujinji/article/details/51167852

http://jacoxu.com/jacobian%E7%9F%A9%E9%98%B5%E5%92%8Chessian%E7%9F%A9%E9%98%B5/

http://www.cnblogs.com/logosxxw/p/4651413.html

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwnchh/p/10346865.html

时间: 2024-10-19 11:01:30

黑塞矩阵(Hessian Matrix)的相关文章

目标检测之基础hessian matrix ---海森矩阵

就是海赛(海色)矩阵,在网上搜就有. 在数学中,海色矩阵是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵, Hessian矩阵是多维变量函数的二阶偏导数矩阵,H(i,j)=d^2(f)/(d(xi)d(xj)) 它是对称的.如果是正定的的可用导数=0的变量组确定它的极小值,负定的确定它的极大值,否则无法确定极值. 1.极值(极大值或极小值)的定义 设有定义在区域D Rn上的函数 y=f(x)=f(x1,...,xn) . 对于区域D的一内点x0=(x10,...,xn0),若存在x0的一个

分类和逻辑回归(Classification and logistic regression)

分类问题和线性回归问题问题很像,只是在分类问题中,我们预测的y值包含在一个小的离散数据集里.首先,认识一下二元分类(binary classification),在二元分类中,y的取值只能是0和1.例如,我们要做一个垃圾邮件分类器,则为邮件的特征,而对于y,当它1则为垃圾邮件,取0表示邮件为正常邮件.所以0称之为负类(negative class),1为正类(positive class) 逻辑回归 首先看一个肿瘤是否为恶性肿瘤的分类问题,可能我们一开始想到的是用线性回归的方法来求解,如下图:

Matrix calculus

Normally vector is column vector, it is defined as: $$\beta=(\beta_1,\dots,\beta_k)$$ <ol><li>For scalar function $f(\beta)$, derivative with respect to column vector $\beta$ defined as:</li>$$\frac{\partial f(\beta)}{\partial \beta}=\be

梯度、Hessian矩阵、平面方程的法线以及函数导数的含义

本文转载自: Xianling Mao的专栏 =========================================================================== 想必单独论及“ 梯度.Hessian矩阵.平面方程的法线以及函数导数”等四个基本概念的时候,绝大部分人都能够很容易地谈个一二三,基本没有问题. 其实在应用的时候,这几个概念经常被混淆,本文试图把这几个概念之间的关系整理一下,以便应用之时得心应手. 这四个概念中,Hessian矩阵是最不容易混淆,但却是

目录:Matrix Differential Calculus with Applications in Statistics and Econometrics,3rd_[Magnus2019]

目录:Matrix Differential Calculus with Applications in Statistics and Econometrics,3rd_[Magnus2019] Title -16 Contents -14 Preface -6 Part One - Matrices 1 1 Basic properties of vectors and matrices 3 1.1 Introduction 3 1.2 Sets 3 1.3 Matrices: additio

海森(Hessian)矩阵

在图的鞍点位置,?标函数在x轴?向上是局部最小值,但在y轴?向上是局部最?值. 假设?个函数的输?为k维向量,输出为标量,那么它的海森矩阵(Hessian matrix)有k个特征值(参?附录中“数学基础”?节).该函数在梯度为0的位置上可能是局部最小值.局部最?值或者鞍点. •当函数的海森矩阵在梯度为零的位置上的特征值全为正时,该函数得到局部最小值.• 当函数的海森矩阵在梯度为零的位置上的特征值全为负时,该函数得到局部最?值.•当函数的海森矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍

(笔记)斯坦福机器学习第四讲--牛顿法

本讲内容 1. Newton's method(牛顿法) 2. Exponential Family(指数簇) 3. Generalized Linear Models(GLMs)(广义线性模型) 1.牛顿法 假如有函数, 寻找使得 牛顿法的步骤如下: (1) initialize  as some value. 上图中用  初始化 的值 (2) 在这一点上对f求值得到,之后计算这一点的导数值 (3) 作该点的切线,得到与横轴的交点的值,此为牛顿法的一次迭代. 更新公式为           我

SURF算法

一.原理: Sift算法的优点是特征稳定,对旋转.尺度变换.亮度保持不变性,对视角变换.噪声也有一定程度的稳定性:缺点是实时性不高,并且对于边缘光滑目标的特征点提取能力较弱. Surf(Speeded Up Robust Features)改进了特征的提取和描述方式,用一种更为高效的方式完成特征的提取和描述. 二.Surf实现流程如下: 1. 构建Hessian(黑塞矩阵),生成所有的兴趣点,用于特征的提取 黑塞矩阵(Hessian Matrix)是一个多元函数的二阶偏导数构成的方阵,描述了函数

Scale Space(zz Wiki)

Scale space From Wikipedia, the free encyclopedia Scale space Scale-space axioms Scale-space implementation Feature detection Edge detection Blob detection Corner detection Ridge detection Interest point detection Scale selection Affine shape adaptat