- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用scipys gaussian_kde获取某些双峰数据的概率密度。但是,由于我的数据是有角度的(以度为单位的方向),所以当值接近极限时会出现问题。下面的代码提供了两个示例kde,当域为0-360时,由于无法处理数据的循环性质,因此处于估计状态。 pdf需要在单位圆上定义,但我在scipy.stats中找不到适合此类数据的任何内容(存在冯·米斯分布,但仅适用于单峰数据)。外面有没有人遇到过这个?是否有任何可用于估算单位圆上的双峰pdf的(基于python的优先选择)?
import numpy as np
import scipy as sp
from pylab import plot,figure,subplot,show,hist
from scipy import stats
baz = np.array([-92.29061004, -85.42607874, -85.42607874, -70.01689348,
-63.43494882, -63.43494882, -70.01689348, -70.01689348,
-59.93141718, -63.43494882, -59.93141718, -63.43494882,
-63.43494882, -63.43494882, -57.52880771, -53.61564818,
-57.52880771, -63.43494882, -63.43494882, -92.29061004,
-16.92751306, -99.09027692, -99.09027692, -16.92751306,
-99.09027692, -16.92751306, -9.86580694, -8.74616226,
-9.86580694, -8.74616226, -8.74616226, -2.20259816,
-2.20259816, -2.20259816, -9.86580694, -2.20259816,
-2.48955292, -2.48955292, -2.48955292, -2.48955292,
4.96974073, 4.96974073, 4.96974073, 4.96974073,
-2.48955292, -2.48955292, -2.48955292, -2.48955292,
-2.48955292, -9.86580694, -9.86580694, -9.86580694,
-16.92751306, -19.29004622, -19.29004622, -26.56505118,
-19.29004622, -19.29004622, -19.29004622, -19.29004622])
xx = np.linspace(-180, 180, 181)
scipy_kde = stats.gaussian_kde(baz)
print scipy_kde.integrate_box_1d(-180,180)
figure()
plot(xx, scipy_kde(xx), c='green')
baz[baz<0] += 360
xx = np.linspace(0, 360, 181)
scipy_kde = stats.gaussian_kde(baz)
print scipy_kde.integrate_box_1d(-180,180)
plot(xx, scipy_kde(xx), c='red')
最佳答案
这是对@kingjr的更准确答案的快速近似:
def vonmises_pdf(x, mu, kappa):
return np.exp(kappa * np.cos(x - mu)) / (2. * np.pi * scipy.special.i0(kappa))
def vonmises_fft_kde(data, kappa, n_bins):
bins = np.linspace(-np.pi, np.pi, n_bins + 1, endpoint=True)
hist_n, bin_edges = np.histogram(data, bins=bins)
bin_centers = np.mean([bin_edges[1:], bin_edges[:-1]], axis=0)
kernel = vonmises_pdf(
x=bin_centers,
mu=0,
kappa=kappa
)
kde = np.fft.fftshift(np.fft.irfft(np.fft.rfft(kernel) * np.fft.rfft(hist_n)))
kde /= np.trapz(kde, x=bin_centers)
return bin_centers, kde
import numpy as np
from tqdm import tqdm
import scipy.stats
import matplotlib.pyplot as plt
n_runs = 1000
n_bins = 100
kappa = 10
for _ in tqdm(xrange(n_runs)):
bins1, kde1 = vonmises_kde(
data=np.r_[
np.random.vonmises(-1, 5, 1000),
np.random.vonmises(2, 10, 500),
np.random.vonmises(3, 20, 100)
],
kappa=kappa,
n_bins=n_bins
)
for _ in tqdm(xrange(n_runs)):
bins2, kde2 = vonmises_fft_kde(
data=np.r_[
np.random.vonmises(-1, 5, 1000),
np.random.vonmises(2, 10, 500),
np.random.vonmises(3, 20, 100)
],
kappa=kappa,
n_bins=n_bins
)
plt.figure()
plt.plot(bins1, kde1, label="kingjr's solution")
plt.plot(bins2, kde2, label="dolf's FFT solution")
plt.legend()
plt.show()
100%|██████████| 1000/1000 [00:07<00:00, 135.29it/s]
100%|██████████| 1000/1000 [00:00<00:00, 1945.14it/s]
exact
KDE将为
the kernel centred around 0.1
+
the kernel centred around 0.2
。近似值是2x内核在0.5的中心,该中心是bin的中心。
关于scipy gaussian_kde和循环数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28839246/
我需要对从对数正态分布生成的数据进行核密度估计。我一直在使用 gaussian_kde 并使用 Python 中的 matplotlib 绘制数据。 但是,一个问题是数据的偏差如此之大,以至于很难正确
我有一个 gaussian_kde.resample大批。我不知道它是否是一个 numpy 数组,以便我可以使用 numpy 函数。 我有数据0 I only want values within t
关于 scipy.stats.gaussian_kde 的文档说应该使用关键字 bw_method 来尝试不同的方法,但是当我尝试使用它时出现错误: TypeError: __init__() got
我正在尝试使用 the scipy.stats.gaussian_kde class将一些用经纬度信息收集的离散数据进行平滑处理,使其最终显示为有点类似于等高线图,其中高密度为峰,低密度为谷。 我很难
我有一系列要应用 KDE 的坐标,并且一直在使用 scipy.stats.gaussian_kde这样做。这里的问题是这个函数需要一组离散的坐标,然后它会执行密度估计。 当我希望记录我的数据时,这会导
我有两个 python gaussian_kde 对象,我想找到交集。有简单的方法吗? 请注意,这些函数没有很好地参数化,见图。 这是一种简单的方法(假设只有一个交集,但可以轻松修改范围内的所有交集,
我正在使用 SciPy 的 stats.gaussian_kde函数从 x,y 点的数据集生成核密度估计 (kde) 函数。 这是我的代码的简单 MWE: import numpy as np fro
在 python 3.7 中,我有一个 shape=(2, 34900) 的 numpy 数组。该数组是一个坐标列表,其中索引 0 表示 X 轴,索引 1 表示 y 轴。 当我使用 seaborn.k
我从两个叠加的正态分布中创建了一些数据,然后应用 sklearn.neighbors.KernelDensity 和 scipy.stats.gaussian_kde 来估计密度函数。但是,使用相同的
我正在尝试对可能不是正态分布的一系列分布生成基于 KDE 的 PDF 估计。 我喜欢 R 中 ggplot 的 stat_density 似乎可以识别频率中的每一个增量颠簸的方式,但无法通过 Pyth
我对Python非常陌生(具有纯.net背景),我正在使用this生成二维 kde 分析的教程。 生成一些随机二维数据: from scipy import stats def measure(n):
我是一名优秀的程序员,十分优秀!