ROOT 머신으로 학습해보기~ Multi Layer Perception(ANN)
개요
유럽 원자핵 연구기관인 CERN이 개발한 데이터 분석 도구인 ROOT를 활용해 간단한 머신러닝을 한다.
ROOT에서 준비한 자습서의 샘플 코드 참조
MLP(Multi Layer Perception)로 회귀 곡선을 만들어 보세요.
ROOT의 설치 방법과 기본적인 사용 방법은 과거에 쓴 글을 참고하세요.
https://qiita.com/dyamaguc/items/2f723cbc304c4debd82e
https://qiita.com/dyamaguc/items/397121b303e26f8286cf
컨디션
샘플 코드 및 실행 결과
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
Reference
이 문제에 관하여(ROOT 머신으로 학습해보기~ Multi Layer Perception(ANN)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/dyamaguc/items/1219ab768093628d4673
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def theUnknownFunction(x, y):
return TMath.Sin( (1.7+x)*(x-0.3) - 2.3*(y+0.7))
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()
#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
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
Reference
이 문제에 관하여(ROOT 머신으로 학습해보기~ Multi Layer Perception(ANN)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/dyamaguc/items/1219ab768093628d4673
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(ROOT 머신으로 학습해보기~ Multi Layer Perception(ANN)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dyamaguc/items/1219ab768093628d4673텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)