code:
import random
import numpy as np
import matplotlib.pyplot as plt
"""最速下降法
rosenbrock函式
函式 f(x)=100*(x(2)-x(1).^2).^2+(1-x(1)).^2
梯度 g(x)=(-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)),200*(x(2)-x(1)^2))^(t)
"""
def goldsteinsearch(f,df,d,x,alpham,rho,t):
'''線性搜尋子函式
數f,導數df,當前迭代點x和當前搜尋方向d
'''flag = 0
a = 0
b = alpham
fk = f(x)
gk = df(x)
phi0 = fk
dphi0 = np.dot(gk, d)
# print(dphi0)
alpha=b*random.uniform(0,1)
while(flag==0):
newfk = f(x + alpha * d)
phi = newfk
# print(phi,phi0,rho,alpha ,dphi0)
if (phi - phi0 )<= (rho * alpha * dphi0):
if (phi - phi0) >= ((1 - rho) * alpha * dphi0):
flag = 1
else:
a = alpha
b = b
if (b < alpham):
alpha = (a + b) / 2
else:
alpha = t * alpha
else:
a = a
b = alpha
alpha = (a + b) / 2
return alpha
def rosenbrock(x):
# 函式:f(x) = 100 * (x(2) - x(1). ^ 2). ^ 2 + (1 - x(1)). ^ 2
return 100*(x[1]-x[0]**2)**2+(1-x[0])**2
def jacobian(x):
# 梯度g(x) = (-400 * (x(2) - x(1) ^ 2) * x(1) - 2 * (1 - x(1)), 200 * (x(2) - x(1) ^ 2)) ^ (t)
return np.array([-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0]),200*(x[1]-x[0]**2)])
def steepest(x0):
print('初始點為:')
print(x0,'\n')
imax = 20000
w = np.zeros((2, imax))
epo=np.zeros((2, imax))
w[:, 0] = x0
i = 1
x = x0
grad = jacobian(x)
delta = sum(grad ** 2) # 初始誤差
f=open("最速.txt",'w')
while i < imax and delta > 10 ** (-5):
p = -jacobian(x)
x0 = x
alpha = goldsteinsearch(rosenbrock, jacobian, p, x, 1, 0.1, 2)
x = x + alpha * p
w[:, i] = x
if i % 5 == 0:
epo[:,i] =np.array((i,delta))
f.write(str(i)+" "+str(delta)+"\n")
print(i,np.array((i,delta)))
grad = jacobian(x)
delta = sum(grad ** 2)
i = i + 1
print("迭代次數為:", i)
print("近似最優解為:")
print(x, '\n')
w = w[:, 0:i] # 記錄迭代點
return [w,epo]
if __name__=="__main__":
x1 = np.arange(-1.5, 1.5 + 0.05, 0.05)
x2 = np.arange(-3.5, 4 + 0.05, 0.05)
[x1, x2] = np.meshgrid(x1, x2)
f = 100 *(x2 - x1 ** 2) ** 2 + (1 - x1) ** 2 # 給定的函式
plt.contour(x1, x2, f, 20) # 畫出函式的20條輪廓線
x0 = np.array([-1.2, 1])
list_out = steepest(x0)
w=list_out[0]
epo=list_out[1]
plt.plot(w[0, :], w[1, :], 'g*-') # 畫出迭代點收斂的軌跡
plt.show()
梯度下降 隨機梯度下降 批梯度下降
下面的h x 是要擬合的函式,j 損失函式,theta是引數,要迭代求解的值,theta求解出來了那最終要擬合的函式h 就出來了。其中m是訓練集的記錄條數,j是引數的個數。梯度下降法流程 1 先對 隨機賦值,可以是乙個全零的向量。2 改變 的值,使j 按梯度下降的方向減少。以上式為例 1 對於我們的...
梯度下降 隨機梯度下降和批量梯度下降
對比梯度下降和隨機梯度下降和批量梯度下降 之前看的知識比較零散,沒有乙個系統的解釋說明,看了一些網上的博主的分析,總結了一下自己的理解。例子這裡我參照其他博主的例子做了一些修改,首先是梯度下降 coding utf 8 import random this is a sample to simula...
stanford 梯度 梯度下降,隨機梯度下降
一 梯度gradient 在標量場f中的一點處存在乙個向量g,該向量方向為f在該點處變化率最大的方向,其模也等於這個最大變化率的數值,則向量g稱為標量場f的梯度。在向量微積分中,標量場的梯度是乙個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。更嚴格的說,從歐氏...