Python 梯度下降

2021-09-24 01:35:50 字數 2672 閱讀 2199

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的梯度。在向量微積分中,標量場的梯度是乙個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。更嚴格的說,從歐氏...