前言:
前面讲过牛顿迭代法,当维度非常高的时候,求解Hessian 矩阵的逆矩阵计算量太复杂。
这里介绍一种更简单的求解方法,共轭梯度法
目录:
- 共轭简介
- 算法流程
- 参数推导过程
- 例子
一 : 共轭性质
1.1 共轭说明
A是n*n 的对称正定矩阵, 任意两个非零向量,若
,
则这组方向关于A共轭
1.2 几何意义,极小点:
设有二次函数
其中, 是定点,函数的等值面为
是以 为中心的椭圆面
因为
所以 是极小点
1.3 几何解释
是等值面一个点,沿着 以最优步厂搜索得到点
是点所在等值面的切向量,该点的法向量为
则 与 正交,令
所以
即等值面的切向量和该点指向的极小点的向量关于A共轭
二 : 算法流程
k = 0: 随机变量
if 0==:
停止
else
for
if 0==
return
k =k+1
三 推导过程:
1: 求出下一个搜索方向
假设当前点, ,
令, 设下一个点搜索方向为
因为
所以
2: 求出最佳搜索步伐
求解目标:
对 求导:
因为
所以
四: 例子
损失函数为:
其中
# -*- coding: utf-8 -*-
"""
Created on Tue Nov 5 10:11:12 2019
@author: chengxf2
"""
##共轭梯度下降
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
class PRP() :
def Draw(self):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.arange(-5,5,0.5)
y = np.arange(-5,5,0.5)
X,Y = np.meshgrid(x,y)
Z = 2*np.power(X,2)+np.power(Y,2)
ax.plot_surface(X,Y,Z, rstride=1, cstride=1, cmap='cool')
plt.show()
def GetGradient(self, x):
F = np.mat([[4,2]]).T
grd = np.multiply(F, x)
#print("\n grd :\n ",grd)
return grd
"""
加载数据集
Args
None
return
None
"""
def LoadData(self):
matA = np.mat([[4,0],
[0,2]])
self.A = matA
#print("\n self.A :\n",self.A)
def __init__(self):
self.LoadData()
self.Draw()
self.zero = 1e-6
"""
获得lamb
Args
gk: 梯度
dk: 方向
"""
def Getlamb(self, gk, dk):
a= gk.T*dk
b = dk.T*self.A*dk
lamb = a/b
return -lamb[0,0]
"""
计算系数bk
Args
gk_1: 下一个点梯度
dk_1:前一个点方向
return
b
"""
def GetBk(self, gk_1, dk):
a= gk_1.T*self.A*dk
b = dk.T*self.A*dk
c= a/b
return c[0,0]
def Train(self):
k = 0
xk = np.mat([[2,2]]).T
gk= self.GetGradient(xk) ##初始梯度
if np.linalg.norm(gk)<self.zero:
return xk
else:
dk = -gk ## 初始点方向
while(1) :
lamb = self.Getlamb(gk,dk)
xk_1=xk+lamb*dk
print("\n xk_1: \t ",xk_1.T, "\t: lamb ",lamb)
gk_1 =self.GetGradient(xk_1)
if np.linalg.norm(gk_1)<self.zero:
return xk_1
bk = self.GetBk(gk_1,dk)
dk_1 = -gk_1+bk*dk
#print("\n bk: ",bk, "\t dk_1 ",dk_1)
k=k+1
print("\n 迭代次数 k: \t ",k)
xk = xk_1
gk = gk_1
dk = dk_1
print("\n xk:\t",xk,"\t gk :\t ",gk, "\t dk ",dk)
rp = PRP()
#rp.Train()
参考文档
https://wenku.baidu.com/view/891db73ea88271fe910ef12d2af90242a895ab3f.html