最近遇到了關於如何找到給定數字流的第x百分位數的問題。如果數據流相對較小(可以存儲到內存中,排序並且可以找到第x個值),我對此有基本的瞭解,但是我想知道如果數字流相當公平,百分比是如何近似的數量衆多,數量未知。如何近似未知數量的第x百分位數
1
A
回答
0
我認爲你可以使用Reservoir sampling選擇從流S
均勻k
的元素,然後近似的S
第x百分位與這些k
號碼的第x個百分點。 k
取決於您有多少內存以及近似值應該如何精確。
EDIT
下面是一個代碼示例來測試溶液:
// create random stream of numbers
Random random = new Random(0);
List<Integer> stream = new ArrayList<Integer>();
for (int i = 0; i < 100000; ++i) {
stream.add((int) (random.nextGaussian() * 100 + 30));
}
// get approximate percentile
int k = 1000; // sample size
int x = 50; // percentile
// init priority queue for sampling
TreeMap<Double, Integer> queue = new TreeMap<Double, Integer>();
// sample k elements from stream
for (int val : stream) {
queue.put(random.nextDouble(), val);
if (queue.size() > k) {
queue.pollFirstEntry();
}
}
// get xth percentile from k samples
List<Integer> sample = new ArrayList<Integer>(queue.values());
Collections.sort(sample);
int approxPercent = sample.get(sample.size() * x/100);
System.out.println("Approximate percentile: " + approxPercent);
// get real value of the xth percentile
Collections.sort(stream);
int percent = stream.get(stream.size() * x/100);
System.out.println("Real percentile: " + percent);
結果是:
近似百分位數:29
再人位數:29
我得到了一個很好的近似每x
我所用,目前我不明白爲什麼它不適合你的情況。
+0
因此,我目前正在嘗試使用存儲到數組列表中的選定元素進行油藏採樣。但是,似乎這個近似值與期望的第x百分位差距仍然很遠。所以,我想知道數據結構的變化是否可能會進一步優化呢?此外,流元素是響應時間等,儘管某些響應時間可能不符合順序;他們通常是有點排序的順序,並且可能會丟棄太亂的響應。知道這一點,是否有一個不同的採樣算法,這樣會更好? – Bruce
+0
@布魯斯,我已經添加了一個代碼示例的答案。目前我看不出爲什麼這個近似不適合你。也許你可以提供一個流的例子? –
相關問題
- 1. 如何分別獲得第95和第5百分位數?
- 2. 2^x的數值近似
- 3. 如何衡量百分比與數量?
- 4. 如何用R總結得到第n百分位數?
- 5. 如何用SQLite查找第N百分位數?
- 6. 如何在x軸上繪製一個變量的百分位數圖,並根據y軸上的百分位數繪製另一個數值的平均值?
- 7. python中的百分位數
- 8. 在數據框中計算第90個百分位數的列
- 9. 如何計算android中最接近的百位數?
- 10. 如何獲得未知系統的傳遞函數(近似值)在MATLAB/SIMULINK?
- 11. ggplot2 boxplot與幾何平均數,以及第90和第10百分位數
- 12. 在R中的折線圖上添加第1 /第3四分位數和第90百分位數
- 13. 如何從MatLab上的無理數產生近似分數?
- 14. 八度分位數和百分位
- 15. 如何在Prometheus中使用百分位數衡量HTTP延遲
- 16. 如何在直方圖中找到第5和第95百分位數
- 17. HighStock數據分組近似函數
- 18. 百分位數計算器
- 19. 百分位數計算
- 20. 百分位數計算
- 21. 獲取第一行的UITableView,其中第一部分的未知數量的空
- 22. 如何計算R或Excel中分組變量的第95百分位值
- 23. 如何將一個整數舍入到近百位?
- 24. 使用固定數量的內存計算百分位數
- 25. SQL Server 2008中的中位數和第95百分位數? - NHS報告要求
- 26. 如何分配對應於輸入參數的未知數量的變量
- 27. Python的熊貓 - 如何25百分位數由描述函數
- 28. 如何計算各種百分位數的計數(*)
- 29. 如何更改內置Matlab boxplot函數的百分位數值?
- 30. 計算澳第90百分位數(n)的時間
我不認爲你可以做這個沒有存儲數字(不一定在內存中)。 – Henry
你知道這些值的粗略分佈嗎?還是硬性限制? –
不,沒有明確的數字分佈範圍之外的值的分佈。這些值基本上是服務器的響應時間,因此已經聲明某些響應時間可能會出現輕微亂序(但可能會丟棄太亂的響應)。 – Bruce