使用梯度下降與共軛梯度法求解:
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...