머신 러닝 - 함수, Box Plot

이상해씨·2021년 11월 19일
0

머신 러닝

목록 보기
11/27

◾함수(Function)

  • 다항 함수 : f(x)=3x2+2f(x) = 3x^{2} + 2
    • 계수 : 3x23x^{2}에서의 3, 입력값의 계수
    • 변수 : 3x23x^{2}에서의 x, 입력값
    • 차수 : 3x23x^{2}에서의 2, 식에서의 최고 차항
    • 상수 : 22
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import set_matplotlib_korean
# 다항 함수
x = np.linspace(-3, 2, 100)
y = 3 * (x ** 2) + 2

# 다항 함수 그리기
mpl.style.use('seaborn-whitegrid')
plt.figure(figsize=(12, 8))
plt.plot(x, y)
plt.xlabel('$x$', fontsize=25)
plt.ylabel('$y = 3x^2 + 2$', fontsize=25)
plt.show()

# 다항함수의 x 축 방향 이동
# 평행 이동
x = np.linspace(-5, 5, 100)
y1 = 3 * (x ** 2) + 2
y2 = 3 * ((x + 1) ** 2) + 2

# 다항 함수
plt.figure(figsize=(12, 8))
plt.plot(x, y1, lw=2, ls = 'dashed', label='$y=3x^{2}+2$')
plt.plot(x, y2, label='$y=3(x+1)^{2}+2$')
plt.legend(fontsize=15)
plt.xlabel('$x$', fontsize=25)
plt.ylabel('$y$', fontsize=25)
plt.show()

  • 지수 함수 : f(x)=axf(x) = a^x
    • 밑수 : axa^x에서의 a
    • 지수 : axa^x에서의 x, 입력값
# 지수 함수
x = np.linspace(-2, 2, 100)
a11, a12, a13 = 2, 3, 4
y11, y12, y13 = a11**x, a12**x, a13**x

a21, a22, a23 = 1/2, 1/3, 1/4
y21, y22, y23 = a21**x, a22**x, a23**x
# 지수 함수 그래프
# 1 이상인 값, 1 미만인 값 비교
fig, ax = plt.subplots(1, 2, figsize=(12, 6))

ax[0].plot(x, y11, color='k', label=r"$2^x$")
ax[0].plot(x, y12, '--', color='k', label=r"$3^x$")
ax[0].plot(x, y13, ':', color='k', label=r"$4^x$")
ax[0].legend(fontsize=20)

ax[1].plot(x, y21, color='k', label=r"$(1/2)^x$")
ax[1].plot(x, y22, '--', color='k', label=r"$(1/3)^x$")
ax[1].plot(x, y23, ':', color='k', label=r"$(1/4)^x$")
ax[1].legend(fontsize=20)

plt.show()

# 지수 그래프
# 지수 함수의 증가 폭이 더 큰 것을 볼 수 있다.
x = np.linspace(0, 10)

plt.figure(figsize=(6, 6))
plt.plot(x, x**2, '--', color='k', label=r'$x^2$')
plt.plot(x, 2**x, color='k', label = r'$2^x$')
plt.legend(loc='center left', fontsize=25)
plt.xlabel("$x$", fontsize=25)
plt.ylabel("$y$", fontsize=25)
plt.show()

  • x가 2개인 지수식 : f(x)=(1+1x)xf(x) = (1 + {{1} \over {x}})^{x}
    • 2.7818281828459045..에 수렴
    • limx(1+1x)x=limx0(1+1x)x=e\lim_{x\to \infty}(1 + {{1} \over {x}})^{x} = \lim_{x\to 0}(1 + {{1} \over {x}})^{x} = e : 자연상수 e
    • 베르누이가 2.1782818..이 있음을 밝히고 오일러가 e라는 표기 사용
# 식 확인
x = np.array([10, 100, 1000, 10000, 100000])
(1 + 1/x) ** x

  • 로그 함수 : f(x)=logaxf(x)=\log_{a}{x}
    • logax=logxloga\log_{a}{x} = {\log{x} \over \log{a}}
# 로그 함수 데이터
# np의 로그는 밑수가 1개로 고정(자연 상수 e)되어있기 때문에
# 자유로운 계산을 위해 함수 생성
def log(x, base):
    return np.log(x)/np.log(base)

x1 = np.linspace(0.0001, 5, 1000)
x2 = np.linspace(0.01, 5, 100)

y11, y12 = log(x1, 10), log(x1, np.e)
y21, y22 = log(x2, 1/10), log(x2, 1/np.e)

# 로그 함수 그리기
fig, ax = plt.subplots(1, 2,  figsize=(12, 6))

ax[0].plot(x1, y11, color='k', label=r'$\log_{10}{x}$')
ax[0].plot(x1, y12, '--', color='b', label=r'$\log_{e}{x}$')

ax[0].set_xlabel('$x$', fontsize=25)
ax[0].set_ylabel('$y$', fontsize=25)
ax[0].legend(fontsize=20, loc='lower right')

ax[1].plot(x2, y21, color='k', label=r'$\log_{1/10}{x}$')
ax[1].plot(x2, y22, '--', color='b', label=r'$\log_{1/e}{x}$')

ax[1].set_xlabel('$x$', fontsize=25)
ax[1].set_ylabel('$y$', fontsize=25)
ax[1].legend(fontsize=20, loc='upper right')

plt.show()

  • 시그모이드(Sigmoid) : σ(z)=11+ez\sigma(z) = {1 \over 1 + e^{-z}}
    • 최대 1로 수렴, 최소 0으로 수렴
