Python 으로 최 속 하강 법 을 실현 하여 극 치 를 구 하 는 방법
그 중에서 4.567916.네 거 티 브 경사도 방향,즉 최 속 하강 방향 이다.αkαk.검색 길이 입 니 다.
일반적인 상황 에서 가장 좋 은 보폭αkαk 의 확정 은 선형 검색 기술,예 를 들 어 정확 한 선형 검색 을 사용 해 야 하지만 더욱 자주 사용 하 는 것 은 부정 확 한 선형 검색 이다.주로 Goldstein 의 부정 확 한 선형 검색 과 Wolfe 법 선형 검색 이다.
호출 편 의 를 위해 Python 파일 을 만 듭 니 다.선형 검색 의 하위 함 수 를 저장 하고 linesearch.py 라 고 명명 합 니 다.Goldstein 선형 검색 함수 만 작 성 했 습 니 다.Goldstein 원칙 에 대해 서 는 최 적 화 된 교과 서 를 참조 할 수 있 습 니 다.
선형 검색 코드 는 다음 과 같 습 니 다(사용 버 전 은 Python 3.3).
'''
'''
import numpy as np
import random
def goldsteinsearch(f,df,d,x,alpham,rho,t):
flag=0
a=0
b=alpham
fk=f(x)
gk=df(x)
phi0=fk
dphi0=np.dot(gk,d)
alpha=b*random.uniform(0,1)
while(flag==0):
newfk=f(x+alpha*d)
phi=newfk
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
상기 함수 의 입력 매개 변 수 는 주로 다 중 함수 f 를 포함 하 는데 그 도체 df,현재 교체 점 x 와 현재 검색 방향 d 를 포함 하고 반환 값 은 Goldstein 준칙 에 따라 확 정 된 검색 속도 입 니 다.우 리 는 여전히 Rosenbrock 함 수 를 예 로 들 면 있다.
그래서 얻 을 수 있 는 함수 의 경사도 는?
최 속 하강 법의 코드 는 다음 과 같다.
"""
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)
"""
import numpy as np
import matplotlib.pyplot as plt
import random
import linesearch
from linesearch import goldsteinsearch
def rosenbrock(x):
return 100*(x[1]-x[0]**2)**2+(1-x[0])**2
def jacobian(x):
return np.array([-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0]),200*(x[1]-x[0]**2)])
X1=np.arange(-1.5,1.5+0.05,0.05)
X2=np.arange(-3.5,2+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
def steepest(x0):
print(' :')
print(x0,'
')
imax = 20000
W=np.zeros((2,imax))
W[:,0] = x0
i = 1
x = x0
grad = jacobian(x)
delta = sum(grad**2) #
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
grad = jacobian(x)
delta = sum(grad**2)
i=i+1
print(" :",i)
print(" :")
print(x,'
')
W=W[:,0:i] #
return W
x0 = np.array([-1.2,1])
W=steepest(x0)
plt.plot(W[0,:],W[1,:],'g*',W[0,:],W[1,:]) #
plt.show()
서로 다른 파일 에서 함수 호출 을 실현 하기 위해 서,우 리 는 먼저 import 함수 로 선형 검색 의 하위 함수,즉 아래 의 2 줄 코드 를 가 져 왔 습 니 다.
import linesearch
from linesearch import goldsteinsearch
물론 Goldsteinsearch 함 수 를 정의 하 는 코드 를 프로그램 에 직접 넣 으 면 이렇게 번 거 로 울 필요 가 없습니다.하지만 그러면 프로그램 이 길 어 보일 뿐만 아니 라 Goldsteinsearch 함수 의 재 활용 도 쉽 지 않 습 니 다.그 밖 에 Python 은 함수 식 프로 그래 밍 도 잘 지원 합 니 다.Goldsteinsearch 함 수 를 정의 할 때 추상 적 인 함수 f,df 를 입력 매개 변수 로 사용 할 수 있 습 니 다.호출 할 때 예화 하면 됩 니 다.Matlab 와 달리 함 수 를 매개 변수 로 전달 할 때 Python 은@을 사용 하여 함수 핸들 로 바 꿀 필요 가 없습니다.
실행 결과
:
[-1.2 1. ]
: 1504
:
[ 1.00318532 1.00639618]
선형 검색 서브루틴 에서 랜 덤 함 수 를 사 용 했 기 때문에 초기 검색 점 은 랜 덤 으로 생 성 되 었 기 때문에 매번 실행 되 는 결과 가 같 지 않 습 니 다.예 를 들 어 프로그램 을 다시 실행 하면 얻 을 수 있 습 니 다.
:
[-1.2 1. ]
: 1994
:
[ 0.99735222 0.99469882]
그림%1 개의 캡 션 을 편 집 했 습 니 다.이 편 은 Python 으로 최 속 하강 법 을 실현 하여 극 치 를 구 하 는 방법 은 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 많은 응원 부 탁 드 리 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.