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 으로 최 속 하강 법 을 실현 하여 극 치 를 구 하 는 방법 은 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기