python - 如何获取最大密度坐标

标签 python python-3.x matplotlib scipy gaussian

如何获得空间中密度最大的点的坐标。

enter image description here

我有这段代码可以从该点生成随机点和密度分析。

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)

谢谢你的帮助。 :)

最佳答案

首先,让我声明一下显而易见的事实,sns.jointplot 会自行计算内核密度,因此您的 kernel 变量尚未使用。

这是使用随机样本为我生成的 sns.jointplot 内容: fancy 2d kernel density contour with marginal distributions

在 (7, 5.4) 左右有一个很好的最大值。

这是您的内核对应的内容:

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')

output from original kernel's KDE: scattered sharp peaks around input points

这显然不行:密度包含以输入点为中心的峰值;您永远无法获得与 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')

这看起来正是你想要的样子: fixed contour plot which looks like the one from sns.jointplot

现在您知道这个 kernel.pdf 是您正在寻找最大值的双变量函数。

要找到最大值,您可能应该使用 scipy.optimize 中的某些内容,例如 scipy.optimize.minimize (诀窍是查看函数的负数,这会将最大值变为最小值)。

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

寻根和最小化始终是变化无常的事情,因此您必须使用真实数据和可用方法来找到一个可靠的工作流程,为您提供最大的帮助。

关于python - 如何获取最大密度坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58559880/

相关文章:

python - 箱线图中的自动(晶须敏感)ylim

python - 更改 Matplotlib 图表上的标签(例如 Muli)

python - 基于 2 个字段的 Django 过滤器

python - 如何创建地理引用随机数据?

python - 导入函数参数 numpy

Python 欧拉方法在二体问题中的实现不起作用

python - 计算 DataFrame 列中的 NaN 窗口(及其大小)

python - Youtube_DL 下载格式(python 3)

python-3.x - 将 io.BytesIO 对象传递给 gzip.GzipFile 并写入 GzipFile

python - Matplotlib (GridSpec) - 子图轴标签被截断?尝试过 `tight_layout`