[머신러닝] 기초수학, boxplot

쩡이·2023년 9월 21일

ML

목록 보기
6/14

기초수학

다양한 함수 형태의 그래프를 그려보자.

다항함수

y=3x2+2y = 3x^2 + 2

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 2, 100)
y = 3 * (x**2) + 2

#그래프 그리기
plt.figure(figsize=(12,8))
plt.plot(x,y)
plt.grid()
plt.xlabel('$x$')
plt.ylabel('$3x^2 + 2$')

#grid를 사용하지 않고 모듈을 이용
import matplotlib as mpl

mpl.style.use('seaborn-whitegrid')

plt.figure(figsize=(12,8))
plt.plot(x,y)
plt.xlabel('$x$', fontsize=15)
plt.ylabel('$3x^2 + 2$', fontsize=15)
plt.show()

다항함수의 x축 평행 이동

x = np.linspace(-3, 2, 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=10)
plt.xlabel('$x$', fontsize=15)
plt.ylabel('$y$', fontsize=15)
plt.show()

지수함수

y=axy=a^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

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

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

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

지수 증가를 그래프로 표현

x = np.linspace(0, 10)

plt.figure(figsize=(6,6))
plt.plot(x, x**2, '--', color='k', label='$x^2$')
plt.plot(x, 2**x, color='k', label='$2^x$')
plt.legend()

로그, 자연로그함수를 그래프로 나타내보자
y=logaby=\log_ab
y=logeay=\log_ea

x = np.array([10, 100, 1000, 10000, 100000, 1000000, 10000000])

(1+1/x)**x

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(x2, np.e)
y21, y22 = log(x1, 1/10), log(x2, 1/np.e)

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

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

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

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

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

시그모이드 sigmoid
항상 0~1 사이 값을 가진다

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(z)$', fontsize=25)
plt.show()

벡터 표현, 3D 그래프 그리기

u = np.linspace(0, 1, 30)
v = np.linspace(0, 1, 30)
U, V = np.meshgrid(u,v)
Z = (1 + U**2) + V / (1 + V**2)

#그래프 그리기
fig = plt.figure(figsize=(7,7))
ax = plt.axes(projection='3d') #3차원 옵션

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=15)
ax.set_ylabel('$y$', fontsize=15)
ax.set_zlabel('$z$', fontsize=15)

ax.scatter3D(U,V,Z, marker='.', color='grey')
plt.show()

합성함수

x = np.linspace(-4, 4, 100)
y = x**3 - 15*x + 30 #f(x)
z = np.log(y) #g(y)

#일반함수 그래프 그리기
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() #두번째 그림에 x축을 하나 더 만들어라
ax_tmp.plot(x,z,'--',label='$\log(f(x))$', color='k') #그 축을 기준으로 합성함수 그래프를 그려라

plt.show()

Boxplot

outlier : 1.5IQR을 벗어난 부분

샘플데이터를 만들어서 boxplot을 그려보자

samples = [1, 7, 9, 16, 36, 39, 45, 45, 46, 48, 51, 100, 101]
tmp_y = [1]*len(samples)

#plot 그리기
import matplotlib.pyplot as plt

plt.figure(figsize=(12,4))
plt.scatter(samples, tmp_y)
plt.grid()
plt.show()

boxplot의 몇몇 지표 찾기

import numpy as np

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

#plot 그래프에 지표 나타내기
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.show()

0개의 댓글