julia中文文件:
鼎鼎有名的泰勒展開式
收斂速度快
增加了乙個步長,步長用劃界法或其他方法來確定,保證每步都下降(修正目的)
為非線性回歸的目標函式是使殘差最小,本質上還是乙個求最小值的問題
o矩陣的元素一般為0,可以省略
可見高斯牛頓法只需要用到一階偏導即可
using linearalgebra
function gaosinewton(
f, # 要擬合成的函式
g, # 梯度,是針對偏回歸係數
data, # 資料,每一行代表的是乙個點,前面是自變數,最後一列是響應變數
start; # 牛頓法的起始點
α0 = 1, # 步長
acc = 0.001,
maxi = 128,
debug = false,
plot = false # 是否輸出迭代點
)end
(放在主函式內)
function getr(para)
return mapslices(row ->f(row[1:end-1]...,para...)-row[end], data, dims = [2])
end# 定義計算j函式
function getj()
return mapslices(row->g(row[1:end-1]...,x0...), data, dims = [2])
end
x0 = start
i = diagonal(ones(length(start)))
r0 = getr(x0)
s0 = sum(r0 .^ 2)
# 取得維度
n,m = size(data)
if m < length(start)
return false
end
for i in 1:maxi
j0 = getj()
g0 = j0' * r0
h0 = j0' * j0
# 求出的em是最小的特徵值
# 修正黑塞矩陣
em = eigmin(h0)
if em < 0
h0 = h0-1.1*em * i
end# newton
if det(h0) ==0
println("i:",i,"黑塞矩陣不可逆")
return nothing
endd = -inv(h0) * g0
# 計算步長
#α0 = searcha(f,g,x0,g(,))
# upload data
δ = α0 .* d
x = x0 .+ δ
r = getr(x)
# 目標函式值
s = sum(r .^ 2)
if plot
println(x')
endif debug
println("i:",i,",x:",x)
println("s:",s)
println("r0",r0)
println("j0",j0)
end# 剪測是否達到要求的精度
if abs(s - s0)/max(1,s0) < acc
println("高斯牛頓法完成")
return x,s
endx0 = x
r0 = r
s0 = s
endprintln("達到最大迭代次數,結束高斯牛頓法")
return x0,s0
end
#test
x,s = gaosinewton(
(x,a,b) -> a + b*x^2,
(x,a,b) -> [1,x^2],
#(x,a,b) -> a + exp(b*x^2) ,
#(x,a,b) -> [1,exp(b+x^2)*x^2],
[0 1;1 0;3 2;5 4;6 4;7 5],
[100,100],
debug = false,
plot = true
)#println(x)
#println(s)
牛頓法與擬牛頓法
看了幾篇關於牛頓法的相關介紹,感覺非常好,尤其是擬牛頓條件的推導以及dfp等演算法的推導過程十分詳細明了。這裡記錄一下,方便之後查閱 牛頓法 擬牛頓條件 dfp演算法 bfgs演算法 f bfgs演算法 1 牛頓法 newton s method 牛頓法是一種在實數域和複數域上近似求解方程的方法。方...
牛頓法與擬牛頓法學習筆記(一)牛頓法
好文!先轉在看!機器學習演算法中經常碰到非線性優化問題,如 sparse filtering 演算法,其主要工作在於求解乙個非線性極小化問題。在具體實現中,大多呼叫的是成熟的軟體包做支撐,其中最常用的乙個演算法是 l bfgs。為了解這個演算法的數學機理,這幾天做了一些調研,現把學習過程中理解的一些...
牛頓法和擬牛頓法
正在學習牛頓法,找到一篇非常詳細的部落格,特將目錄整理下來,方便今後回想和查詢。一 牛頓法 主要內容 1 泰勒展開式。比較基礎。2 牛頓法。從其應用的兩個方面來介紹 2.1 求方程的根 一階泰勒展開。2.2 解決最優化問題 二階泰勒展開。此部分又分為兩種情況 二維情況和高維情況。其中,二維情況比較常...