【问题标题】:How to obtain coordinates of maximum density如何获得最大密度的坐标
【发布时间】:2020-02-21 21:16:36
【问题描述】:

我怎样才能得到空间中密度最大的点的坐标。

我有这个代码来生成一个随机点并从这个点进行密度分析。

import numpy as np
from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

def random_data(N):
    # Generate some random data.
    return np.random.uniform(0., 10., N)

x_data = random_data(50)
y_data = random_data(50)

kernel = stats.gaussian_kde(np.vstack([x_data, y_data]), bw_method=0.05)

b = plt.plot(x_data, y_data, 'ro')
df = pd.DataFrame({"x":x_data,"y":y_data})
p = sns.jointplot(data=df,x='x', y='y',kind='kde')

plt.show(p)

感谢您的帮助。 :)

【问题讨论】:

    标签: python python-3.x matplotlib scipy gaussian


    【解决方案1】:

    首先,让我通过 sns.jointplot 自行计算内核密度来说明这一点,因此您的 kernel 变量尚未使用。

    这是sns.jointplot 使用随机样本为我生成的内容:

    在 (7, 5.4) 附近有一个不错的最大值。

    这是您的 kernel 对应的内容:

    x,y = np.mgrid[:10:100j, :10:100j]  # 100 x 100 grid for plotting
    z = kernel.pdf(np.array([x.ravel(),y.ravel()])).reshape(x.shape)
    
    fig,ax = plt.subplots()
    ax.contourf(x, y, z, levels=10)
    ax.axis('scaled')
    

    这显然不行:密度包含以输入点为中心的峰值;你永远无法得到与sns.jointplot 给出的类似的估计值。

    我们可以轻松解决此问题:您只需在对 gaussian_kde 的调用中删除自定义 bw_method 参数:

    kernel = stats.gaussian_kde(np.vstack([x_data, y_data]))
    
    x,y = np.mgrid[:10:100j, :10:100j]  # 100 x 100 grid for plotting
    z = kernel.pdf(np.array([x.ravel(),y.ravel()])).reshape(x.shape)
    
    fig,ax = plt.subplots()
    ax.contourf(x, y, z, levels=10)
    ax.axis('scaled')
    

    这看起来就是你想要的样子:

    现在您知道 kernel.pdf 是一个二元函数,您正在寻找最大值。

    要找到最大值,您可能应该使用来自 scipy.optimize 的东西,例如 scipy.optimize.minimize(诀窍是查看函数的负数,它将最大值变为最小值)。

    由于您的函数可能会有一些局部最大值,因此可靠地找到全局最大值并非易事。我会使用前面提到的minimize,但首先在相关域上使用稀疏网格并首先找到最佳的最大候选者,或使用重量级求解器,例如differential_evolution,这是一个应该擅长找到函数的真正全局最小值的随机求解器。

    寻根和最小化总是变幻无常的事情,因此您必须使用真实数据和可用方法来找到一个可靠的工作流程,让您发挥最大的作用。

    【讨论】:

      猜你喜欢
      • 2015-10-22
      • 2019-10-11
      • 2017-03-23
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2014-11-30
      • 2014-09-02
      相关资源
      最近更新 更多