啥也別說了,最優化太心酸了,可能是每個計算機專業人的噩夢(主要是數學渣)。直接上**。
# 向前查詢搜尋區間,接受線搜尋方向的導數f為唯一引數,返回搜尋區間左右端點left,right
deffind_interval
(f):
left =
0 step =
1 coefficient =
2 right = left + step
while f(right)
<0:
left = right
step = step*coefficient
right = left + step
return left, right
# 實現用二分法精確線搜尋,接受線搜尋方向的導數和搜尋區間左右端點為三個引數,返回
# 絕對值不超過10**-6的近似極小點mid
deffind_root
(f, left,right)
: limit =1e-
6 mid =
(left + right)/2
while
abs(f(mid)
)>= limit:
if f(mid)
<0:
left = mid
elif f(mid)
>=0:
right = mid
mid =
(left + right)/2
return mid
# 接收待優化函式的梯度g和初始值x(numpy陣列型別)為兩個引數,返回梯度向量長度
# (norm(g(x))不超過1e-5的近似極小值點(呼叫norm 函式計算向量長度,測試時
# 可以使用numpy庫中的linalg模組的norm函式實現)
defgrad_min
(g, x)
:import numpy
while numpy.linalg.norm(g(x)
)>1e-
5:d=
-g(x)
d=-g(x)
/numpy.linalg.norm(g(x)
)
h =lambda y:numpy.dot(g(x+y*d)
,d)# d搜尋方向,h為線搜尋方向的導數
x = x+find_root(h,find_interval(h)[0
], find_interval(h)[1
])*d return x
import numpy
from sympy import lambdify, symbols, matrix, matrixsymbol, diff
g = matrixsymbol(
'g',2,
2)b = matrixsymbol(
'b',2,
1)c = matrixsymbol(
'c',1,
1)ps =
[c, b,g]
xs = symbols(
'x1:3'
)x = matrix(xs)
quad =
(x.t*g*x/
2+b.t*x+c)[0
,0]expr=
lambda y:quad.subs(
[(p, matrix(y.pop())
)for p in ps]
).simplify(
)fexpr=expr([[
[21,4
],[4
,1]]
,[2,
3],[
10]])
gexpr=
[diff(fexpr,x)
for x in xs]
glambdify=
[lambdify(
[xs]
,f,"numpy"
)for f in gexpr]
g =lambda y:numpy.array(
[f(y)
for f in glambdify]
)# 計算梯度
x = numpy.array([1
,1])
grad_min(g,x)
# 執行結果 array([ 1.99999231, -10.9999606 ])
最優化演算法 模擬退火 Python實現
模擬退貨演算法可以分解為解空間 目標函式和初始解三部分 求乙個函式的最優解可以通過貪心演算法獲得其最優解,但有可能是區域性最有解,而不是全域性最優解。為了解決這一問題,產生了模擬退火演算法,該演算法是在搜尋的過程中加入了隨機的因素,以一定的概率接受比當前解要差的解,因此有可能會跳出這個區域性最優解,...
最優化演算法(一) 梯度下降法
梯度下降法的目標是 此時輸入 目標函式f x 梯度函式g x 精度e 輸出 f x 的極小點 1 取初始值 2 計算 3 計算梯度值更新,k k 1。注意 一般當目標函式為凸函式時,梯度下降法為全域性最優解,對於複雜函式並不一定。對於梯度下降有兩種實現方法 批量梯度下降 每次遍歷所有的樣本取最小化所...
《最優化導論》 8梯度方法
1.梯度迭代 a 0時,負梯度方向,是函式值下降方向 1.1梯度下降法 當接近極小值時,梯度接近0,通用形式如下,有一些具體實現 1 最速下降法 梯度下降的一種具體實現,理念是在每次迭代時,選擇最佳合適的步長ak,使得目標函式值最大程度的減少。流程 初始迭代點出發,沿負梯度方向開展前面說的一維搜尋,...