모델링 - Newton-Raphson method로 모수 최적화
파이썬으로 Newton-Raphson method를 이용한 다차원 모수 최적화



모델링 - 지난 글

목차

  1. 모수 추정이란?
  2. 테일러 급수
  3. Newton-Raphson method
  4. 광합성 모델에서의 뉴턴법
  5. 파이썬을 통해 구현한 광합성 최적화 모델
  6. 참고 문헌




모수 추정이란

모델링을 하는 과정에 있어서 모수 추정은 매우 중요한 과정 중 하나이다. 통계학 과점에서 대상의 전체인 모집단을 분석하는 데에 너무나 많은 시간과 비용이 필요하기 때문에 모집단의 일부인 표본을 통해 모집단의 특성을 파악한다고 정의한다. 하지만 표본을 통해 추정하는 것은 100% 일치한다고 보장할 수 없다. 일부에 대한 특성만을 이용하여 전체와 얼마나 일치하는 지를 확인하는 것이기 때문에 추정한 값과 실제 값 사이에는 오차가 존재할 수 밖에 없다.

모델링도 마찬가지이다. 일부 실험을 통해 얻은 자료로 식물의 기작을 설명하고자 하는 것이기 때문에 오차는 필연적으로 발생할 것이다. 하지만 모델러인 우리는 이 오차를 가장 효율적이고 정확하게 줄이는 방법을 알아야한다. 그리고 이 과정은 앞에서 언급했듯 가장 중요한 과정중 하나로 작물 모델링의 교과서인 작물생육 모델링의 이론과 실제에서도 모수 추정의 방법을 가장 먼저 정의하고 설명한다.

이번 글에서는 널리 알려진 모수 추정 방법 중 하나인 Newton 법에 대하여 알아보도록 하겠다.



테일러 급수

어떤 특정한 함수의 성질을 이해할 때 그 함수를 직접적으로 관찰하기보다는 그 함수와 비슷한 함수를 찾아냄으로써 우리가 관심있는 함수의 성징을 이해할 수 있는데 이 때 사용되는 방법이 테일러 전개(Tayler’s Expension)이라 한다.

쉽게 말해 테일러 전개는 우리가 파악하기 어려운 함수들을 우리가 그동안 쉽게 알고 있었던 다양한 함수로 ‘근사’ 시켜서 원래 함수의 성질들을 파악하는 데 사용하는 것이다. 테일러 전개를 위해서는 우선 함수들을 거듭제곱으로 표현할 수 있어야 하는데, 이 때 표현되는 급수를 테일러 급수라 한다. 어떤 함수 f(x)가 무한번 미분가능한 함수라 할 때

image 위와 같은 다항함수로 표현할 수 있고, 이를 a에서 f(x)의 테일러 급수라 한다.


테일러 급수는 원래의 함수를 ‘근사’ 시킨 것 이므로 오차가 존재할 것이다. 위에서 언급했 듯 테일러 급수는 무한번 미분 가능한 함수이다. 따라서 다음과 같이 표현할 수 있다.

image 우변의 급수는 무한급수이므로 우리는 부분합의 극한을 생각할 수 있다. 즉, f(x)는 부분합으로 이루어진 수열의 극한을 의미한다. 무한급수 에서는 부분합을 이용하 듯이 테일러 급수에서도 부분합을 이용하는데 이를 n차 테일러 다항식(nth Taylor Polynomial)이라 부르고 함수 f(x)에 대하여 다음과 같이 정의한다.


a에서 f(x)의 n차 테일러 다항식

image 함수 f(x) = e^x에 대하여 0에서 T1(x), T2(x), T3(x)를 구하면

image

이를 통해 각각의 다항식을 그래프로 나타내면 n이 증가할 수록 Tn(x)의 그래프는 e^x의 그래프에 근접함을 예측할 수 있는 것이다.


정리하면, 테일러 급수가 필요한 이유는 우리가 잘 모르거나 복잡한 함수를 다루기 쉽고 이해하기 쉬운 다항함수 (ex, 1~3차 다항함수)로 대체시키기 위함이다. 또한 어떤 함수를 테일러 급수로 표현하면 그 함수의 특성을 분석하기가 조금 더 용이해진다. 테일러 급수는 또한 복잡한 함수를 1~3차 다항함수로 근사하여 사용하기 때문에 단순화시킨다고 표현할 수도 있다.

우리는 이러한 테일러 급수의 원리를 적용한 예시인 뉴턴법 (Newton-Raphson method)에 대하여 알아보겠다.



Newton-Raphson method

뉴턴법 (Newton-Raphson method)는 함수 f(x)에 대해 테일러 급수를 통해 근사 함수를 구하고 최소점에서 그 도함수가 0인 사실을 이용하는 것이다. 쉽게 말해 f(x) = 0의 해를 근사적으로 찾을 때 유용하게 사용된다.

뉴턴법은 기본적으로 f’(a)가 x = a에서의 접선의 기울기라는 미분의 기하학적 해석을 이용하며, 현재 x값에서 접선을 그리고 접선이 x축과 만나는 지점으로 x를 이동시켜 가면서 점진적으로 해를 찾는 방법이다.

