如果分别适当地选择每个函数中的和参数,则对给定数据集应用函数scipy.ndimage.filters.gaussian_filter和scipy.stats.gaussian_kde可以给出非常相似的结果.sigmabw_method
例如,我可以获取由以下曲线设定点的随机分布2D sigma=2.中gaussian_filter(左侧曲线)和bw_method=sigma/30.在gaussian_kde(右曲线):

(MWE位于问题的最底部)
这些参数之间显然存在关系,因为一个应用高斯滤波器而另一个应用高斯核密度估计器.
每个参数的定义是:
sigma:标量或标量序列高斯核的标准偏差.高斯滤波器的标准偏差是作为序列给出的每个轴,或者是单个数字,在这种情况下,它对所有轴都是相等的.
鉴于高斯算子的定义,我可以理解这个:

bw_method:bw_method:str,scalar或callable,optional用于计算估计器带宽的方法.这可以是'scott','silverman',标量常量或可调用.如果是标量,则将直接用作kde.factor.如果是可调用的,则应该将gaussian_kde实例作为唯一参数并返回标量.如果为None(默认值),则使用"scott".有关详细信息,请参阅注释
在这种情况下,让我们假设输入bw_method是一个标量(浮点数),以便与之相比较sigma.这是我迷路的地方,因为我无法在任何kde.factor地方找到有关此参数的信息.
我想知道的是连接这些参数的精确数学方程式(即:sigma和bw_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) 我正在尝试使用内核密度估计器(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) 我想问一下如何在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人物,或者我应该尝试以另一种方式实现它.有什么建议?
提前致谢.
我有欧胡岛海岸附近的点数据。其他人使用这些相同的数据创建了一个大的polygon. 我相信他首先创建了heatmap一个quartic (biweight) kernel,每个点周围半径为 1 公里,像素大小可能为 1 平方公里。他引用了 Silverman(1986 年,第 76 页,方程 4.5,我认为它指的是“统计和数据分析的密度估计”一书)。我相信他将他heatmap的polygon. 我正在尝试polygon使用R和用假数据来近似他Windows 10。我可以使用包中的kde函数来接近ks(见下图)。但该软件包仅包含Gaussian kernels. 是否可以polygon使用 a创建类似的quartic kernel?
另一个分析实际上创建了两个版本的polygon. 一个边界被标记为“> 1 每公里密度”;另一个边界被标记为“> 0.5 每公里密度”。我不知道他是否使用R,QGIS,ArcGIS或别的东西。我无法创建一个大polygon的QGIS,也没有ArcGIS.
感谢您对如何创建任何建议,polygon类似所示的一个,但使用quartic kernel的替代Gaussian kernel。如果我能提供更多信息,请告诉我。
这是我的虚假数据的链接CSV和QGIS格式:在此处输入链接描述 …
我从两个叠加的正态分布创建了一些数据,然后应用sklearn.neighbors.KernelDensity和scipy.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 bandwith 更改为 0.25,则两种方法的结果看起来大致相同。
python scipy kernel-density scikit-learn probability-density
我需要代码来做二维核密度估计(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) 我已经探索了有关该主题的类似问题,但是在直方图上生成漂亮曲线时遇到了一些麻烦。我知道有些人可能会认为这是重复的,但我目前还没有找到任何可以帮助解决我的问题的东西。
虽然数据在这里不可见,但这里有一些我正在使用的变量,以便您可以在下面的代码中看到它们代表什么。
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) 我试图通过 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) 给出以下示例脚本:
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 轴值一样简单,但到目前为止还不容易找到。
kernel-density ×10
python ×8
r ×3
scipy ×3
seaborn ×3
density-plot ×2
matplotlib ×2
fft ×1
filtering ×1
gaussian ×1
heatmap ×1
histogram ×1
numpy ×1
polygon ×1
rpy2 ×1
scikit-learn ×1
violin-plot ×1
wxpython ×1