此上最後部分lbfgs演算法的展開式有疑議
正確參考如下圖所示:
######################## 擬牛頓_l-bfgs演算法#######################
'''擬牛頓法(如bfgs演算法)需要計算和儲存海森矩陣,其空間複雜度是n2,當n很大時,
其需要的記憶體量是非常大的。為了解決該記憶體問題,有限記憶體bfgs(即傳說中的l-bfgs演算法)橫空出世。
h0 是由我們設定的,其餘變數可由儲存的最近m次迭代所形成的向量序列,
如位移向量序列和一階導數差所形成的向量序列獲得。也就是說,
可由最近m次迭代的資訊計算當前的海森矩陣的近似矩陣。
'''def twoloop(s, y, rho,gk):
'''函式引數s,ys,y即向量序列和,
ρ為元素序列,其元素ρk=1/((sk)t)yk,gk是向量,
為當前的一階導數,輸出為向量z=hkgk,即搜尋方向的反方向
'''n = len(s) #向量序列的長度
if np.shape(s)[0] >= 1:#h0是標量,而非矩陣
h0 = 1.0*(np.dot(s[-1],y[-1]))/(np.dot(y[-1],y[-1]))
else:
h0 = 1
a = np.empty((n,))
q = gk.copy()
for i in range(n - 1, -1, -1):
a[i] = rho[i] * np.dot(s[i], q)
q -= a[i] * y[i]
z = h0*q
for i in range(n):
b = rho[i] * np.dot(y[i], z)
z += s[i] * (a[i] - b)
return z
def lbfgs(fun,gfun,x0,m=5):
# fun和gfun分別是目標函式及其一階導數,x0是初值,m為儲存的序列的大小
maxk = 2000#最大迭代次數
rou = 0.55#非線性搜尋中的b因子
sigma = 0.4#非線性搜尋中的δ因子
epsilon = 1e-5#設定迭代終止得的閾值
k = 0#初始化迭代次數
n = np.shape(x0)[0] #自變數的維度
s, y, rho = , , #s是sk序列的儲存列表,y是yk序列的儲存列表
while k < maxk :
gk = gfun(x0)#計算得到gk
if np.linalg.norm(gk) < epsilon:
break
dk = -1.0*twoloop(s, y, rho,gk)#由s,y,rho列表及gk計算方向
m0=0;#初始化搜尋步長次數
mk=0
while m0 < 20: # 用armijo搜尋求步長
if fun(x0+rou**m0*dk) < fun(x0)+sigma*rou**m0*np.dot(gk,dk):
mk = m0
break
m0 += 1
x = x0 + rou**mk*dk
sk = x - x0
yk = gfun(x) - gk
if np.dot(sk,yk) > 0: #增加新的向量
if np.shape(rho)[0] > m: #棄掉最舊向量
rho.pop(0)
s.pop(0)
y.pop(0)
k += 1
x0 = x
return x0,fun(x0),k#分別是最優點座標,最優值,迭代次數
print(lbfgs(fun,gfun,[10,20],m=5))
#(array([1.00000016, 1.00000031]), 5.273891558003461e-14, 55)
機器學習演算法 1
擬牛頓 bfgs演算法 演算法描述 bfgs演算法與dfp步驟基本相同,區別在於更新公式的差異 def bfgs fun,gfun,hess,x0 功能 用bfgs族演算法求解無約束問題 min fun x 輸入 x0是初始點,fun,gfun分別是目標函式和梯度 輸出 x,val分別是近似最優點和...
機器學習 十六 機器學習演算法總結(1)
監督學習 knn演算法計算測試樣本與訓練集的各樣本的距離,按從小到大取前k個距離排序,然後選擇這k個最相似資料中出現次數最多的分類作為新資料的分類。樸素貝葉斯實現的是概率量化計算的模型,它的解釋是通過對樣本的統計,然後算出某件事a發生的概率和某件事b發生的概率之間的量化關係。決策樹實現的是通過選擇合...
機器學習演算法學習 1
我從線性 函式 影象以及演算法實踐這幾個方面對logistic regression模型進行表述。正常來說,乙個關於分類的問題可以分成線性可分和線性不可分兩種。還有一種叫非線性可分,難頂 1 線性可分是指能夠使用線性函式正確分類,如在座標軸上y 3的一類,y 3為另一類,那麼y 3就是他們的線性函式...