python 과학 컴 퓨 팅 의 scipy―optimize 용법

4251 단어 pythonscipyoptimize
앞 에 쓰다
Scipy 의 optimize 모듈 은 많은 수치 최적화 알고리즘 을 제공 하고 그 중의 일부 기록 을 제공 합 니 다.
비 선형 방정식 그룹 구 해
Scipy 에서 비 선형 방정식 그룹 에 대한 구 해 는 fslove()함수 이다.그의 호출 형식 은 보통 fslove(fun,x0)이 고 fun 은 비 선형 방정식 그룹의 오차 함 수 를 계산 하 는 것 이다.이것 은 매개 변수 x 가 필요 하 다.fun 은 x 에 의 해 선형 방정식 그룹의 모든 방정식 의 값(또는 오차 라 고 함)을 계산 하고 x0 은 x 의 초기 값 이다.

"""
        :
  5x1+3 = 0
  4x0^2-2sin(x1x2)=0
  x1x2-1.5=0
"""
##     
def fun(x):
  x0,x1,x2 = x.tolist()
  return[5*x1+3,4x0^2-2sin(x1x2),x1x2-1.5]

result = optimize.fsolve(fun,[1,1,1])
## result
[-0.70622057  -0.6  -2.5]
비 선형 방정식 의 해 를 계산 할 때 예 를 들 어 좌표 상승 알고리즘 과 같이 그 중에서 미지수 의 도 수 를 사용 해 야 한다.마찬가지 로 scipy 의 fslove()도 fpime 매개 변수 가 미 지 수 를 전달 하 는 제 이 콥 행렬 을 제공 하여 계산 을 가속 화하 고 전달 하 는 제 이 콥 행렬 의 모든 줄 에서 특정한 방정식 이 각 미 지 수 를 전달 하 는 도 수 를 제공한다.위의 예 에 대해 우 리 는 다음 과 같은 제 이 콥 행렬 의 전래 를 쓸 수 있다.

def j(x):
  x0,x1,x2 = x.tolist()
  return[[0,5,0],[8*x0,-2*x2*cos(x1*x2],[0,x2,x1]]

result = optimize.fsolve(fun,[1,1,1],fprime=j)
#result
[-0.70622057  -0.6  -2.5]
scipy 의 내 부 는 fslove 를 실현 할 때 좌표 상승 알고리즘 이나 경사도 관련 최적화 알고리즘 을 이용 해 야 하지만 본인 은 고증 하지 않 았 고 관심 이 있 으 면 소스 코드 를 볼 수 있 습 니 다.
최소 2 곱 하기 적합
최소 2 곱 하기 알고리즘 에 대한 이론 은 여기 서 말 하고 싶 지 않 습 니 다.인터넷 에서 해석 한 글 도 많 습 니 다.optimize 모듈 에서 leastsq()를 사용 하여 데 이 터 를 최소 2 곱 하기 적합 하 게 계산 할 수 있 습 니 다.leastsq()의 용법 은 매우 간단 합 니 다.불판 오차 의 함수 와 확정 되 어야 할 매개 변수의 초기 값 을 전달 하면 됩 니 다.

x = np.array([8.19,2.72,6.39,8.71,4.7,2.66,3.78])
y = np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])
def residual(p):
  k,b = p
  return y-(k*x+b)
r = optimize.leastsq(residual,[1,0])
k,b = r[0]
# print k
.613495349193
# print b
.79409254326

def func(x,p):
  """
           :A*sin(2*pi*k*x+theta)
  """
  A,k,theta = p
  return A*sin(2*np.pi*k*x+theta)

def redis(p,y,x):
  return y-func(x,p)

x = np.linspace(0,2*np.pi,100)
A,k,theta = 10,0.34,np.pi/6
y0 = func(x,[A,k,theta])
#     
np.random.seed(0)
y1 = y0+2*np.random.randn(len(x))
p0 = [7,0.40,0]
# p0 A,k,theta    ,y1,x      
plsq = optimize.leastsq(redis, p0,args=(y1,x))
print [A,k,theta] #      
print plsq[0]  #       
사인 파 나 코사인 파 와 같은 곡선 적합 에 대해 optimize 는 curve 를 제공 합 니 다.fit()함수,사용 방식 은 leastq()와 약간 다 릅 니 다.곡선의 값 을 직접 계산 합 니 다.예 를 들 어 위의 의합 사인 파 는 cureve 를 사용 할 수 있 습 니 다.fit()로 쓰 세 요.

def func2(x,p):
  """
           :A*sin(2*pi*k*x+theta)
  """
  A,k,theta = p
  return A*sin(2*np.pi*k*x+theta)
ret,_=optimize.curve_fit(func2,x,y1,p0=p0)
이 함수 의 단점 은 초기 값 에 민감 하 다 는 것 이다.초기 주파수 와 실제 주파수 의 차이 가 너무 많 으 면 마지막 에 진짜 주파 수 를 수렴 하지 못 하 게 된다 는 것 이다.
부분 최소 값
optimize 모듈 은 자주 사용 하 는 최소 값 알고리즘 도 제공 했다.예 를 들 어 Nelder-Med,Powell,CG,BFGS,Newton-CG 등 이다.이런 최소 값 을 계산 할 때 1 단계 도체 행렬(제 이 콥 행렬)이나 2 단계 도체 행렬(검은색 플러그 행렬)에 들 어가 수렴 을 가속 화 시킨다.이런 최적화 알고리즘 은 전체 최소 값 으로 수렴 하 는 것 을 보장 하지 못 한다.대부분 국 지적 극소 치 로 수렴 된다.이 함수 들 의 호출 방식 은:

optimize.minimize(target_fun,init_val,method,jac,hess) 
target_fun:        ; 
init_val:   ; 
method:      ; 
jac:      
hess:    。
전역 최소 값 알고리즘
전역 최소 값 은 optimize.basinhopping()을 사용 하여 이 루어 집 니 다.이 함 수 는 먼저 제곱 오차 함수,niter 시 교체 횟수 등 오차 계산 방식 을 정의 해 야 합 니 다.마지막 으로 부분 극소 값 최적화 방법 이 필요 합 니 다.minimizerkwargs 가 들 어 왔 습 니 다.예 를 들 어 위의 사인 함수 적합:

def func1(x,p):
  """
           :A*sin(2*pi*k*x+theta)
  """
  A,k,theta = p
  return A*sin(2*np.pi*k*x+theta)
def func_error(p,y,x):
  return np.sum((y-func1(x,p)**2)
result = optimize.basinhopping(func_error,[1,1,1],niter=10,
              minimizer_kwargs={"method":"L-BFGS-B",
                        "args":(y1,x1)})
## [1,1,1]       ,args        
이상 python 과학 컴 퓨 팅 의 scipy-optimize 용법 은 바로 소 편 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시 기 를 바 랍 니 다.여러분 들 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기