ちょっとやってみた感じです。
import numpy as np x,y = np.mgrid[10:100:2, 10:100:2] pos = np.empty(x.shape + (2,)) pos[:, :, 0] = x pos[:, :, 1] = y
np.mgrid[10:100:2, 10:100:2] で x, y にグリッドなデータを生成させます。
この形状は、 10 起点で 100 未満まで 2 ステップで生成します。(データ数は 1 軸 45 個)
x.shape は (45, 45) で、x, y はそれぞれこんな形状になります。
array([[10, 10, 10, ..., 10, 10, 10],
[12, 12, 12, ..., 12, 12, 12],
[14, 14, 14, ..., 14, 14, 14],
...,
[94, 94, 94, ..., 94, 94, 94],
[96, 96, 96, ..., 96, 96, 96],
[98, 98, 98, ..., 98, 98, 98]])
array([[10, 12, 14, ..., 94, 96, 98],
[10, 12, 14, ..., 94, 96, 98],
[10, 12, 14, ..., 94, 96, 98],
...,
[10, 12, 14, ..., 94, 96, 98],
[10, 12, 14, ..., 94, 96, 98],
[10, 12, 14, ..., 94, 96, 98]])
作成した pos はこの時点で
(45, 45, 2)
array([[[10., 10.],
[10., 12.],
[10., 14.],
...,
[10., 94.],
[10., 96.],
[10., 98.]],
[[12., 10.],
[12., 12.],
[12., 14.],
...,
[12., 94.],
[12., 96.],
[12., 98.]],
[[14., 10.],
[14., 12.],
[14., 14.],
...,
[14., 94.],
[14., 96.],
[14., 98.]],
...,
show more (open the raw output data in a text editor) ...
[98., 12.],
[98., 14.],
...,
[98., 94.],
[98., 96.],
[98., 98.]]])
まさに座標ですね。
ここにデータを肉付けします
from scipy.stats import multivariate_normal rv = multivariate_normal([50, 50], [[100, 0], [0, 100]]) z = rv.pdf(pos)
multivariate_normal の引数を見ていくと、z,y ともに平均値 50、[[100, 0], [0, 100]] は 分散共分散行列(後述に詳細。分散100, 共分散0)
この時の z はこんな感じになっている。
(45, 45)
array([[1.79105293e-10, 3.90713230e-10, 8.18909735e-10, ...,
3.33805656e-11, 1.35715252e-11, 5.30141552e-12],
[3.90713230e-10, 8.52330075e-10, 1.78642887e-09, ...,
7.28187781e-11, 2.96059059e-11, 1.15648909e-11],
[8.18909735e-10, 1.78642887e-09, 3.74423972e-09, ...,
1.52623463e-10, 6.20520695e-11, 2.42392656e-11],
...,
[3.33805656e-11, 7.28187781e-11, 1.52623463e-10, ...,
6.22126874e-12, 2.52937912e-12, 9.88045888e-13],
[1.35715252e-11, 2.96059059e-11, 6.20520695e-11, ...,
2.52937912e-12, 1.02836881e-12, 4.01709481e-13],
[5.30141552e-12, 1.15648909e-11, 2.42392656e-11, ...,
9.88045888e-13, 4.01709481e-13, 1.56918905e-13]])
それぞれの位置に一つづつ値が入っている形かな。
これを作画すると
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(dpi=100)
ax = Axes3D(fig)
ax.plot_wireframe(x, y, z)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x, y)')
ax.ticklabel_format(style='sci', axis='z', scilimits=(0, 0))

うーんかっこいい
分散共分散行列
分散共分散行列とは、 と
の2つの数列があり、こんな値を持ってるとします
としたとき、平均値 E は
で、偏差(実値 - 平均)を取ると
で、各分散を考えると
共分散 は の様に記述し
要するに は A,B の偏差をかけた平均= 共分散
で、分散共分散の定義は
で、当てはめて
という形になります。