데이터 사이언스 스쿨에서 공부한 내용입니다.
import numpy as np
np.sign(-0.0001), np.sign(0), np.sign(0.0001)
(-1.0, 0, 1.0)
def heaviside_step(x):
if isinstance(x, np.ndarray):
return np.where(x >= 0, 1, 0)
else:
return 1.0 if x >= 0 else 0.0
print(heaviside_step(-0.0001), heaviside_step(0), heaviside_step(0.0001))
print(heaviside_step(np.array([1,0,0,-1]).reshape(2,2)))
(0.0, 1.0, 1.0)
지시함수는 특정한 데이터만 선택하여 갯수를 세는데 사용된다.
함수의 형상을 시각적으로 파악하기 위해 그래프(graph) 또는 플롯(plot) 를 사용하기도 한다. 맷플롯립으로 다음과 같은 함수의 그래프를 그려보자.
def f(x):
return x**3 - 3 * x**2 + x
우선 부터 까지 0.5 간격으로 9개의 점을 찍는다
x = np.linspace(-1, 3, 9)
x
array([-1. , -0.5, 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. ])
그리고 이 위치에 대해 값을 구한다.
y = f(x)
y
array([-5. , -1.375, 0. , -0.125, -1. , -1.875, -2. , -0.625, 3. ])
이를 표로 나타내면 다음과 같다.
-1 | -0.5 | 0 | 0.5 | 1 | 1.5 | 2 | 2.5 | 3 | |
---|---|---|---|---|---|---|---|---|---|
-5 | -1.375 | 0 | -0.125 | -1 | -1.875 | -2 | -0.625 | 3 |
맷플롯립이 그리는 그래프는 이 표에 나타난 쌍을 직선으로 연결한 그림이다.
plt.plot(x, y, 'ro-')
plt.xlim(-2, 4)
plt.title("함수 $f(x) = x^3 - 3x^2 + x$의 그래프")
plt.xlabel("x")
plt.ylabel("y")
plt.xticks(np.arange(-1, 4))
plt.yticks(np.arange(-5, 4))
plt.show()
이 , 벡터의 구간을 더 조밀하게 만들면 그래프는 곡선으로 보이게 된다. 다음 그래프는 곡선으로 보이지만 실제로는 약 400개의 직선이 연결된 것이다.
x = np.linspace(-1, 3, 400)
y = f(x)
plt.plot(x, y)
plt.xlim(-2, 4)
plt.title("함수 $f(x) = x^3 - 3x^2 + x$의 그래프")
plt.xlabel("x")
plt.ylabel("y")
plt.xticks(np.arange(-1, 4))
plt.yticks(np.arange(-5, 4))
plt.show()
맷플롯립으로 부호함수와 단위계단함수의 라인플롯을 그려라.
✏️
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 3, 900)
def heaviside_step(x):
if isinstance(x, np.ndarray):
return np.where(x >= 0, 1, 0)
else:
return 1.0 if x >= 0 else 0.0
#############################################
# y1 =np.sign(x)
# plt.plot(x, y1, 'ro-')
# plt.xlim(-2, 4)
# plt.title("a graph of sign fcn.")
# plt.xlabel("x")
# plt.ylabel("y1")
# plt.xticks(np.arange(-1, 4))
# plt.yticks(np.arange(-5, 4))
# plt.show()
#############################################
# y2 = heaviside_step(x)
# plt.plot(x, y2, 'bo-')
# plt.xlim(-2, 4)
# plt.title("a graph of heaviside_step fcn.")
# plt.xlabel("x")
# plt.ylabel("y2")
# plt.xticks(np.arange(-1, 4))
# plt.yticks(np.arange(-5, 4))
# plt.show()
#############################################
인공신경망에서는 이 함수를 ReLU(Rectified Linear Unit) 라고 부른다.
xx = np.linspace(-10, 10, 100)
plt.plot(xx, np.maximum(xx, 0))
plt.title("max(x,0) 또는 ReLU")
plt.xlabel("$x$")
plt.ylabel("$ReLU(x)$")
plt.show()
로지스틱(logistic) 함수는 지수함수를 변형한 함수로 회귀 분석이나 인공신경망에서 자주 사용된다. 로지스틱함수는 원래 시그모이드(sigmoid) 함수라는 종류의 하나다.
def logistic(x):
return 1 / (1 + np.exp(-x))
xx = np.linspace(-10, 10, 100)
plt.plot(xx, logistic(xx))
plt.title("로지스틱함수")
plt.xlabel("$x$")
plt.ylabel("$\sigma(x)$")
plt.show()
의 값은 약 0.69, 의 값은 약 1.10 이다. 이 때 의 값을 구하라.
✏️
0.69 * 2 + 1.10 = 2.48
로지스틱함수의 역함수를 구하라.
✏️
def softplus(x):
return np.log(1 + np.exp(x))
xx = np.linspace(-10, 10, 100)
plt.plot(xx, softplus(xx))
plt.title("소프트플러스함수")
plt.xlabel("$x$")
plt.ylabel("Softplus($x$)")
plt.show()
소프트맥스(softmax) 함수는 다차원 벡터를 입력받아 다차원 벡터를 출력한다. 다음은 3차원 소프트맥스 함수이다.
출력 벡터는 다음과 같은 특성을 갖는다.
소프트맥스 함수의 출력은 확률(probability)처럼 보이는 특성이 있다.
때문에 인공신경망의 마지막 단에서 출력을 조건부 확률로 변형하는 데 사용된다.
def softmax(x, w): # x는 1차원 배열, w는 가중치 벡터
e = np.exp(w * x)
return np.exp(w * x) / e.sum()
x = [2.0, 1.0, 0.5]
y = softmax(x, np.ones(3))
y
array([0.62853172, 0.2312239 , 0.14024438])
np.sum(y)
1.0
가중치가 커지면 최대값과 최소값의 차이가 더 벌어진다.
softmax(x, 4 * np.ones(3))
array([0.97962921, 0.01794253, 0.00242826])