다음 그림을 보면 이해하기 쉽다. 처음에 x = x1에서 시작했다면, 그 다음 x값은 x2가 될 것이고, x2에서 다시 접선을 그려보면 점차 실제 해에 가까워진다는 것이 원리이다. 그리고 이를 반복하다보면 해를 찾을 수 있는 것이 뉴턴법인 것이다.

image


이를 수식화하면 다음과 같다. 초기값에서 수렴할 때까지 계속 x를 이동시키며, x 값이 더이상 변화가 없을 경우 종료한다. |xt+1 - xt|이 매우 작은 값이면 뉴턴법을 종료하고 x = xt+1이 해, 즉 f(xt+1) = 0 라고 생각하는 것이다.

image



Newton-Raphson method의 특징



광합성 모델에서의 뉴턴법

다음은 광합성 모델 (gasexchange)에서 모수 추정을 위하여 뉴턴법을 사용한 예시이다. 최적화 모델배추모델에서 Energy Balance 모델로 부터 예측한 엽 내부 CO2 농도 및 온도 값을 일정 조건에서의 오차를 줄이기 위해 사용되었다.

참고 문헌

image

식물의 잎은 공기, 기공, 세포 내부로 크게 3개의 레이어로 나눌 수 있다. 그 중 우리가 센서로 계측할 수 있는 환경조건(온도, CO2 농도 등)은 공기중 환경에 해당한다. 하지만 식물의 잎에는 기공이 존재하며, 공기 중의 환경에 따라 기공의 열고 닫힘이 조절되며 이에 따라 세포 내부온도CO2 농도 또한 바뀌게 된다.

모델링을 하는 과정 에서 잎의 세포 내 온도 및 CO2 농도를 측정하기는 쉽지 않다. 따라서 잎의 기공의 열고 닫음을 컨트롤 하는 기공 전도도와 이에 따른 Energy Balance를 설명하는 수식을 적용하여 입의 세포 내 온도 및 CO2 농도 예측을 하고자 하였고, 이에 대한 정확도를 향상시키기 위해 뉴턴법을 적용하여 오차를 줄이고자 한 것이다.


image잎의 레이어 (공기, 기공, 세포 내부)

imageEnergy Balance 모델 수식



파이썬을 통해 구현한 광합성 최적화 모델

def routine(self):
    Ca = self.Ca
    Tleaf = self.Ta
    Ci = self.Ca * 0.9

    def func1(Ci, Tleaf):
        An = self.leafAssim(Tleaf, Ci)[0]
        gbc = self.gbc()
        gsco = self.gsc(An, Tleaf)[0]
        newCi = self.interCi(An, Tleaf)
        return (newCi - Ci)

    def func2(Ci, Tleaf):
        An = self.leafAssim(Tleaf, Ci)[0]
        gbc = self.gbc()
        gsco = self.gsc(An, Tleaf)[0]
        newTleaf = self.EnergyBal(An, Tleaf)[0]
        return (newTleaf - Tleaf)

    Ci, Tleaf = self.Newton_2Var(func1, func2, Ci, Tleaf)

func1 함수: 잎의 세포 내부 CO2 예측, func2: 잎의 세포 내부 온도 예측


def Newton_2Var(self, func1, func2, x0, y0, h=0.1, tolerance=1e-8, steps=1000):
    for i in range(1, steps):
        x0 = 0.01 if x0 == 0 else x0
        y0 = 0.01 if y0 == 0 else y0
        A = func1(x0, y0)
        B = (func1(x0 + h, y0) - func1(x0 - h, y0)) / (2 * h)
        C = (func1(x0, y0 + h) - func1(x0, y0 - h)) / (2 * h)
        O = func2(x0, y0)
        P = (func2(x0 + h, y0) - func2(x0 - h, y0)) / (2 * h)
        Q = (func2(x0, y0 + h) - func2(x0, y0 - h)) / (2 * h)
        aaa = C * P - B * Q
        if aaa == 0:
            print("Error: divide by 0")
            aaa = 0.001
        x = x0 + (C * O - A * Q) / (B * Q - C * P)
        y = y0 + (B * O - A * P) / (C * P - B * Q)
        error1 = abs((x - x0) / x)
        error2 = abs((y - y0) / y)
        if (error1 < tolerance) and (error2 < tolerance): break
        x0, y0 = x, y
        self.newci = x
        self.newtleaf = y
    return x, y

예측한 CO2, 온도를 각각 x0, y0에 넣어 뉴턴법 적용

작동 원리는 다음과 같다.

  1. Energy Balance 수식을 통해 예측한 CO2, 온도를 각각 x0, y0 변수에 적용
  2. 만약 x0 및 y0가 0일 경우 0.01 적용
  3. x0 및 y0을 x축으로 간주하며 반복할 때 마다 0.1씩 이동하고, x0, y0에서의 미분값을 구하기 위하여 중앙차분법 적용
  4. x0 와 y0로 2차원이기 때문에 연립방정식 적용을 위하여 자코비안 행렬적용하여 계산
  5. x-x0 및 y-y0의 오차가 1e-8보다 작으면 종료

image자코비안 행렬 적용 원리

참고 문헌




참고 문헌