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