Calculus_함수

JKH·약 16시간 전
0

미적분

목록 보기
1/3

데이터 사이언스 스쿨에서 공부한 내용입니다.

부호 함수

sgn(x)={1,x>0,0,x=0,1,x<0(4.1.6)\text{sgn}(x) = \begin{cases} 1, & x > 0, \\ 0, & x = 0, \\ -1, & x < 0 \end{cases} \tag{4.1.6}
import numpy as np
np.sign(-0.0001), np.sign(0), np.sign(0.0001)
(-1.0, 0, 1.0)

단위계단 함수

H(x)={1,x0,0,x<0(4.1.7)H(x) = \begin{cases} 1, & x \ge 0, \\ 0, & x < 0 \end{cases} \tag{4.1.7}
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)

지시 함수 (indicator function)

I(x=i)={1 if x=i0 if xi(4.1.9)\mathbb{I}(x=i) = \begin{cases} 1 & \text{ if } x = i \\ 0 & \text{ if } x \neq i \\ \end{cases} \tag{4.1.9}

지시함수는 특정한 데이터만 선택하여 갯수를 세는데 사용된다.

함수의 그래프

함수의 형상을 시각적으로 파악하기 위해 그래프(graph) 또는 플롯(plot) 를 사용하기도 한다. 맷플롯립으로 다음과 같은 함수의 그래프를 그려보자.

f(x)=x33x2+x(4.1.18)f(x) = x^3 - 3x^2 + x \tag{4.1.18}
def f(x):
    return x**3 - 3 * x**2 + x

우선 x=1x=-1 부터 x=3x=3까지 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 = f(x)값을 구한다.

y = f(x)
y
array([-5.   , -1.375,  0.   , -0.125, -1.   , -1.875, -2.   , -0.625,
        3.   ])

이를 표로 나타내면 다음과 같다.

xx-1-0.500.511.522.53
yy-5-1.3750-0.125-1-1.875-2-0.6253

맷플롯립이 그리는 그래프는 이 표에 나타난 x,yx,y 쌍을 직선으로 연결한 그림이다.

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()

xx, yy 벡터의 구간을 더 조밀하게 만들면 그래프는 곡선으로 보이게 된다. 다음 그래프는 곡선으로 보이지만 실제로는 약 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()

연습 문제 4.1.1

맷플롯립으로 부호함수와 단위계단함수의 라인플롯을 그려라.

✏️

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)

max(x,0)={x if x00 if x<0(4.1.22)\max(x, 0) = \begin{cases} x & \text{ if } x \geq 0 \\ 0 & \text{ if } x < 0 \end{cases} \tag{4.1.22}

인공신경망에서는 이 함수를 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) 함수라는 종류의 하나다.

σ(x)=11+exp(x)(4.1.27)\sigma(x) = \dfrac{1}{1 + \exp(-x)} \tag{4.1.27}
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()

연습 문제 4.1.2

log2\log 2의 값은 약 0.69, log3\log 3의 값은 약 1.10 이다. 이 때 log12\log 12의 값을 구하라.
✏️
0.69 * 2 + 1.10 = 2.48

연습 문제 4.1.3

로지스틱함수의 역함수를 구하라.
✏️

x=11+exp(y)x = \dfrac{1}{1 + \exp(-y)}

1+exp(y)=1x1 + \exp(-y) = \dfrac{1}{x}

y=ln(1x1)y = -\ln(\dfrac{1}{x}-1)

소프트 플러스 함수

ζ(x)=log(1+exp(x))(4.1.34)\zeta(x) = \log( 1 + \exp(x)) \tag{4.1.34}
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)

소프트맥스(softmax) 함수는 다차원 벡터를 입력받아 다차원 벡터를 출력한다. 다음은 3차원 소프트맥스 함수이다.

y=[y1y2y3]=S(x1,x2,x3)=[exp(w1x1)exp(w1x1)+exp(w2x2)+exp(w3x3)exp(w2x2)exp(w1x1)+exp(w2x2)+exp(w3x3)exp(w3x3)exp(w1x1)+exp(w2x2)+exp(w3x3)](4.1.42)y = \begin{bmatrix} y_1 \\ y_2 \\ y_3 \end{bmatrix} =S(x_1, x_2, x_3) = \begin{bmatrix} \dfrac{\exp(w_1x_1)}{\exp(w_1x_1) + \exp(w_2x_2) + \exp(w_3x_3)} \\ \dfrac{\exp(w_2x_2)}{\exp(w_1x_1) + \exp(w_2x_2) + \exp(w_3x_3)} \\ \dfrac{\exp(w_3x_3)}{\exp(w_1x_1) + \exp(w_2x_2) + \exp(w_3x_3)} \\ \end{bmatrix} \tag{4.1.42}

출력 벡터는 다음과 같은 특성을 갖는다.

  • 모든 출력 원소는 0와 1 사잇값을 갖는다.
  • 모든 출력 원소의 합은 1이다.
  • 입력 원소의 크기 순서와 출력 원소의 크기 순서가 같다.

소프트맥스 함수의 출력은 확률(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])

참고사항
Plotly Python Graphing Library

profile
Connecting my favorite things

0개의 댓글