python 과학 컴 퓨 팅 의 scipy―optimize 용법
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 용법 은 바로 소 편 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시 기 를 바 랍 니 다.여러분 들 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.