ݺߣ

ݺߣShare a Scribd company logo
선형회귀분석
딥러닝을 위한 신경망 기초
nonezerok@gmail.com
산포된 데이터를 정합하는 직선을 찾는 것으로 이해해도 무방합니다.
주어진 데이터를 이용해 기울기와 절편을 구하는 방법입니다.
먼저 행렬연산을 통해 구하는 방법을 설명합니다.
그리고 퍼셉트론에 사용된 것과 같은 방법을 다시 설명하므로 선택적으로 듣기 바랍니다.
설명된 예제에 대한 C 언어 코드를 제공합니다.
Tensorlow 코드는 정합 과정을 시각화하여 보여줍니다.
2
회귀분석; regression
키 몸무게
84 60
95 62
140 64
155 66
119 68
175 70
145 72
197 74
150 76

̅
3

̅
독립변수
종속변수
직선정합; 선형 회귀분석
정합이라고 생각하면 편하다.
4
(, )
(, )
(, )
예제
5
 =  + (, )
(, )
(, )
(̅, )
회귀직선은 표본평균을 지난다
6
 =
∑  − ̅  − 
∑  − ̅ 

 =  − ̅
(0,1)
(1,3)
(2,2)
̅,  = 0 + 1 + 2
3 , 1 + 3 + 2
3 = 1,2
1알려진 계산공식을 이용해서 풀기
covariance, variance
 =
 
 

=
 
 
 =
1
 − 
 −
− 
 
 
×
  
  
=
 +   +   + 
 +   +   + 

 =
1 0
0 1
7
2
 +  = 
 +  = 
 +  = 
0 1
1 1
2 1


=
1
3
2
 = 

 

  = 
 


 = 
 


 1
 1
 1


=




=
0 1 2
1 1 1
8
 = 
 

 = ?


=  =
1
2
3
2
pseudo inverse; least square method
error3
error2
error1
 =  + (, )
(, )
(, )
 =
1
2
  −  


9
 =
1
2
 +  − 

+  +  − 

+  +  − 

(̅, )
세 번째 방법
주어진 데이터의 평균을
지나는 직선과의 y(종속변수) 값
차이(error)가
전체적으로 최소가 되도록 하는
직선을 구한다.
즉, a, b를 구한다.
차이에 관한 식
3
10
(, ) =
1
2
  −  


 =  + 
이 값을 최소화하는 a, b를 구하자
11
• 를 임의의 값으로 설정
• 를 계속 바꾸어 본다
 ←  + ∆
해결방법
12
• 무작위로 바꾸면 정답을 언제 찾을지 장담 할 수 없음
• 그래서, 다음과 같이 계산
 ←  + ∆
∆ = 0. 1 ×  −  × 
 ←  + ∆
∆ = 0. 1 ×  −  × 1
다음과 같이 갱신한다
13
[code in C]#include <stdio.h>
#include <conio.h>
void main()
{
double a, b;
double X[] = { 0, 1, 2 };
double Y[] = { 1, 3, 2 };
double lr = 0.1;
a = 0.1;
b = 0.0;
double delta_a;
double delta_b;
int n = 0;
double previous_error = 999.0; // DBL_MAX;
while (1)
{
delta_a = 0;
delta_b = 0;
for (int i = 0; i < 3; i++)
{
double y;
y = a * X[i] + b;
delta_a += (Y[i] - y)*X[i];
delta_b += (Y[i] - y);
}
a = a + lr * delta_a;
b = b + lr * delta_b;
처음 임의의
값으로 설정
마법의
작은 수
14
double error;
error = 0.0;
for (int i = 0; i < 3; i++)
{
double d;
d = (Y[i] - a*X[i] - b)*(Y[i] - a*X[i] - b);
error += d;
}
error = error / 3.0;
n++;
printf("%d t %1.6f t %1.2f t %1.2f n", n, error, a, b);
if ((previous_error - error) < 0.000001) break;
previous_error = error;
} // while
}
a=.5 b=1.5
종료 조건
• 아래 식에서 출발
15
(, ) =
1
2
  −  


동작하는 이유
• 는 에 관한 2차 식
16
()
E 그래프의 모양
17
()



∆ =음수 for 
∆ =양수 for 
갱신 방향
18
+-()



기울기; gradient
19
+-()

기울기-∆ =


갱신방향 판정
20
기울기×아주 작은값-∆ =
+-()



갱신 크기
21
+-()



∆ = −


경사하강법; gradient descent method
22


=


1
2
  −  

=
1
2



 −  

=
1
2
 2  − 


 − 

=   − 


 −  − 

=   −  −

 ←  + ∆
∆ = −


=    −  



=   −  (−1)

 ←  + ∆
∆ = −


=    − 

23
1





  
  = 

Input layer output layer
선형함수
24



잔차
회귀
참고로 회귀는 평균으로 돌아간다는 것을 의미한다.
25
import numpy as np
num_points = 1000
vectors_set = []
for i in range(num_points):
x1= np.random.normal(0.0, 0.55)
y1= x1 * 0.1 + 0.3 + np.random.normal(0.0, 0.03)
vectors_set.append([x1, y1])
x_data = [v[0] for v in vectors_set]
y_data = [v[1] for v in vectors_set]
import matplotlib.pyplot as plt
#Graphic display
plt.plot(x_data, y_data, 'ro')
plt.legend()
plt.show()
[code in Python]
http://www.jorditorres.org/TensorFlow/
26
import tensorflow as tf
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
27
for step in range(8):
sess.run(train)
print(step, sess.run(W), sess.run(b))
print(step, sess.run(loss))
#Graphic display
plt.plot(x_data, y_data, 'ro')
plt.plot(x_data, sess.run(W) * x_data + sess.run(b))
plt.xlabel('x')
plt.xlim(-2,2)
plt.ylim(0.1,0.6)
plt.ylabel('y')
plt.legend()
plt.show()

