【发布时间】:2020-09-07 05:57:11
【问题描述】:
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?
【问题讨论】:
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?
【问题讨论】:
您做错的不是阅读documentation。默认插值是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 的值计算为(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,来自相同的潜在(和未知)分布。
如果有人发现我的计算有误,或者可以以任何方式说明这一点,请编辑此答案、评论等。我今天离我的理解范围还有很长的路要走。
【讨论】:
midpoint,所以我不担心你的个人进步。
np.quantile的默认插值模式是linear (参见文档)。
您可以通过interpolation='midpoint'获得预期结果。
【讨论】: