x = np.array([1, 3, 7, 11])
print(np.quantile(x, 0.75))
print(np.quantile(x, 0.25))
8.0
2.5
我如何获得这些答案?我究竟做错了什么?我是不是真的很傻?或者q1和q3是9和2?
您在做错的是没有阅读文档。默认插值为linear
; 你似乎在期待midpoint
。
x = np.array([1, 3, 7, 11])
print(np.quantile(x, 0.75, interpolation="midpoint"))
print(np.quantile(x, 0.25, interpolation="midpoint"))
输出:
9.0
2.0
在最初的尝试中,您使用了默认的“线性”插值,该插值使用了由两个最近点表示的范围的分数。我花了大约一个小时研究这个分数。NumPy文档说:
线性:i +(j-i)*分数,其中分数是被i和j包围的索引的分数部分。
该术语index
未在此页面上定义,我也无法通过一些相关方法在其他地方找到它。我在此答案中首次发布的假设是错误的-现在已删除。我最终放弃了,并尝试通过计算index
as的值对概念进行逆向工程(j - i) / fraction
:
print(f'{" q":3} {" val":4} {" i":3} {"j":3} {"frac"} {"index"}')
x = np.array([0, 1, 3, 6, 10])
lo = [0, 0, 0, 1, 1, 3, 3, 3, 6, 6, 10]
hi = [0, 1, 1, 3, 3, 3, 6, 6, 10, 10, 10]
for q in range(0, 11):
interp = np.quantile(x, q/10)
i, j = lo[q], hi[q]
fraction = 0 if i == j else (interp - i) / (j - i)
index = 0 if i == j else (j - i) / fraction
print(f'{round(q/10, 1):3} {round(interp, 1):4} {i:2} {j:2} {round(fraction, 1):<3} {round(index, 2):6.2f}')
输出:
q val i j frac index
0.0 0.0 0 0 0 0.00 # i == j
0.1 0.4 0 1 0.4 2.50
0.2 0.8 0 1 0.8 1.25
0.3 1.4 1 3 0.2 10.00
0.4 2.2 1 3 0.6 3.33
0.5 3.0 3 3 0 0.00 # i == j
0.6 4.2 3 6 0.4 7.50
0.7 5.4 3 6 0.8 3.75
0.8 6.8 6 10 0.2 20.00
0.9 8.4 6 10 0.6 6.67
1.0 10.0 10 10 0 0.00 # i == j
在这一点上,我不知所措来解释“分数”概念。我确实知道,这是一种统计学上的尝试,它是对分位数值进行最佳估计的方法,假设会x
从相同的基础(和未知)分布中将更多的观察结果添加到集合中。
如果有人发现我的计算错误,或者可以任何方式阐明这一点,请编辑此答案,评论等。我今天距离我的理解范围还有很长的路要走。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句