web-dev-qa-db-ja.com

Python)での多変量カーネル密度推定

SciPyのgaussian_kde関数を使用して、多変量データの密度を推定しようとしています。以下のコードでは、3D多変量正規分布をサンプリングしてカーネル密度を近似していますが、近似を評価する方法がわかりません。

import numpy as np
from scipy import stats

mu = np.array([1, 10, 20])
sigma = np.matrix([[4, 10, 0], [10, 25, 0], [0, 0, 100]])
data = np.random.multivariate_normal(mu, sigma, 1000)
values = data.T
kernel = stats.gaussian_kde(values)

this を見ましたが、3Dに拡張する方法がわかりません。

また、どのようにして適合密度の評価を開始するのかわかりませんか?これを視覚化するにはどうすればよいですか?

11
akhil

結果を3Dで視覚化する方法はいくつかあります。

最も簡単なのは、生成に使用したポイントでガウスKDEを評価し、密度推定によってポイントに色を付けることです。

例えば:

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

mu=np.array([1,10,20])
sigma=np.matrix([[4,10,0],[10,25,0],[0,0,100]])
data=np.random.multivariate_normal(mu,sigma,1000)
values = data.T

kde = stats.gaussian_kde(values)
density = kde(values)

fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))
x, y, z = values
ax.scatter(x, y, z, c=density)
plt.show()

enter image description here

より複雑な(つまり、すべてが平面にあるわけではない)分布がある場合は、通常の3DグリッドでKDEを評価し、ボリュームの等値面(3D輪郭)を視覚化することをお勧めします。視覚化にMayaviを使用するのが最も簡単です。

import numpy as np
from scipy import stats
from mayavi import mlab

mu=np.array([1,10,20])
# Let's change this so that the points won't all lie in a plane...
sigma=np.matrix([[20,10,10],
                 [10,25,1],
                 [10,1,50]])

data=np.random.multivariate_normal(mu,sigma,1000)
values = data.T

kde = stats.gaussian_kde(values)

# Create a regular 3D grid with 50 points in each dimension
xmin, ymin, zmin = data.min(axis=0)
xmax, ymax, zmax = data.max(axis=0)
xi, yi, zi = np.mgrid[xmin:xmax:50j, ymin:ymax:50j, zmin:zmax:50j]

# Evaluate the KDE on a regular grid...
coords = np.vstack([item.ravel() for item in [xi, yi, zi]])
density = kde(coords).reshape(xi.shape)

# Visualize the density estimate as isosurfaces
mlab.contour3d(xi, yi, zi, density, opacity=0.5)
mlab.axes()
mlab.show()

enter image description here

21
Joe Kington