gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:02:59 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com