機器學習演算法 1

2021-08-18 23:45:51 字數 1743 閱讀 4583

######################## 擬牛頓_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就是他們的線性函式...