标签: kernel-density

高斯_filter和gaussian_kde中sigma与带宽的关系

如果分别适当地选择每个函数中的和参数,则对给定数据集应用函数scipy.ndimage.filters.gaussian_filterscipy.stats.gaussian_kde可以给出非常相似的结果.sigmabw_method

例如,我可以获取由以下曲线设定点的随机分布2D sigma=2.gaussian_filter(左侧曲线)和bw_method=sigma/30.gaussian_kde(右曲线):

在此输入图像描述

(MWE位于问题的最底部)

这些参数之间显然存在关系,因为一个应用高斯滤波器而另一个应用高斯核密度估计器.

每个参数的定义是:

sigma:标量或标量序列高斯核的标准偏差.高斯滤波器的标准偏差是作为序列给出的每个轴,或者是单个数字,在这种情况下,它对所有轴都是相等的.

鉴于高斯算子的定义,我可以理解这个:

在此输入图像描述

bw_method:str,scalar或callable,optional用于计算估计器带宽的方法.这可以是'scott','silverman',标量常量或可调用.如果是标量,则将直接用作kde.factor.如果是可调用的,则应该将gaussian_kde实例作为唯一参数并返回标量.如果为None(默认值),则使用"scott".有关详细信息,请参阅注释

在这种情况下,让我们假设输入bw_method是一个标量(浮点数),以便与之相比较sigma.这是我迷路的地方,因为我无法在任何kde.factor地方找到有关此参数的信息.

我想知道的是连接这些参数的精确数学方程式(即:sigmabw_method使用浮点数时),如果可能的话.


MWE:

import numpy as np
from scipy.stats import gaussian_kde
from scipy.ndimage.filters import gaussian_filter
import matplotlib.pyplot as plt

def rand_data():
    return np.random.uniform(low=1., high=200., size=(1000,))

# Generate 2D data.
x_data, y_data = rand_data(), rand_data()
xmin, xmax = min(x_data), …
Run Code Online (Sandbox Code Playgroud)

python filtering gaussian scipy kernel-density

6
推荐指数
1
解决办法
2213
查看次数

如何在核密度估计中找到局部最大值?

我正在尝试使用内核密度估计器(KDE)制作过滤器(以去除异常值和噪声)。我在我的 3D (d=3) 数据点中应用了 KDE,这给了我概率密度函数 (PDF) f(x)。现在我们知道密度估计的局部最大值 f(x) 定义了数据点集群的中心。所以我的想法是定义合适的 f(x) 来确定这些集群。

我的问题是如何以及哪种方法更适合于在 f(x) 中找到局部最大值的这个目的。如果有人可以为我提供一些示例代码/想法,我将非常感激。

这是查找在 3D 数据中给出 f(x) 的 KDE 的代码。

import numpy as np
from scipy import stats

data = np.array([[1, 4, 3], [2, .6, 1.2], [2, 1, 1.2],
         [2, 0.5, 1.4], [5, .5, 0], [0, 0, 0],
         [1, 4, 3], [5, .5, 0], [2, .5, 1.2]])
data = data.T 
kde = stats.gaussian_kde(data)
minima = data.T.min(axis=0)
maxima = data.T.max(axis=0)
space = [np.linspace(mini,maxi,20) for mini, maxi in zip(minima,maxima)]
grid = …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis machine-learning kernel-density

6
推荐指数
2
解决办法
5360
查看次数

在WxPython面板中嵌入Seaborn图

我想问一下如何在wxPython面板中嵌入一​​个海盗形象.

与这篇文章类似,我想在wxPython面板中嵌入一​​个外部数字.wxPython根据Seaborn的kdeplot函数,我希望GUI 的特定面板根据高斯内核的带宽值绘制数据的密度轮廓,以及数据点的散点图.以下是我希望在面板中绘制的示例:例

到目前为止,我已经设法从一个单独的图中得到我想要的wxPython面板.是否有可能在一个wxPython面板中嵌入一​​个seaborn情节或者应该找到另一种方法来实现我想要的东西?

下面是我的代码的特定部分,在需要时生成绘图:

import seaborn as sns
import numpy as np

fig = self._view_frame.figure

