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