More Related Content

[신경망기초] 선형회귀분석

  • 1. 선형회귀분석 딥러닝을 위한 신경망 기초 nonezerok@gmail.com 산포된 데이터를 정합하는 직선을 찾는 것으로 이해해도 무방합니다. 주어진 데이터를 이용해 기울기와 절편을 구하는 방법입니다. 먼저 행렬연산을 통해 구하는 방법을 설명합니다. 그리고 퍼셉트론에 사용된 것과 같은 방법을 다시 설명하므로 선택적으로 듣기 바랍니다. 설명된 예제에 대한 C 언어 코드를 제공합니다. Tensorlow 코드는 정합 과정을 시각화하여 보여줍니다.
  • 2. 2 회귀분석; regression 키 몸무게 84 60 95 62 140 64 155 66 119 68 175 70 145 72 197 74 150 76  ̅
  • 5. 5  =  + (, ) (, ) (, ) (̅, ) 회귀직선은 표본평균을 지난다
  • 6. 6  = ∑  − ̅  −  ∑  − ̅    =  − ̅ (0,1) (1,3) (2,2) ̅,  = 0 + 1 + 2 3 , 1 + 3 + 2 3 = 1,2 1알려진 계산공식을 이용해서 풀기 covariance, variance
  • 7.  =      =      = 1  −   − −      ×       =  +   +   +   +   +   +    = 1 0 0 1 7 2
  • 8.  +  =   +  =   +  =  0 1 1 1 2 1   = 1 3 2  =        =       =       1  1  1   =     = 0 1 2 1 1 1 8  =      = ?   =  = 1 2 3 2 pseudo inverse; least square method
  • 9. error3 error2 error1  =  + (, ) (, ) (, )  = 1 2   −     9  = 1 2  +  −   +  +  −   +  +  −   (̅, ) 세 번째 방법 주어진 데이터의 평균을 지나는 직선과의 y(종속변수) 값 차이(error)가 전체적으로 최소가 되도록 하는 직선을 구한다. 즉, a, b를 구한다. 차이에 관한 식 3
  • 10. 10 (, ) = 1 2   −      =  +  이 값을 최소화하는 a, b를 구하자
  • 11. 11 • 를 임의의 값으로 설정 • 를 계속 바꾸어 본다  ←  + ∆ 해결방법
  • 12. 12 • 무작위로 바꾸면 정답을 언제 찾을지 장담 할 수 없음 • 그래서, 다음과 같이 계산  ←  + ∆ ∆ = 0. 1 ×  −  ×   ←  + ∆ ∆ = 0. 1 ×  −  × 1 다음과 같이 갱신한다
  • 13. 13 [code in C]#include <stdio.h> #include <conio.h> void main() { double a, b; double X[] = { 0, 1, 2 }; double Y[] = { 1, 3, 2 }; double lr = 0.1; a = 0.1; b = 0.0; double delta_a; double delta_b; int n = 0; double previous_error = 999.0; // DBL_MAX; while (1) { delta_a = 0; delta_b = 0; for (int i = 0; i < 3; i++) { double y; y = a * X[i] + b; delta_a += (Y[i] - y)*X[i]; delta_b += (Y[i] - y); } a = a + lr * delta_a; b = b + lr * delta_b; 처음 임의의 값으로 설정 마법의 작은 수
  • 14. 14 double error; error = 0.0; for (int i = 0; i < 3; i++) { double d; d = (Y[i] - a*X[i] - b)*(Y[i] - a*X[i] - b); error += d; } error = error / 3.0; n++; printf("%d t %1.6f t %1.2f t %1.2f n", n, error, a, b); if ((previous_error - error) < 0.000001) break; previous_error = error; } // while } a=.5 b=1.5 종료 조건
  • 15. • 아래 식에서 출발 15 (, ) = 1 2   −     동작하는 이유
  • 16. • 는 에 관한 2차 식 16 () E 그래프의 모양
  • 17. 17 ()    ∆ =음수 for  ∆ =양수 for  갱신 방향
  • 22. 22   =   1 2   −    = 1 2     −    = 1 2  2  −     −   =   −     −  −   =   −  −   ←  + ∆ ∆ = −   =    −      =   −  (−1)   ←  + ∆ ∆ = −   =    −  
  • 23. 23 1           =   Input layer output layer 선형함수
  • 25. 25 import numpy as np num_points = 1000 vectors_set = [] for i in range(num_points): x1= np.random.normal(0.0, 0.55) y1= x1 * 0.1 + 0.3 + np.random.normal(0.0, 0.03) vectors_set.append([x1, y1]) x_data = [v[0] for v in vectors_set] y_data = [v[1] for v in vectors_set] import matplotlib.pyplot as plt #Graphic display plt.plot(x_data, y_data, 'ro') plt.legend() plt.show() [code in Python] http://www.jorditorres.org/TensorFlow/
  • 26. 26 import tensorflow as tf W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) b = tf.Variable(tf.zeros([1])) y = W * x_data + b loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss) init = tf.global_variables_initializer() sess = tf.Session() sess.run(init)
  • 27. 27 for step in range(8): sess.run(train) print(step, sess.run(W), sess.run(b)) print(step, sess.run(loss)) #Graphic display plt.plot(x_data, y_data, 'ro') plt.plot(x_data, sess.run(W) * x_data + sess.run(b)) plt.xlabel('x') plt.xlim(-2,2) plt.ylim(0.1,0.6) plt.ylabel('y') plt.legend() plt.show()