data = np.loadtxt(r'data.csv',delimiter=',')
ax = fig.add_subplot(111)
ax.cla()
sns.kdeplot(data, bw=10, kernel='gau',  cmap="Reds")
ax.scatter(data[:,0],data[:,1], color='r')

fig.canvas.draw()
Run Code Online (Sandbox Code Playgroud)

这部分代码在wxPython面板中绘制了散乱的数据点,并为密度轮廓创建了一个外部图形.但是,如果我尝试ax.sns.kdeplot(...)我得到错误

属性错误:AxesSubplot对象没有属性.sns

我不知道我是否可以在wxPython面板中嵌入Seaborn人物,或者我应该尝试以另一种方式实现它.有什么建议?

提前致谢.

python wxpython matplotlib kernel-density seaborn

6
推荐指数
1
解决办法
964
查看次数

Seaborn 中小提琴图的范围不准确

由于某些原因,绘图的范围不准确。在我的数据中没有负值。

在此输入图像描述

当我将范围设置为 -100 到 100 时,分布的某些部分低于 0 标记。

在此输入图像描述

python matplotlib kernel-density seaborn violin-plot

6
推荐指数
1
解决办法
1698
查看次数

使用 R 将四次核热图转换为大多边形

我有欧胡岛海岸附近的点数据。其他人使用这些相同的数据创建了一个大的polygon. 我相信他首先创建了heatmap一个quartic (biweight) kernel,每个点周围半径为 1 公里,像素大小可能为 1 平方公里。他引用了 Silverman(1986 年,第 76 页,方程 4.5,我认为它指的是“统计和数据分析的密度估计”一书)。我相信他将他heatmappolygon. 我正在尝试polygon使用R和用假数据来近似他Windows 10。我可以使用包中的kde函数来接近ks(见下图)。但该软件包仅包含Gaussian kernels. 是否可以polygon使用 a创建类似的quartic kernel

在此处输入图片说明

另一个分析实际上创建了两个版本的polygon. 一个边界被标记为“> 1 每公里密度”;另一个边界被标记为“> 0.5 每公里密度”。我不知道他是否使用RQGISArcGIS或别的东西。我无法创建一个大polygonQGIS,也没有ArcGIS.

感谢您对如何创建任何建议,polygon类似所示的一个,但使用quartic kernel的替代Gaussian kernel。如果我能提供更多信息,请告诉我。

这是我的虚假数据的链接CSVQGIS格式:在此处输入链接描述 …

r polygon heatmap kernel-density density-plot

6
推荐指数
1
解决办法
136
查看次数

使用 scipy 的 gaussian_kde 和 sklearn 的 KernelDensity 进行核密度估计会导致不同的结果

我从两个叠加的正态分布创建了一些数据,然后应用sklearn.neighbors.KernelDensityscipy.stats.gaussian_kde来估计密度函数。然而,使用相同的带宽 (1.0) 和相同的内核,两种方法都会产生不同的结果。有人可以向我解释一下原因吗?感谢帮助。

您可以在下面找到重现该问题的代码:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
import seaborn as sns
from sklearn.neighbors import KernelDensity

n = 10000
dist_frac = 0.1
x1 = np.random.normal(-5,2,int(n*dist_frac))
x2 = np.random.normal(5,3,int(n*(1-dist_frac)))
x = np.concatenate((x1,x2))
np.random.shuffle(x)
eval_points = np.linspace(np.min(x), np.max(x))

kde_sk = KernelDensity(bandwidth=1.0, kernel='gaussian')
kde_sk.fit(x.reshape([-1,1]))
y_sk = np.exp(kde_sk.score_samples(eval_points.reshape(-1,1)))

kde_sp = gaussian_kde(x, bw_method=1.0)
y_sp = kde_sp.pdf(eval_points)

sns.kdeplot(x)
plt.plot(eval_points, y_sk)
plt.plot(eval_points, y_sp)
plt.legend(['seaborn','scikit','scipy'])
Run Code Online (Sandbox Code Playgroud)

scipy 和 scikit 的 bandwith=1.0

如果我将 scipy bandwith 更改为 0.25,则两种方法的结果看起来大致相同。

scipy 带宽=0.25 和 scikit 带宽=1.0

python scipy kernel-density scikit-learn probability-density

6
推荐指数
1
解决办法
1万
查看次数

