1. 程式人生 > >黑塞矩陣(Hessian Matrix)

黑塞矩陣(Hessian Matrix)

可見 lua 我們 obi show protobuf result rmi 解決

在機器學習課程裏提到了這個矩陣,那麽這個矩陣是從哪裏來,又是用來作什麽用呢?先來看一下定義:

黑塞矩陣(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

黑塞矩陣(Hessian Matrix)