機器學習演算法 1

2021-08-18 23:46:54 字數 2594 閱讀 3630

此上最後部分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就是他們的線性函式...