본문 바로가기

텐서플로공부

텐서플로 정리 2탄

반응형

선형회귀

아래코드는 지역별로 인구증가율과 고령인구비율을 그래프로 출력하는 코드이다.

# 4.1 지역별 인구증가율과 고령인구비율 시각화
import matplotlib.pyplot as plt
population_inc = [0.3, -0.78, 1.26, 0.03, 1.11, 15.17, 0.24, -0.24, -0.47, -0.77, -0.37, -0.85, -0.41, -0.27, 0.02, -0.76, 2.66]
population_old = [12.27, 14.44, 11.87, 18.75, 17.52, 9.29, 16.37, 19.78, 19.51, 12.65, 14.74, 10.72, 21.94, 12.83, 15.51, 17.14, 14.42]
plt.plot(population_inc,population_old,'bo')
plt.xlabel('Population Growth Rate (%)')
plt.ylabel('Elderly Population Rate (%)')
plt.show()

 

bo는 파랑색점으로 표현해달라는 의미이다.

xlabel과 ylabel은 라벨의 이름을 지정하는 것이다.

 

그림을 보면 알겠지만 x좌표가 14이상의 숫자는 다른 숫자에 비해서 너무 나도 큰숫자이다.

큰숫자는 학습할때 좋은 결과를 기대하기 어렵게만드므로 제거한다.

 

# 4.2 지역별 인구증가율과 고령인구비율 시각화: 극단치 제거
import matplotlib.pyplot as plt
population_inc = [0.3, -0.78, 1.26, 0.03, 1.11, 15.17, 0.24, -0.24, -0.47, -0.77, -0.37, -0.85, -0.41, -0.27, 0.02, -0.76, 2.66]
population_inc = population_inc[:5] + population_inc[6:]
population_old = [12.27, 14.44, 11.87, 18.75, 17.52, 9.29, 16.37, 19.78, 19.51, 12.65, 14.74, 10.72, 21.94, 12.83, 15.51, 17.14, 14.42]
population_old = population_old[:5] + population_old[6:]
plt.plot(population_inc,population_old,'bo')
plt.xlabel('Population Growth Rate (%)')
plt.ylabel('Elderly Population Rate (%)')
plt.show()

 

다음과같이 필요없는 데이터를 제거하여 출력을 하였다.

 

이제 최소제곱법을 이용하여 이점을 가장잘표현하는 선을그어보겠다.

 

최소제곱은법은 

y=ax+b라는 수식에서 구할수있습니다.

 

조금의 수학이 들어가는데

a는 기울기로 y/x이 기울기인데

여기서 y는 (y-y_bar)모든 합이다.

값의 평균에서 얼마나 떨어져있느냐를 구한다.

이것을 잔차의 제곱의 합이라고 부른다.

x도 마찬가지이다.

x는 (x-x_bar)가 대체된다.

최소제곱법이라고 불리는 이유는

 기존수식이 y*x/x^2이다.

얼핏보면 똑같아 보인다. x값이 약분이 되기때문이다.

하지만 실제로 값을 구할때 제곱을 구하는 것이 인공지능에 있어서 편리하다.

 

그래서 아래의 코드를 이용하여 그래프를 출력한다.

 

# 4.3 최소제곱법으로 회귀선 구하기
import numpy as np
import matplotlib.pyplot as plt
X = [0.3, -0.78, 1.26, 0.03, 1.11, 0.24, -0.24, -0.47, -0.77, -0.37, -0.85, -0.41, -0.27, 0.02, -0.76, 2.66]
Y = [12.27, 14.44, 11.87, 18.75, 17.52, 16.37, 19.78, 19.51, 12.65, 14.74, 10.72, 21.94, 12.83, 15.51, 17.14, 14.42]

# X, Y의 평균을 구합니다.
x_bar = sum(X) / len(X)
y_bar = sum(Y) / len(Y)

# 최소제곱법으로 a, b를 구합니다.
a = sum([(y - y_bar) * (x - x_bar) for y, x in list(zip(Y, X))])
a /= sum([(x - x_bar) ** 2 for x in X])
b = y_bar - a * x_bar
print('a:', a, 'b:', b)

# 그래프를 그리기 위해 회귀선의 x, y 데이터를 구합니다.
line_x = np.arange(min(X), max(X), 0.01)
line_y = a * line_x + b

# 붉은색 실선으로 회귀선을 그립니다.
plt.plot(line_x,line_y,'r-')

plt.plot(X,Y,'bo')
plt.xlabel('Population Growth Rate (%)')
plt.ylabel('Elderly Population Rate (%)')
plt.show()

다음과같이 잔차의 제곱합을 통해 선을 그렸다.

기울기공식은 앞서 언급하였다.

이제 b의 값은데 

y=ax+b라는 값이 있는데 b에 관한식으로바꾸면 y-ax=b라는 수식이 된다.

이것을 텐서플로로 이용하면 다음과같다.

# 4.4 텐서플로를 이용해서 회귀선 구하기
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import random
X = [0.3, -0.78, 1.26, 0.03, 1.11, 0.24, -0.24, -0.47, -0.77, -0.37, -0.85, -0.41, -0.27, 0.02, -0.76, 2.66]
Y = [12.27, 14.44, 11.87, 18.75, 17.52, 16.37, 19.78, 19.51, 12.65, 14.74, 10.72, 21.94, 12.83, 15.51, 17.14, 14.42]

