如何获得空间中密度最大的点的坐标。
我有这段代码可以从该点生成随机点和密度分析。
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
内容:
在 (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')
这显然不行:密度包含以输入点为中心的峰值;您永远无法获得与 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
(诀窍是查看函数的负数,这会将最大值变为最小值)。
由于您的函数可能有一些局部最大值,因此可靠地找到全局最大值并非易事。我要么使用上述的最小化
,但首先在相关域上使用稀疏网格并首先找到最佳的最大候选,或使用重量级求解器,例如 differential_evolution
这是一个随机求解器,应该擅长找到函数的真正全局最小值。
寻根和最小化始终是变化无常的事情,因此您必须使用真实数据和可用方法来找到一个可靠的工作流程,为您提供最大的帮助。
关于python - 如何获取最大密度坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58559880/