나름 열심히 풀어서 올려봅니다.
문제 PLT12-0005
다음 그림과 같이 -10과 10 사이에서 활성화 함수(Step함수) 를 만들어보자.
import numpy as np
import matplotlib.pyplot as plt
relu = lambda x: np.maximum(0, np.asarray(1%(x+1), dtype=int))
x = np.linspace(-10.0, 10.0, 100)
y = relu(x)
plt.plot(x, y)
plt.grid()
plt.show()
relu = lambda x: np.maximum(0, (1%x))
nparray일때 조건문을 쓰지 못해서
np.maximum을 사용해서 0과 각 요소들을 비교해 음수 부분을 해결했고
처음에는 양수 부분은 1%x를 사용해
x가 1보다 큰 경우 무조건 1이 나오도록 나머지 연산자를 사용했습니다.
그러나 0<x<1인 경우
1 % (0.2) 가 0.1999999996과 같은 결과값이 나와
아래와 같은 결과를 얻게 되었습니다.
원하지 않은 결과값들을 본 결과, 모두 1이하의 요소들이기에 전부 Integer로 바꾸자라는 생각을 했습니다.
np.asarray라는 nparray의 각 요소를 integer로 바꿔주는 np.asarray 함수를 사용했습니다.
relu = lambda x: np.maximum(0, np.asarray(1%(x), dtype=int))
그 결과는 아래와 같습니다.
모두 내림을 하였기에
1보다 작은 수들은 다 0으로 만들어졌습니다.
따라서 x축으로 -1만큼 대칭이동하면 결과가 만들어지게 됩니다.
relu = lambda x: np.maximum(0, np.asarray(1%(x+1), dtype=int))
************
지금 보니 나머지 기호를 사용하는 것보다 np.minmum함수를 사용하는 것이 간편해 보여 수정했습니다.
import numpy as np
import matplotlib.pyplot as plt
relu = lambda x: np.maximum(0, np.asarray(np.minimum(1, x+1), dtype=int))
x = np.linspace(-10.0, 10.0, 100)
y = relu(x)
plt.plot(x, y)
plt.grid()
plt.show()
***
처음에는 시그모이드 함수에 가우스 기호를 붙이고 +1 을 하면 될 것이라고 생각했는데,
아쉽게도 numpy에는 가우스 기호를 제공하는 모듈이 없었습니다.
***
numpy 모듈에는 조건문을 쓸 수 없지만
비슷하게 np.where라는 함수를 사용할 수 있습니다.
import numpy as np
import matplotlib.pyplot as plt
step = lambda x: np.where(x >= 0, 1, 0)
x = np.linspace(-10.0, 10.0, 100)
y = step(x)
plt.plot(x, y)
plt.grid()
plt.show()
생각보다 너무 쉽게 풀리는 문제였지만 열심히 풀었기에 한 번 올려봅니다...