파이썬에서 임의의 정의 영역을 가진 히트 맵을 만드는 방법

13542 단어 파이썬matplotlib


$f=(x,y)$적인 데이터를 나타내기 위해서, 히트 맵 은 강력한 수단입니다.

파이썬에서는 seaborn가 유명하지만 x와 y의 정의 영역이 각각 1,2,...로 제한됩니다. 어차피라면 임의의 정의역에서 하고 싶네요. scikitlearn 샘플 코드 를 참고로 한 방법을 해설합니다.

불법이지만 모든 기능에 대응할 수있는 사람


import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-2,2,0.1)
y = np.arange(-2,2,0.1)
xx,yy = np.meshgrid(x,y)
z = np.zeros((len(x),len(y)))
for i in range(len(x)):
    for j in range(len(y)):
        v = np.array([xx[i][j],yy[i][j]])
        r = np.linalg.norm(v)
        z[i][j] = np.exp(-r)
plt.figure(figsize=(5,5))
plt.contourf(x,y,z,cmap='coolwarm')
plt.show()

for문의 내용이 실질적인 $f(x,y)$가 되어 있어, 위의 샘플 코드에서는 예로서,

$$
f(x,y) = e^{\frac{-1}{\sqrt{x^2+y^2}}}
$$

 를 구현하고 있습니다. 번잡하기 때문에 세 줄로 나뉘어 있지만, 하는 것은 동일합니다.

 이것은 모든 함수에 대응 가능합니다만, for문을 사용하고 있는 것이 아무리도 좋지 않습니다. 무엇보다, 행렬을 1회 걸면 괜찮은 패턴이나, 각종 기계 학습의 예측 모델(대개는 데이터수 x 입력 벡터)의 형태에 대응하고 있지 않기 때문에 불편합니다.

데이터 수 x 입력 벡터의 형태로 수정 된 사람


import numpy as np
import matplotlib.pyplot as plt

def model(xy):
    ar = np.array([-2,1])
    return np.matmul(xy,ar)

x = np.arange(-2,2,0.1)
y = np.arange(-2,2,0.1)
xx,yy = np.meshgrid(x,y)
xx = xx.reshape(-1,1)
yy = yy.reshape(-1,1)
xy = np.concatenate([xx,yy],1)
z = model(xy)
z = z.reshape(-1,len(x))
plt.figure(figsize=(5,5))
plt.contourf(x,y,z,cmap='coolwarm')
plt.show()

 x, y의 형태를 성형하고 있습니다. 그림으로 하면 다음과 같은 느낌입니다.



이 형식이면, 예를 들면 lda.precdict() 이나 model() (PyTorch 등)의 함수에 대응할 수 있습니다.


contourf 가 아니라 pcolormedh 로 하면 그리드 표시가 됩니다. 외형은 깨끗합니다만, 데이터의 경향은 오히려 알기 어려워지는 생각이 들기 때문에, 개인적으로는 contourf 쪽이 좋아합니다.


import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-2,2,0.01) #解像度を0.01に
y = np.arange(-2,2,0.01) #解像度を0.01に
xx,yy = np.meshgrid(x,y)
z = np.zeros((len(x),len(y)))
for i in range(len(x)):
    for j in range(len(y)):
        v = np.array([xx[i][j],yy[i][j]])
        r = np.linalg.norm(v)
        z[i][j] = np.exp(-r)
plt.figure(figsize=(5,5))
plt.pcolormesh(x,y,z,cmap='coolwarm') #ここを変更
plt.show()

좋은 웹페이지 즐겨찾기