梯度下降與共軛梯度法求解最優化應用

2021-10-04 06:04:39 字數 2756 閱讀 3110

使用梯度下降與共軛梯度法求解:

python原始碼:

from numpy import *

import matplotlib.pyplot as plt

def opt330(x: ndarray, r: int, alpha: float, beta: float, alg: str, maxiter: int = 2000):

global a

global b

global step

res =  #迭代散點

fx_fro_a = gradient_f_a(a,b)

fx_fro_b = gradient_f_b(a,b)

d_a = a

d_b = b

title = 'alpha='+str(alpha)+'  beta='+str(beta)

plt.plot(res,color="red")

plt.title(title)

plt.rcparams['font.sans-serif']=['simhei']

plt.rcparams['axes.unicode_minus']=false

plt.xlabel("迭代次數")

plt.ylabel("函式最小值")

plt.show()

#print()

print('%d'"次迭代後的最小值為:"%maxiter)

print(res[-1])

return a, b.t

def  gradient_f_a(a,b):

return -2*dot(x,b)+2*a.dot(dot(b.t,b))+alpha*a

def  gradient_f_b(a,b):

return -2*dot(x.t,a)+2*b.dot(dot(a.t,a))+beta*b

def f(a,b):

return pow(linalg.norm(x-dot(a,b.t)),2)+alpha*pow(linalg.norm(a),2)+beta*pow(linalg.norm(b),2)

if __name__ == '__main__':

alg = "cg"       #gradient:梯度下降  cg:共軛梯度

alpha = 1

beta = 2  

maxiter = 2000   #迭代次數

r = 5

a = random.random((50,r))

b = random.random((20,r))

step = 0.0008     #步長

print("預設:" + "\n" + "r = 5" + "   " + "α = 1" + "   " + "β = 2" + "   " + " maxiter =2000" +"\n" "預設共軛梯度")

define = str(input("自定義引數(y/n):"))

if(define == 'y'):

r = int(input("設定r(default r = 5):"))

alpha = int(input("設定α(default α = 1):"))

beta = int(input("設定β(default β = 2):"))

iterations = int(input("設定maxiter(default 2000):"))

alg = str(input("設定alg(gradient or cg):"))

a = random.random((50,r))

b = random.random((20,r))

x = a.dot(b.t)

opt330(x,r,alpha,beta,alg,maxiter)

共軛梯度法執行結果:

梯度下降法執行結果:

梯度下降演算法迭代公式:

共軛梯度迭代公式:

演算法特點:

1、梯度下降演算法並不能保證被優化函式達到全域性最優解,只有當損失函式為凸函式時,梯度下降演算法才能保證達到全域性最優解,因此不能保證一定達到全域性最優,受限於損失函式是否為凸函式。

2、梯度下降演算法由於要在全部資料上最小化損失,在海量訓練資料下,計算時間長。

3、共軛梯度法是介於最速下降法與牛頓法之間的乙個方法,它僅需利用一階導數資訊,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要儲存和計算海塞矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的演算法之一。其優點是所需儲存量小,具有步收斂性,穩定性高,而且不需要任何外來引數。

最優化演算法 共軛梯度法

特點 具有超線性收斂速度,只需要計算梯度,避免計算二階導數 step0 給定初始值 x 0 容許誤差 epsilon step1 計算梯度 g k nabla f x k if norm g k epsilon break 輸出當前值 x k else to step2 step2 begin d ...

最優化 梯度下降法

最優化問題就是求解函式極值的問題,包括極大值和極小值,幾乎所有機器學習演算法歸根到底都是在求解最優化問題。在高等數學 微積分中有求極值統一的思路 找函式導數等於0的點,只要函式可導我們就可以用這種方法。在機器學習中我們一般求函式的極小值,若求極大值我們只需要整體加負號。有些時候我們會對優化變數x有約...

最優化演算法 梯度下降

梯度下降演算法,參考edwin 最優化導論 8.2章節,演算法採用go語言實現。此處演算法仍然存在疑惑,主要是獲取梯度下降時如何確定步長,即使採用割線法獲取最優步長,那麼割線法的初始值又如何確定?下面程式中雖然採用了牛頓法獲取極值,但非常依賴初始取值範圍!filename grad.go autho...