# a와 b를 랜덤한 값으로 초기화합니다.
a = tf.Variable(random.random())
b = tf.Variable(random.random())

# 잔차의 제곱의 평균을 반환하는 함수입니다.
def compute_loss():
    y_pred = a * X + b
    loss = tf.reduce_mean((Y - y_pred) ** 2)
    return loss

optimizer = tf.keras.optimizers.Adam(lr=0.07)
for i in range(1000):
    # 잔차의 제곱의 평균을 최소화(minimize)합니다.
    optimizer.minimize(compute_loss, var_list=[a,b])
   
    if i % 100 == 99:
        print(i, 'a:', a.numpy(), 'b:', b.numpy(), 'loss:', compute_loss().numpy())

line_x = np.arange(min(X), max(X), 0.01)
line_y = a * line_x + b

# 그래프를 그립니다.
plt.plot(line_x,line_y,'r-')
plt.plot(X,Y,'bo')
plt.xlabel('Population Growth Rate (%)')
plt.ylabel('Elderly Population Rate (%)')
plt.show()

 

tf.keras.optimizers.Adam(lr=0.07)

 

다항회귀

# 4.5 텐서플로우를 이용해서 2차 함수 회귀선 구하기
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import random
X = [0.3, -0.78, 1.26, 0.03, 1.11, 0.24, -0.24, -0.47, -0.77, -0.37, -0.85, -0.41, -0.27, 0.02, -0.76, 2.66]
Y = [12.27, 14.44, 11.87, 18.75, 17.52, 16.37, 19.78, 19.51, 12.65, 14.74, 10.72, 21.94, 12.83, 15.51, 17.14, 14.42]

# a, b, c를 랜덤한 값으로 초기화합니다.
a = tf.Variable(random.random())
b = tf.Variable(random.random())
c = tf.Variable(random.random())

# 잔차의 제곱의 평균을 반환하는 함수입니다.
def compute_loss():
    y_pred = a * X*X + b * X + c
    loss = tf.reduce_mean((Y - y_pred) ** 2)
    return loss

optimizer = tf.keras.optimizers.Adam(lr=0.07)
for i in range(1000):
    # 잔차의 제곱의 평균을 최소화(minimize)합니다.
    optimizer.minimize(compute_loss, var_list=[a,b,c])
   
    if i % 100 == 99:
        print(i, 'a:', a.numpy(), 'b:', b.numpy(), 'c:', c.numpy(), 'loss:', compute_loss().numpy())

line_x = np.arange(min(X), max(X), 0.01)
line_y = a * line_x * line_x + b * line_x + c

# 그래프를 그립니다.
plt.plot(line_x,line_y,'r-')
plt.plot(X,Y,'bo')
plt.xlabel('Population Growth Rate (%)')
plt.ylabel('Elderly Population Rate (%)')
plt.show()

코드를 보면 c라는 변수가 늘어났다.

실제식도 ax+b가 아닌 a*x^2+bx+c라는 수식으로 바뀌었다.

그래서 다음과같이 그래프가 출력이 되었다.

 

# 4.7 딥러닝 네트워크를 이용한 회귀
import tensorflow as tf
import numpy as np

X = [0.3, -0.78, 1.26, 0.03, 1.11, 0.24, -0.24, -0.47, -0.77, -0.37, -0.85, -0.41, -0.27, 0.02, -0.76, 2.66]
Y = [12.27, 14.44, 11.87, 18.75, 17.52, 16.37, 19.78, 19.51, 12.65, 14.74, 10.72, 21.94, 12.83, 15.51, 17.14, 14.42]

model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=6, activation='tanh', input_shape=(1,)),
    tf.keras.layers.Dense(units=1)
])

model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss='mse')

model.summary()

이것은 이전에 케라스를 통한 학습이다.

mse는 이전에 사용한 잔차의 제곱합이다.

여기서 모를만한것은 tanh이다.

tanh는 sigmoid와 비슷한 함수이다.

큰값을 넣는 다면 커지고 작은 값을 넣는 다면 작은 값이 출력되는 건같다.

하지만 다른정은 sigmoid의 값의 범위는 0~1까지이지만 tanh는 -1부터 1까지의 길이이다.

위결과는 summary의 결과다 

이전에 설명한적이있어 생략한다.

 

# 4.8 딥러닝 네트워크의 학습
model.fit(X, Y, epochs=10)
# 4.10 딥러닝 네트워크의 회귀선 확인
import matplotlib.pyplot as plt

line_x = np.arange(min(X), max(X), 0.01)
line_y = model.predict(line_x)

plt.plot(line_x,line_y,'r-')
plt.plot(X,Y,'bo')
plt.xlabel('Population Growth Rate (%)')
plt.ylabel('Elderly Population Rate (%)')
plt.show()

위코드를 통해서 가장잘표현한 선을 그어주는 그래프를 출력하낟.

line_x라는 값에 X변수의 가장작은 값부터 큰값까지 0.01씩 더한 배열을 저장한다.

이후 모델예측을 한다.

model.predict를 통해서 X에 맞는 Y값을 찾은 후 선을 긋는다.

 

반응형

'텐서플로공부' 카테고리의 다른 글

텐서플로 정리 4탄  (1) 2024.01.11
텐서플로 정리 3탄  (0) 2024.01.11
텐서플로 정리 3탄  (0) 2024.01.11
텐서플로 정리 1탄  (1) 2024.01.11