1. 이변수 함수 그리기.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#함수 f3을 정의
def f3(x0, x1):
r = 2* x0**2 + x1**2
ans = r*np.exp(-r)
return ans
#x0, x1에서 각각 f3을 계산
xn = 9 #구간이 더 촘촘해질수록 부드러운 모양의 그래프가 나옴
x0 = np.linspace(-2,2, xn) #x0의 범위
x1 = np.linspace(-2,2, xn) #x1의 범위
y = np.zeros((len(x0), len(x1))) #결산결과를 저장할 변수 초기화
for i0 in range(xn):
for i1 in range(xn):
y[i1, i0] = f3(x0[i0], x1[i1])
print(x0)
print(np.round(y,1))
plt.figure(figsize=(3.5,3))
plt.gray()
plt.pcolor(y)
plt.colorbar()
print(plt.show())
▶ 지수함수의 계산식 / 전체 계산식 = 입력값 2개 , 출력값 1개
▷ 총 3개의 값으로 3차원 그래프가 그려지는 것.
▶ np.linspace (범위low, 범위high, 구간) : 시작값, 끝값, 그 사이를 몇개로 나눌것인지(디폴트 값은 50개) 결정
▶ 해당 그래프는 도너츠 같은 모습을 하고 있는데 (출력값도 그렇다)
수치를 더 눈에 잘 들어오는 그래프를 그려보기
plt.gray() / plt.jet() / plt.pink() / plt.bone() 등 다양한 그라데이션 패턴을 가진 그래프가 존재
2. surface 그래프. : 함수의 표면을 표시하는 3차원 입체 그래프
▼ subplot(n1, n2, n, projection='3d')는 3차원 그래프를 그리겠다고 선언한거 ▼ rstride와 cstride에는 자연수를 부여해 가로 및 세로로 몇 개의 선을 긋는지. 적을수록 선의 간격이 조밀해짐. ▼ ax.view_init(인수1, 인수2)는 3차원 그래프의 방향을 조절 ▼ ax.set_zticks((0,0.2)) : z의 눈금을 0과 0.2으로 제한하고 있음. 기본으로하면 숫자가 겹쳐져버림
from mpl_toolkits.mplot3d import Axes3D
def f3(x0, x1):
r = 2* x0**2 + x1**2
ans = r*np.exp(-r)
return ans
#x0, x1에서 각각 f3을 계산
xn = 9
x0 = np.linspace(-2,2, xn)
x1 = np.linspace(-2,2, xn)
y = np.zeros((len(x0), len(x1)))
for i0 in range(xn):
for i1 in range(xn):
y[i1, i0] = f3(x0[i0], x1[i1])
xx0, xx1 = np.meshgrid(x0,x1)
plt.figure(figsize=(5, 3.5))
ax = plt.subplot(1,1,1, projection='3d')
ax.plot_surface(xx0, xx1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black')
ax.set_zticks((0, 0.2))
ax.view_init(70,-95)
plt.show()
▶np.meshgrid(x0, x1) 으로 만들어진 xx0, xx1은 나온 값을 2차원 배열로 만들어
: linspace 값을 배열로 만들어줌(여기서는),
▼ 요런식 : x값은 열 방향의 값들이 다 동일하고, y값 자리에는 행 방향의 값들이 다 동일하다.
▼ 두번째 xx1은 y와 같은 크기의 행렬이 나옴.
3. contour : 등고선 그래프
▼ xn 은 원래는 구간이나 등고선 그래프에서는 밀도를 의미함
▼ plt.contour(xx0, xx1, y, 5, colors='black')로 등고선 플롯을 작성. 5는 표시하는 높이를 단계로 지시
▼ plt.contour 반환값을 cont에 저장후
▷ cont.clabel(fmt='%3.2f', fontsize=8) 에 설정해 등고선에 숫자를 추가. fmt='3.2f'로 숫자형식 지정
xn = 50
x0 = np.linspace(-2,2, xn)
x1 = np.linspace(-2,2, xn)
y = np.zeros((len(x0), len(x1)))
for i0 in range(xn):
for i1 in range(xn):
y[i1, i0]= f3(x0[i0], x1[i1])
xx0, xx1 = np.meshgrid(x0,x1)
plt.figure(1, figsize=(4,4))
cont = plt.contour (xx0, xx1, y, 5, colors='black')
cont.clabel(fmt='%3.2f', fontsize=8)
plt.xlabel('$x_0$', fontsize=14)
plt.ylabel('$x_1$', fontsize=14)
plt.show()
'머신러닝 > 개념익히기' 카테고리의 다른 글
지수함수와 로그함수 (0) | 2023.05.16 |
---|---|
행렬 (0) | 2023.05.16 |
머신러닝에 필요한 수학 기본 - 합 / 곱 / 미분 (0) | 2023.05.15 |
벡터와 연산 (0) | 2023.05.10 |
3차 함수 그래프 그리기 (0) | 2023.05.09 |