【问题标题】:Multivariate kernel density estimation in PythonPython中的多变量核密度估计
【发布时间】:2014-03-22 00:41:46
【问题描述】:

我正在尝试使用 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。

我什至不确定如何开始评估拟合密度?我如何将其可视化?

【问题讨论】:

    标签: python numpy scipy gaussian kernel-density


    【解决方案1】:

    您可以通过多种方式以 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()
    

    如果您有更复杂的(即并非全部位于平面内)分布,那么您可能希望在常规 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()
    

    【讨论】:

    • 谢谢乔。这很有帮助。你知道这个函数是否能够处理丢失的数据点吗?
    • 如何得到“kde”的平均值?
    • 第一个示例中的density = kde(values) 行产生错误LinAlgError: 1-th leading minor of the array is not positive definite
    • 优雅的解释!谢谢乔!
    猜你喜欢
    • 2015-08-22
    • 2017-02-06
    • 2019-02-14
    • 1970-01-01
    • 2015-06-09
    • 2020-05-30
    • 1970-01-01
    • 2016-09-18
    • 2021-05-01
    相关资源
    最近更新 更多