# Tensorflow : Multiple variables linear regression
X1*W1 + X2*W2 + X3*W3로 작성된 식이 있다고 하자.
이를 다음과 같이 '간단하고 멋져보이는 행렬의 식'으로 바꾸어보자.
x1, x2, x3 각각의 matrix에 대하여 w1, w2, w3 를 대입하였을 때의 hypothesis를 구한다.
x1_data = [73., 80., 75.], x2_data = [93., 88., 93.], ... xn_data = [73., 66., 70.] 일 때,
우리는 각 x_data들에 대한 placeholder를 다음과 같이 적을 것이다.
각 i들에 대하여, xi= tf.placeholder(tf.float32)
하지만 이를 간단하게 정리해서 적으면 다음과 같다.
x_data = [[73., 80., 75.], [93., 88., 93.] ..... [73., 66., 70.]]
그렇다면 y 값들도 이와 같이 정리할 수 있지 않을까? 물론 정리하지 않아도 좋지만 통일성을 표현하자면 다음과 같을 것이다.
y_data = [[152.], [185.], .... , [142.]]
이렇게 '간소화'하여 적게 되는 경우 placeholder는 어떻게 만들어줘야 할까?
기존에 tf.placeholder(데이터 타입)으로만 적었던 방법과는 차별되어야 할 것이다.
다음과 같이 적는다.
x = tf.placeholder(tf.float32, shape=[None, 3])
뒤에 shape라는 표현이 추가되었는데, matrix의 형태를 지정하는 구문이다.
shape[submatrix의 갯수, submatrix 내부의 원소 갯수]
None은 default의 의미를 갖는데, 얼마나 많은 x matrix가 들어올 지 예측하기 어렵기 때문에 '무한정 값'으로 들어오는 만큼 확장시키겠다는 의미이다.
만약 위에서 표현한 x_data에서 서브행렬의 갯수가 10개이고, 각 서브행렬마다 4개의 원소를 갖는다면, shape[10, 4]가 될 것이다.
하지만 서브 행렬의 갯수는 우리가 정확히 예측하기 어려울 뿐더러, 그것을 일일이 센다는 것 또한 매우 힘든 일일 것이다. (하지만 서브 행렬 마다 갖고 있는 원소의 갯수들은 육안으로도 구별하기 쉬울 것이다. 그리고 실제로도 이 갯수는 '꼭 알아야 하는' 중요한 정보이므로 모르는 것이 이상할 것이다)
그렇다면 y는? 같은 방법으로 생각하면 된다.
서브 행렬 갯수가 어찌되었든 y의 서브 행렬 내부의 갯수는 1이므로 다음과 같이 작성한다.
y = tf.placeholder(tf.float32, shape=[None, 1])
결국 x_data가 하나로 간소화 됨에 따라, 이 x_data와 결합되는 W의 값 또한 변화되어야한다.
기존에 x1_data, x2_data 등으로 나누어 적었던 방법에서 w 변수는 다음과 같이 작성되었다.
w1 = tf.Variable(tf.random_normal([1]), name = 'weight1')
w2 = tf.Variable(tf.random_normal([1]), name = 'weight2')
.....
이를 간소화하여 적으면 다음과 같다.
w = tf.Variable(tf.random_normal([3,1]), name='weight')
이는 w가 각 x값과 곱해지는 '독립적인 값' 형태에서 '[3,1] 형식의 행렬'이 되었기 때문에, 행렬 형태를 정확하게 적어준 것이다.
(말을 좀 어렵게 적은 것 같은데, 위에 작성된 식 그대로 w를 만들어 준 것이다)
이를 다음과 같이 '간단하고 멋져보이는 행렬의 식'으로 바꾸어보자.
x1, x2, x3 각각의 matrix에 대하여 w1, w2, w3 를 대입하였을 때의 hypothesis를 구한다.
x1_data = [73., 80., 75.], x2_data = [93., 88., 93.], ... xn_data = [73., 66., 70.] 일 때,
우리는 각 x_data들에 대한 placeholder를 다음과 같이 적을 것이다.
각 i들에 대하여, xi= tf.placeholder(tf.float32)
하지만 이를 간단하게 정리해서 적으면 다음과 같다.
x_data = [[73., 80., 75.], [93., 88., 93.] ..... [73., 66., 70.]]
그렇다면 y 값들도 이와 같이 정리할 수 있지 않을까? 물론 정리하지 않아도 좋지만 통일성을 표현하자면 다음과 같을 것이다.
y_data = [[152.], [185.], .... , [142.]]
이렇게 '간소화'하여 적게 되는 경우 placeholder는 어떻게 만들어줘야 할까?
기존에 tf.placeholder(데이터 타입)으로만 적었던 방법과는 차별되어야 할 것이다.
다음과 같이 적는다.
x = tf.placeholder(tf.float32, shape=[None, 3])
뒤에 shape라는 표현이 추가되었는데, matrix의 형태를 지정하는 구문이다.
shape[submatrix의 갯수, submatrix 내부의 원소 갯수]
None은 default의 의미를 갖는데, 얼마나 많은 x matrix가 들어올 지 예측하기 어렵기 때문에 '무한정 값'으로 들어오는 만큼 확장시키겠다는 의미이다.
만약 위에서 표현한 x_data에서 서브행렬의 갯수가 10개이고, 각 서브행렬마다 4개의 원소를 갖는다면, shape[10, 4]가 될 것이다.
하지만 서브 행렬의 갯수는 우리가 정확히 예측하기 어려울 뿐더러, 그것을 일일이 센다는 것 또한 매우 힘든 일일 것이다. (하지만 서브 행렬 마다 갖고 있는 원소의 갯수들은 육안으로도 구별하기 쉬울 것이다. 그리고 실제로도 이 갯수는 '꼭 알아야 하는' 중요한 정보이므로 모르는 것이 이상할 것이다)
그렇다면 y는? 같은 방법으로 생각하면 된다.
서브 행렬 갯수가 어찌되었든 y의 서브 행렬 내부의 갯수는 1이므로 다음과 같이 작성한다.
y = tf.placeholder(tf.float32, shape=[None, 1])
결국 x_data가 하나로 간소화 됨에 따라, 이 x_data와 결합되는 W의 값 또한 변화되어야한다.
기존에 x1_data, x2_data 등으로 나누어 적었던 방법에서 w 변수는 다음과 같이 작성되었다.
w1 = tf.Variable(tf.random_normal([1]), name = 'weight1')
w2 = tf.Variable(tf.random_normal([1]), name = 'weight2')
.....
이를 간소화하여 적으면 다음과 같다.
w = tf.Variable(tf.random_normal([3,1]), name='weight')
이는 w가 각 x값과 곱해지는 '독립적인 값' 형태에서 '[3,1] 형식의 행렬'이 되었기 때문에, 행렬 형태를 정확하게 적어준 것이다.
(말을 좀 어렵게 적은 것 같은데, 위에 작성된 식 그대로 w를 만들어 준 것이다)
댓글
댓글 쓰기