Julia에서 TensorFlow 2 : 선형 회귀를 시도하십시오
9902 단어 TensorFlowJulia기계 학습 입문기계 학습
그 중 하나는
htps : // 코 m / 코메 ts 코메 _phys / MS / 358bc4 아
여기서는 간단한 선형 회귀를 시도한다.
원래 데이터 생성
우선, 원래 데이터
$$
y = ax+b +{\rm noise}
$$
로 만든다. 여기서, 노이즈를 적절하게 발생시켜, 데이터가 직선으로부터 어긋나게 된다.
이러한 어긋남이 있는 경우에, 원래의 직선을 추측할 수 있을까($a$와 $b$를 추측할 수 있을까), 라고 하는 문제.
원래 직선은
original.jlusing Plots
ENV["PLOTS_TEST"] = "true"
gr()
n = 10
x0 = linspace(-1,1,n)
noise = 0.5*rand(linspace(-1,1),n)
a0 = 3.0
b0 = 1.0
y0 = a0.*x0 + b0 + noise
plot(x0,y0,marker=:circle,label="Data")
savefig("data.png")
로 그릴 수 있다.
이렇게 하면
라는 그래프를 얻을 수 있다.
덧붙여 Plots의 백엔드의 gr이 6배 큰 그림을 만들어 버리는 문제가 있으므로, ENV["PLOTS_TEST"] = "true"
를 사용하고 있다. 자세한 내용은
h tp : / / nb ぃ 에우 r. Jupy r. rg/기 st/겐쿠로키/3d6dbf52 아3에 52에 b7c664bc88632c81d3
참조.
그래프 디자인
다음으로 그 1과 같이 그래프를 설계해 보자.
우선, $x_i$를 인풋 데이터, $y_i$를 아웃풋 데이터로서, 이 $(x_i, y_i)$의 쌍이 복수 있는 상황을 생각한다(위의 코드에서는 10개).
그리고,
데이터가
$$
y_i=a x_i+b
$$
라는 직선을 따르고 있다고 가정한다.
이 가정하에 가장 가장 좋은 $a$와 $b$를 구하는 것이 선형 회귀이다.
그리고 제곱 오차 :
$$
{\rm loss} =\sum_i (y - y_i)^2
$$
가 가장 작아지는 것 같은 $a$와 $b$가, 제일 가장 좋다고 한다.
TensorFlow를 사용하면 기능을 최소화할 수 있습니다.
무엇을 최소화하는지, 어떻게 최소화하는지에 대한 정보를 설정해 두면 된다.
그 1의 소인의 예로 비유하면, 소인 B에 「최소화하라」라고 하면 나머지는 좋게 해 주는 것이다.
우선, 소인 A에의 지령(그래프 작성)은
test1.jlusing TensorFlow
x = placeholder(Float64)
yout = placeholder(Float64)
a = Variable(2.0)
b = Variable(0.0)
y = a.*x+b
diff = y-yout
loss = nn.l2_loss(diff)
optimizer = train.AdamOptimizer()
minimize = train.minimize(optimizer, loss)
된다. 여기서는 minimize를 소인 B로 지정하면 loss를 최소화해 준다.
그래프 실행
다음으로 실제 계산을 난쟁이 B에게 주는 코드는
test1.jlsess = Session()
run(sess, global_variables_initializer())
nt = 10000
for i in 1:nt
run(sess, minimize, Dict(x=>x0,yout=>y0))
if i%1000==0
println(i,"\t",run(sess, loss, Dict(x=>x0,yout=>y0)))
end
end
된다.
출력 결과는
1000 0.5525778742090897
2000 0.2062854331360348
3000 0.20391311222929595
4000 0.20391251120152726
5000 0.20391251120114107
6000 0.203912511201141
7000 0.2039125112011411
8000 0.20391251120114104
9000 0.20391251120114096
10000 0.20391251120114093
된다.
여기서, 최소화는 순차적으로 행해지므로, 몇번이나 반복하는 것으로 조금씩 loss가 작아져 가는 것에 주의. 어느 정도까지 횟수를 해내면, loss의 값은 변하지 않게 된다. 이때 지금 가정하고 있는 선형 모델에서 최상의 $a$와 $b$를 얻을 가능성이 높다. ).
마지막으로 $a$ 또는 $b$ 값을 표시하고 그래프를 플롯하려면
test1.jlae = run(sess, a)
be = run(sess, b)
ye = run(sess, y, Dict(x=>x0,yout=>y0))
println("a = ", ae," b = ", be)
close(sess)
plot(x0,[y0,ye],label=["Data","Estimation"],marker=:circle)
하면 된다. 그리고,
a = 3.0662337662337653 b = 0.8816326530612243
라는 값이 얻어진다.
그래프는
된다.
나름대로 좋은 느낌에 피팅되고 있다.
Reference
이 문제에 관하여(Julia에서 TensorFlow 2 : 선형 회귀를 시도하십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cometscome_phys/items/244cfed8ab309156735c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using Plots
ENV["PLOTS_TEST"] = "true"
gr()
n = 10
x0 = linspace(-1,1,n)
noise = 0.5*rand(linspace(-1,1),n)
a0 = 3.0
b0 = 1.0
y0 = a0.*x0 + b0 + noise
plot(x0,y0,marker=:circle,label="Data")
savefig("data.png")
다음으로 그 1과 같이 그래프를 설계해 보자.
우선, $x_i$를 인풋 데이터, $y_i$를 아웃풋 데이터로서, 이 $(x_i, y_i)$의 쌍이 복수 있는 상황을 생각한다(위의 코드에서는 10개).
그리고,
데이터가
$$
y_i=a x_i+b
$$
라는 직선을 따르고 있다고 가정한다.
이 가정하에 가장 가장 좋은 $a$와 $b$를 구하는 것이 선형 회귀이다.
그리고 제곱 오차 :
$$
{\rm loss} =\sum_i (y - y_i)^2
$$
가 가장 작아지는 것 같은 $a$와 $b$가, 제일 가장 좋다고 한다.
TensorFlow를 사용하면 기능을 최소화할 수 있습니다.
무엇을 최소화하는지, 어떻게 최소화하는지에 대한 정보를 설정해 두면 된다.
그 1의 소인의 예로 비유하면, 소인 B에 「최소화하라」라고 하면 나머지는 좋게 해 주는 것이다.
우선, 소인 A에의 지령(그래프 작성)은
test1.jl
using TensorFlow
x = placeholder(Float64)
yout = placeholder(Float64)
a = Variable(2.0)
b = Variable(0.0)
y = a.*x+b
diff = y-yout
loss = nn.l2_loss(diff)
optimizer = train.AdamOptimizer()
minimize = train.minimize(optimizer, loss)
된다. 여기서는 minimize를 소인 B로 지정하면 loss를 최소화해 준다.
그래프 실행
다음으로 실제 계산을 난쟁이 B에게 주는 코드는
test1.jlsess = Session()
run(sess, global_variables_initializer())
nt = 10000
for i in 1:nt
run(sess, minimize, Dict(x=>x0,yout=>y0))
if i%1000==0
println(i,"\t",run(sess, loss, Dict(x=>x0,yout=>y0)))
end
end
된다.
출력 결과는
1000 0.5525778742090897
2000 0.2062854331360348
3000 0.20391311222929595
4000 0.20391251120152726
5000 0.20391251120114107
6000 0.203912511201141
7000 0.2039125112011411
8000 0.20391251120114104
9000 0.20391251120114096
10000 0.20391251120114093
된다.
여기서, 최소화는 순차적으로 행해지므로, 몇번이나 반복하는 것으로 조금씩 loss가 작아져 가는 것에 주의. 어느 정도까지 횟수를 해내면, loss의 값은 변하지 않게 된다. 이때 지금 가정하고 있는 선형 모델에서 최상의 $a$와 $b$를 얻을 가능성이 높다. ).
마지막으로 $a$ 또는 $b$ 값을 표시하고 그래프를 플롯하려면
test1.jlae = run(sess, a)
be = run(sess, b)
ye = run(sess, y, Dict(x=>x0,yout=>y0))
println("a = ", ae," b = ", be)
close(sess)
plot(x0,[y0,ye],label=["Data","Estimation"],marker=:circle)
하면 된다. 그리고,
a = 3.0662337662337653 b = 0.8816326530612243
라는 값이 얻어진다.
그래프는
된다.
나름대로 좋은 느낌에 피팅되고 있다.
Reference
이 문제에 관하여(Julia에서 TensorFlow 2 : 선형 회귀를 시도하십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cometscome_phys/items/244cfed8ab309156735c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
sess = Session()
run(sess, global_variables_initializer())
nt = 10000
for i in 1:nt
run(sess, minimize, Dict(x=>x0,yout=>y0))
if i%1000==0
println(i,"\t",run(sess, loss, Dict(x=>x0,yout=>y0)))
end
end
1000 0.5525778742090897
2000 0.2062854331360348
3000 0.20391311222929595
4000 0.20391251120152726
5000 0.20391251120114107
6000 0.203912511201141
7000 0.2039125112011411
8000 0.20391251120114104
9000 0.20391251120114096
10000 0.20391251120114093
ae = run(sess, a)
be = run(sess, b)
ye = run(sess, y, Dict(x=>x0,yout=>y0))
println("a = ", ae," b = ", be)
close(sess)
plot(x0,[y0,ye],label=["Data","Estimation"],marker=:circle)
a = 3.0662337662337653 b = 0.8816326530612243
Reference
이 문제에 관하여(Julia에서 TensorFlow 2 : 선형 회귀를 시도하십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/cometscome_phys/items/244cfed8ab309156735c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)