# 시그모이드 함수
z = np.linspace(-10, 10, 100)
sigma = 1/(1+np.exp(-z))

plt.figure(figsize=(12, 8))
plt.plot(z, sigma)
plt.xlabel('$z$', fontsize=25)
plt.ylabel('$\sigma$', fontsize=25)
plt.show()

  • 벡터 표현
    • x=(x1x2)x = (\begin{matrix} x_{1} \\ x_{2} \end{matrix})
    • 전치 행렬 표현 : x=(x1x2)Tx = (\begin{matrix} x_{1} & x_{2} \end{matrix})^{T}
  • 단일 변수 스칼라 함수(단일 변수 출력) : y=f(x)y = f(x)
  • 다중 변수 스칼라 함수(단일 변수 출력) : y=f(x)y = f(\vec{x})
  • 다변수 벡터 함수(다중 변수 출력) : F(X)=(f1(X),f2(X),...,fn(X))TF(\mathbb{X}) = (f_{1}(\mathbb{X} ),f_{2}(\mathbb{X}),...,f_{n}(\mathbb{X}))^{T}
    • S(u,v)=(uv1+u2+v1+v2)S(u, v) = \left(\begin{matrix}u \\ v \\ 1 + u^{2} + {v \over 1+v^{2}}\end{matrix} \right)
# 다변수 벡터 함수 데이터
u = np.linspace(0, 1, 30)
v = np.linspace(0, 1, 30)

# meshgrid
# 1차원 배열 벡터를 묶어 하나의 좌표로 표현한다.
# 좌표 벡터에서 좌표 행렬을 반환한다.
U, V = np.meshgrid(u, v)
X = U
Y = V
Z = (1+U**2) + (V/(1+V**2))

# 다변수 벡터 함수 그래프
fig = plt.figure(figsize=(7, 7))
# 3d 표현을 위해 설정
ax = plt.axes(projection='3d')

ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)
ax.zaxis.set_tick_params(labelsize=15)

ax.set_xlabel('$x$', fontsize=20)
ax.set_ylabel('$y$', fontsize=20)
ax.set_zlabel('$z$', fontsize=20)

ax.scatter3D(X, Y, Z, marker='.', color='blue')
plt.show()

  • 함수의 그래프 방식 표현
    • 동그라미 : node
    • 화살표 : edge
  • 함수의 합성
    • y=f(x), z=g(y)=g(f(x))y = f(x),~ z = g(y) = g(f(x))
    • gf=g(f(x))g\circ f = g(f(x))
# 함수의 합성 예시
x = np.linspace(-4, 4, 100)
y = x**3 -15*x + 30         # f(x)
z = np.log(y)               # g(y) = g(f(x))

# 그래프 그리기
fig, ax = plt.subplots(1, 2, figsize=(12, 6))

ax[0].plot(x, y, label='$x^3 -15x + 30$', color='k')
ax[0].legend(fontsize=18)

ax[1].plot(y, z, label='$\log(y)$', color='k')
ax[1].legend(fontsize=18)

plt.show()

# 합성 그래프
# 그래프 그리기
fig, ax = plt.subplots(1, 2, figsize=(12, 6))

ax[0].plot(x, z, '--', label='$\log(f(x))$', color='k')
ax[0].legend(fontsize=18)

ax[1].plot(x, y, label='$x^3 -15x + 30$', color='k')
ax[1].legend(fontsize=18)
# 보조축 생성
ax_tmp = ax[1].twinx()
ax_tmp.plot(x, z, '--', label='$\log(f(x))$', color='k')

plt.show()


◾Box Plot

  • box plot : 수치적 자료를 표현하는 그래프
    • 최소값, Q1(제 1 사분위), Q2(제 2 사분위), Q3(제 3 사분위), 최대값: 5개의 요약 수치를 이용한다.
    • IQR 범위를 박스로 표현한다.
    • 따로 점으로 표현된 부분은 outlier을 의미한다.
      • Q1, Q3에서 (IQR * 1.5) 이상 떨어진 경우 이상치(outlier)로 본다.
# 데이터 준비
samples = [1, 7 ,9, 16, 36, 39, 45, 45, 46, 48, 51, 100, 101]
tmp_y = [1]*len(samples)
# 그래프 그리기
plt.figure(figsize=(12, 4))
plt.scatter(samples, tmp_y)
plt.grid()
plt.show()

# 지표 찾기
# Q1, Q2(중앙값) Q3
print(np.percentile(samples, 25), np.median(samples), np.percentile(samples, 75))

# IQR
print(np.percentile(samples, 75) - np.percentile(samples, 25))
print((np.percentile(samples, 75) - np.percentile(samples, 25)) * 1.5)

# 그래프 그리기
import matplotlib as mpl
mpl.style.use('default')

q1 = np.percentile(samples, 25)
q2 = np.median(samples)
q3 = np.percentile(samples, 75)
iqr = q3 - q1
upper_fence = q3 + iqr*1.5
lower_fence = q1 - iqr*1.5

plt.figure(figsize=(12, 4))
plt.scatter(samples, tmp_y)
plt.axvline(x=q1, color='black')
plt.axvline(x=q2, color='red')
plt.axvline(x=q3, color='black')
plt.axvline(x=upper_fence, color='black', ls='dashed')
plt.axvline(x=lower_fence, color='black', ls='dashed')
plt.grid()
plt.show()

# seaborn과 비교
# box의 수염(경계값)과 min, max와 비교해 선택
import seaborn as sns

plt.figure(figsize=(12, 4))
sns.boxplot(data=samples, orient='h')
plt.grid()
plt.show()

profile
후라이드 치킨

0개의 댓글