Julia에서 TensorFlow 2 : 선형 회귀를 시도하십시오

Julia 0.6.2에서 TensorFlow를 사용합니다. 그 2.
그 중 하나는
htps : // 코 m / 코메 ts 코메 _phys / MS / 358bc4 아
여기서는 간단한 선형 회귀를 시도한다.

원래 데이터 생성



우선, 원래 데이터
$$
y = ax+b +{\rm noise}
$$
로 만든다. 여기서, 노이즈를 적절하게 발생시켜, 데이터가 직선으로부터 어긋나게 된다.
이러한 어긋남이 있는 경우에, 원래의 직선을 추측할 수 있을까($a$와 $b$를 추측할 수 있을까), 라고 하는 문제.
원래 직선은

original.jl
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")

로 그릴 수 있다.
이렇게 하면

라는 그래프를 얻을 수 있다.
덧붙여 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.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.jl
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

된다.
여기서, 최소화는 순차적으로 행해지므로, 몇번이나 반복하는 것으로 조금씩 loss가 작아져 가는 것에 주의. 어느 정도까지 횟수를 해내면, loss의 값은 변하지 않게 된다. 이때 지금 가정하고 있는 선형 모델에서 최상의 $a$와 $b$를 얻을 가능성이 높다. ).

마지막으로 $a$ 또는 $b$ 값을 표시하고 그래프를 플롯하려면

test1.jl
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
라는 값이 얻어진다.
그래프는



된다.
나름대로 좋은 느낌에 피팅되고 있다.

좋은 웹페이지 즐겨찾기