Python으로 VBA로 설치한 계단식 하강법을 써보도록 하겠습니다.

파이썬으로 계단식 하강법을 실시해 보세요.


지난번까지는 VBA에 사다리 하강법을 설치했는데 이번에는 Python에 설치하려고 합니다.
그러나 기본적으로 VBA의 코드를 개작하고 행렬 연산을 사용하지 않는다.
VBA로 계단식 하강법 구현 시도(일회식) 」에서 기술한 장면은 다음 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 둘레를 분석하도록 한다.
  • 지금 조금도 낙담하지 않는 과거의 자신에게 사다리 하강법을 시시콜 설명해 보자.
  • 계단식 하강법(입력 값이 여러 개인 경우 업데이트)
  • VBA로 계단식 하강법 구현 시도(일회식)
  • VBA로 계단식 하강법 시행 (2차식)
  • 데이터


    데이터는 같은 것을 사용한다.
    No
    x
    y

    1.16
    1.49

    2.43
    1.55

    3.02
    1.98

    4.83
    2.07

    5.01
    2.27

    6.16
    2.62

    7.09
    2.78

    8.25
    3.25

    9.71
    3.48

    10.92
    3.65

    코드


    이런 느낌.
    python
    
    import random
    import numpy as np
    import matplotlib.pyplot as plt
    
    #[1] y = ax + b 
    def my_function(w0, w1, x):
        return w0 + w1 * x
    
    #[2] 学習率、パラメータの初期設定
    LR = 0.001
    ERR_POINT = 0.1
    init_w0 = random.random()
    init_w1 = random.random()
    
    w0 = init_w0
    w1 = init_w1
    
    #[3] データの設定
    x_data = [1.16, 2.43, 3.02, 4.83, 5.01, 6.16, 7.09, 8.25, 9.71, 10.92]
    y_data = [1.49, 1.55, 1.98, 2.07, 2.27, 2.62, 2.78, 3.25, 3.48, 3.65]
    
    count = 0
    #[4] 学習
    while count < 1000:
        E = 0
        grad_w0 = 0
        grad_w1 = 0
    
        #[5] データから誤差関数の値と各パラメータの勾配を求める
        for x, y in zip(x_data, y_data):
            y_ = my_function(w0, w1, x)
    
            E = E + ((y - y_)**2)
            grad_w0 += ((y_ - y) * 1)
            grad_w1 += ((y_ - y) * x)
    
        E = E * 0.5
    
        #[6] 誤差が ERR_POINT 未満になったら学習を終了
        if E < ERR_POINT:
            break
    
        #[7] パラメータを更新する
        w0 -= (LR * grad_w0)
        w1 -= (LR * grad_w1)
    
        #[8] 途中経過を表示
        #if count % 50:
        #    print('count:{0} / w0:{1:.3f} / w1:{2:.3f}'.format(count, w0, w1))
    
        count += 1
    
    #[9] 学習済みパラメータの表示
    print('count:{0} / w0:{1:.3f} / w1:{2:.3f}'.format(count, w0, w1))
    
    #[10] グラフの表示
    x_ = np.linspace(start=0, stop=12, num=10)
    y_ = []
    init_y_ = []
    for x in x_:
        init_y_.append (my_function(init_w0, init_w1, x))
        y_.append (my_function(w0, w1, x))
    
    plt.plot(x_data, y_data, 'o')
    plt.plot(x_, y_)
    plt.plot(x_,init_y_)
    
    plt.show()
    

    코드 설명


    아, VBA 코드 이식이니까 한번 봅시다.

    [1] y = ax + b


    직선 표현식.이번에는 매개 변수로 $a$, $b$, $w_ 대신1$, $w_나는 0달러를 썼다.
    $\qquad y = w_0 + w_{1}x$
    변수 이름이 다를 뿐입니다.

    [2] 학습률, 파라미터의 초기 설정


    각각의 초기 값과 의미는 다음과 같다.
    상수 이름/변수 이름
    초기 값
    함의
    LR
    0.001
    학습률
    ERR_POINT
    0.1
    학습 종료 판정 오차
    init_w0
    무작위
    w0 초기 값
    init_w1
    무작위
    w1 초기 값
    w0
    init_w0과 동일
    w0(편압)
    w1
    init_w1과 동일
    w1(경사)

    [3] 데이터 설정


    입력 데이터와 출력 데이터를 준비하세요.
    x_data, y_나는 데이터라는 목록을 준비해서 저장했다.

    [4] 학습


    순환하여 학습하다.순환 횟수(이번)가 1000회를 넘으면 순환을 강제로 통과합니다.

    [5] 데이터에 따라 오차 함수의 값과 각 파라미터의 사다리를 구한다


    현재 매개 변수의 출력 값을 구하고 이를 바탕으로 오차와 사다리를 구한다.
    VBA 버전에서 오차와 경사도 계산은 서로 다른 순환에서 진행되지만 Python 버전에서는 간소화하기 위해 총괄되었다.그러나 이런 상황에서 경사도 계산의 마지막은 낭비될 수 있다([7]의 매개 변수가 업데이트되기 전에[6]에서 학습을 끝내기 때문이다).

    [6] ERR보다 큰 오차_POINT가 안 되면 공부를 끝냅니다.


    만약 오차가 설정된 오차보다 작다면 공부를 끝냅니다.

    [7] 매개변수 업데이트


    다음 공식의 구현:.
    $\qquad w_0 := w_0 -\eta(\frac{\partial E}{\partial w_0})$
    $\qquad w_1 := w_1 -\eta(\frac{\partial E}{\partial w_1})$

    [8] 중간 경과 표시


    중간에 있는 매개변수를 표시하려면 메모를 삭제합니다.

    [9] 학습된 매개변수 표시


    학습 결과에 대한 매개변수를 표시합니다.

    [10] 차트 표시


    마지막으로 도표를 표시합니다.
    파란색 점은 데이터 산포도이다.녹색선은 초기값 매개변수선이고 주황색선은 학습된 매개변수선입니다.나는 네가 오렌지색 선이 파란색 점과 잘 어울린다는 것을 발견할 수 있을 것이라고 생각한다.
    (초기 값은 무작위로 설정되어 있기 때문에 같은 도표가 아니다.)

    총결산


    Python도 VBA와 거의 같은 코드로 구현되었다.
    논리만 알면 언어에 얽매이지 않아도 실현할 수 있기 때문에 우선 자신이 잘하는 언어로 실현하는 것도 좋다.

    -- Excel VBA에서 신경 네트워크를 완전히 제거하려고 합니다.


    이전에 쓴 Excel VBA에서 신경 네트워크를 완전히 제거하려는 글은 다음 블로그로 이동했습니다.
    무제한 드라이브

    좋은 웹페이지 즐겨찾기