在python中实现基于FFT的基于FFT的核密度估计器,并将其与SciPy实现进行比较

我需要代码来做二维核密度估计(KDE),我发现SciPy实现太慢了.所以,我已经编写了一个基于FFT的实现,但有些事情让我很困惑.(FFT实现还强制执行周期性边界条件,这就是我想要的.)

该实现基于从样本创建简单的直方图,然后使用高斯进行卷积.这是执行此操作的代码,并将其与SciPy结果进行比较.

from numpy import *
from scipy.stats import *
from numpy.fft import *
from matplotlib.pyplot import *
from time import clock

ion()

#PARAMETERS
N   = 512   #number of histogram bins; want 2^n for maximum FFT speed?
nSamp   = 1000  #number of samples if using the ranom variable
h   = 0.1   #width of gaussian
wh  = 1.0   #width and height of square domain

#VARIABLES FROM PARAMETERS
rv  = uniform(loc=-wh,scale=2*wh)   #random variable that can generate samples
xyBnds  = linspace(-1.0, 1.0, N+1) …
Run Code Online (Sandbox Code Playgroud)

python numpy fft scipy kernel-density

5
推荐指数
1
解决办法
1911
查看次数

如何将曲线拟合到直方图

我已经探索了有关该主题的类似问题,但是在直方图上生成漂亮曲线时遇到了一些麻烦。我知道有些人可能会认为这是重复的,但我目前还没有找到任何可以帮助解决我的问题的东西。

虽然数据在这里不可见,但这里有一些我正在使用的变量,以便您可以在下面的代码中看到它们代表什么。

Differences <- subset(Score_Differences, select = Difference, drop = T)
m = mean(Differences)
std = sqrt(var(Differences))
Run Code Online (Sandbox Code Playgroud)

这是我生成的第一条曲线(代码似乎最常见且易于生成,但曲线本身不太适合)。

hist(Differences, density = 15, breaks = 15, probability = TRUE, xlab = "Score Differences", ylim = c(0,.1), main = "Normal Curve for Score Differences")
curve(dnorm(x,m,std),col = "Red", lwd = 2, add = TRUE)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我真的很喜欢这个,但不喜欢曲线进入负区域。

hist(Differences, probability = TRUE)
lines(density(Differences), col = "Red", lwd = 2)
lines(density(Differences, adjust = 2), lwd = 2, col = "Blue")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是与第一个相同的直方图,但具有频率。看起来还是没那么好看。

h = hist(Differences, density = 15, …
Run Code Online (Sandbox Code Playgroud)

r histogram curve-fitting kernel-density density-plot

5
推荐指数
1
解决办法
6650
查看次数

rpy2 传递 python 保留关键字参数

我试图通过 python 使用 r 的密度函数,并且必须将“from”、“to”参数传递给密度函数。然而,由于“from”这个词是Python中的保留关键字,我该如何实现这一点呢?谢谢。这是到目前为止的代码。

r_density=robjects.r('density')
f_a = robject.FloatVector(a)
r_a = r_density(f_a, bw='SJ', n=1024) ## Here I need to add 'from' and 'to' arguments
Run Code Online (Sandbox Code Playgroud)

python r rpy2 kernel-density

5
推荐指数
1
解决办法
761
查看次数

获取 Seaborn 联合图的最大密度坐标

给出以下示例脚本:

import seaborn as sns
import pandas as pd
import numpy as np
# Generate some random multivariate data
x, y = np.random.RandomState(8).multivariate_normal([0, 0], [(1, 0), (0, 1)], 1000).T
# Add to a dataframe
df = pd.DataFrame({"x":x,"y":y})
# Plot
p = sns.jointplot(data=df,x='x', y='y',kind='kde')
Run Code Online (Sandbox Code Playgroud)

...给出以下情节:

在此输入图像描述

我如何找到 x 轴和 y 轴上密度最大的位置?

我想注释中心图最密集的区域,并花了一段时间搜索每个图的属性,但似乎没有什么突出的。我认为这可能就像获取顶部 KDE 图的最大 y 轴值和右侧 KDE 图的最大 x 轴值一样简单,但到目前为止还不容易找到。

python kernel-density seaborn

5
推荐指数
0
解决办法
459
查看次数