Python R的nrd0是否有scipy/numpy替代方案?

Python R的nrd0是否有scipy/numpy替代方案?,python,r,numpy,scipy,Python,R,Numpy,Scipy,从 bw.nrd0实现了一个选择带宽的经验法则 高斯核密度估计器。它的默认值为0.9倍 标准偏差和四分位间距的最小值 以1.34倍的样本量为负五分之一次方= Silverman的“经验法则”,Silverman 1986,第48页,等式3.31 除非四分位数重合,否则将出现正结果 保证 在相当于np.arange1401的从1到400的数组中,nrd0将返回31.39367。当我尝试在python中实现类似的东西时 def nrd0_python(x): X = min(np.std(

bw.nrd0实现了一个选择带宽的经验法则 高斯核密度估计器。它的默认值为0.9倍 标准偏差和四分位间距的最小值 以1.34倍的样本量为负五分之一次方= Silverman的“经验法则”,Silverman 1986,第48页,等式3.31 除非四分位数重合,否则将出现正结果 保证

在相当于np.arange1401的从1到400的数组中,nrd0将返回31.39367。当我尝试在python中实现类似的东西时

def nrd0_python(x):

    X = min(np.std(x), np.percentile(x,25))

    top = 0.9*X
    bottom = 1.34*len(x)**(-0.2)

    return top/bottom
准确地说,我得到了200以上,224.282177628584555


silverman的经验法则中有任何已知的python函数吗?

如果您使用的是KDE,您可以只使用scipy.stats.kaussian_KDE吗?它实现了Silverman和Scott的带宽选择规则


英语句子中运算符的优先级不明确

下面是一个返回您期望的值的实现:

In [201]: x = np.arange(1, 401)

In [202]: 0.9*min(np.std(x, ddof=1), (np.percentile(x, 75) - np.percentile(x, 25))/1.349)*len(x)**(-0.2)
Out[202]: 31.393668650034652

我没有西尔弗曼的推荐信。我在p。21.

您没有正确的IQR计算:

import numpy

def bw_nrd0(x):

    if len(x) < 2:
        raise(Exception("need at least 2 data points"))

    hi = numpy.std(x, ddof=1)
    q75, q25 = numpy.percentile(x, [75 ,25])
    iqr = q75 - q25
    lo = min(hi, iqr/1.34)

    if not ((lo == hi) or (lo == abs(x[0])) or (lo == 1)):
        lo = 1

    return 0.9 * lo *len(x)**-0.2
与R代码一样,您可以将其缩短为:

lo = lo or hi or abs(x[0]) or 1

包括这些检查以及向量长度检查非常重要。

这是针对Nadaraya Watson平滑器的。我的理解是gaussian_kde返回随机变量的PDF。np。百分位数,25与四分位数范围不一样。啊,是的,我太傻了。谢谢,我很确定我对if从句的翻译是错误的,看。我看到你参与了那个问题。如何在Python中实现逻辑OR?我想我可以做一系列的if/elif。有没有一种更经济的方式类似R?很好。但是,要匹配R,对numpy.std的调用必须使用ddof=1:hi=numpy.stdx,ddof=1
if not lo:
    if hi:
        lo = hi
    elif abs(x[0]):
        lo = abs(x[0])
    else:
        lo = 1
lo = lo or hi or abs(x[0]) or 1