ROOT 머신으로 학습해보기~ Multi Layer Perception(ANN)

6384 단어 rootPython

개요


유럽 원자핵 연구기관인 CERN이 개발한 데이터 분석 도구인 ROOT를 활용해 간단한 머신러닝을 한다.
ROOT에서 준비한 자습서의 샘플 코드 참조
MLP(Multi Layer Perception)로 회귀 곡선을 만들어 보세요.
ROOT의 설치 방법과 기본적인 사용 방법은 과거에 쓴 글을 참고하세요.
https://qiita.com/dyamaguc/items/2f723cbc304c4debd82e
https://qiita.com/dyamaguc/items/397121b303e26f8286cf

컨디션

  • Mac Book Air
  • Mac OS X 10.13.6
  • ROOT 6.14/06
  • 샘플 코드 및 실행 결과


    ROOT의 샘플 코드(C++)


    ROOT에서 제공하는 샘플 코드는 다음과 같습니다.
    https://root.cern.ch/root/html608/mlpRegression_8C.html
    ROOT가 이미 설치되어 있는 경우 샘플 코드는<path to root>/tutorials/mlp/mlpRegression.C여기 있습니다.
    이거 옮겨야 돼.root <path to root>/tutorials/mlp/mlpRegression.C터미널에서 명령을 입력한 후 약간의 줄거리가 나타날 수 있다
    잘 예측한 거 알아요.
    C++ 코드지만 컴파일할 필요는 없습니다.

    자체 샘플 코드(Python)


    ROOT에서 제공한 샘플 코드면 재미가 없어요.
    나는 스스로 샘플 코드를 바꾸어 보았다.
    우선, 변수 x, y와 목적 변수 z는 다음과 같은 관계를 가진다고 가정한다.
    def theUnknownFunction(x, y):
        return TMath.Sin( (1.7+x)*(x-0.3) - 2.3*(y+0.7))
    
    (x, y,z)팀 학습 500개, 회귀 곡선 예측 zpred와 정답z비교적 진실하다.
    from ROOT import TNtuple, TRandom, TMultiLayerPerceptron, TMLPAnalyzer, TMath, TCanvas, TGraph, TGraph2D, TTree, gROOT
    from array import array
    import numpy as np
    
    def createData():
        N = 1000
        r = TRandom()
        r.SetSeed(0)
    
        data_tree = TTree("tree", "tree")
        x = np.empty((1), dtype="float32")
        y = np.empty((1), dtype="float32")
        z = np.empty((1), dtype="float32")
        data_tree.Branch("x", x, "x/f")
        data_tree.Branch("y", y, "y/f")
        data_tree.Branch("z", z, "z/f")
    
        # fill data
        for i in range(0, N):
            x[0] = r.Rndm()
            y[0] = r.Rndm()
            z[0] = theUnknownFunction(x, y)
            data_tree.Fill()
    
        del x,y,z
    
        return data_tree
    
    if __name__ == '__main__':
    
        # fill data
        data_tree = createData()
    
        # create ANN
        mlp = TMultiLayerPerceptron("x,y:10:8:z", data_tree,  "Entry$%2","(Entry$%2)==0")
        mlp.Train(150, "graph update=10")
    
        mlpa = TMLPAnalyzer(mlp)
        mlpa.GatherInformations()
        mlpa.CheckNetwork()
        mlpa.DrawDInputs()
    
    TMultiLayerPerceptron의 첫 번째 매개 변수"x,y:10:8:z"는 신경 네트워크의 층을 묘사했다.
    이번에 x와 y는 입력층이고 다음 10과 8은 hiddenlayer의 신경원 수량이며 z는 출력이다.
    이번 설정은 원래의 샘플과 같다.
    ROOT에서는 Draw()에 설정된 신경 네트워크의 구조를 시각화할 수 있다(아래 그림).

    두 번째 파라미터는 데이터다.ROOT의 데이터 구조로서 Ttree를 통해 전달됩니다.
    세 번째 파라미터는 데이터를 학습하는 조건이다.이번에는 홀수로 Entry를 지정합니다.
    네 번째 파라미터는 테스트(검증용) 데이터의 조건이다.Entry를 짝수로 지정하는 경우
    그다음Train(150, "graph update=10")공부.
    첫 번째 매개 변수는 교체 횟수다.
    두 번째 파라미터는 학습의 옵션이다.10 매번 반복해서 도표로 학습 곡선을 그립니다.TMLPAnalyzer에서 배운 MLP의 결과를 간단하게 나타낼 수 있다.
    결과를 시각화하다.
    #draw statistics shows the quality of the ANN's approximation
        canvas = TCanvas("TruthDeviation", "TruthDeviation")
        canvas.Divide(2,2)
        canvas.cd(1)
        mlp.Draw()
    
        canvas.cd(2)
        # draw the difference between the ANN's output for (x,y) and
        # the true value f(x,y), vs. f(x,y), as TProfiles
        mlpa.DrawTruthDeviations()
    
        canvas.cd(3)
        # draw the difference between the ANN's output for (x,y) and
        # the true value f(x,y), vs. x, and vs. y, as TProfiles
        mlpa.DrawTruthDeviationInsOut()
    
        canvas.cd(4)
        graph_truth_y05 = TGraph()
        graph_predi_y05 = TGraph()
        graph_truth_y05.SetMarkerStyle(20)
        graph_predi_y05.SetMarkerStyle(21)
        graph_predi_y05.SetMarkerColor(2)
        for ix in range(0, 15 ):
            v = array( 'd', [0,0])
            v[0] = ix / 10.0
            v[1] = 0.5
            graph_truth_y05.SetPoint( graph_truth_y05.GetN(), v[0], theUnknownFunction(v[0], v[1]))
            graph_predi_y05.SetPoint( graph_predi_y05.GetN(), v[0], mlp.Evaluate(0, v))
        graph_truth_y05.Draw("AP1")
        graph_predi_y05.Draw("P1 SAME")
        graph_truth_y05.SetTitle("y = 0.5;x;z")
    
    
        canvas.SaveAs("output.png")
    
        # To avoid error
        del mlp
    
    실행 결과는 다음 그림과 같습니다.
    만약에 x, y(오른쪽 위),z(왼쪽 아래)를 가로축으로 하고 세로축에서 정해와 예측의 차이를 취하면 좋은 정밀도로 예측할 수 있음을 알 수 있다.
    오른쪽 아래 모서리는 y=0.5의 정답(검정색)과 예상(빨간색)의 드로잉입니다.가로축은 x이고 세로축은 z이다.
    1 이상의 x는 예상 정답과 차이가 있지만 데이터를 학습하는 범위 밖이기 때문에 바로 이런 곳이죠.
    0<=x<=1에서 정답(검은색)과 예측(빨간색)이 잘 맞아떨어졌다.

    총결산


    ROOT의 프레임을 사용해 신경 네트워크의 머신러닝을 간단하게 진행했다.
    튜토리얼 코드를 참고했기 때문에 간단하게 회귀 곡선을 구했다.

    참고 자료


    TMultiLayerPerceptron
    https://root.cern.ch/doc/master/classTMultiLayerPerceptron.html#a9262eee03feb52487900c31f279691c2
    TMLPAnalyzer
    https://root.cern.ch/doc/master/classTMLPAnalyzer.html
    실행 후 출력의 오류를 제거하는 방법
    https://root-forum.cern.ch/t/output-could-be-produced-but-here-is-a-long-list-of-errors/10620/4
    기타
    https://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:root:pyroot

    좋은 웹페이지 즐겨찾기