我需要在电子表格中返回仅某个类别的中位数.以下示例
Airline 5
Auto 20
Auto 3
Bike 12
Airline 12
Airline 39
Run Code Online (Sandbox Code Playgroud)
等.
如何编写公式只返回航空公司类别的中位数值.与平均值相似,仅适用于中位数.我无法重新安排价值观.谢谢!
使用Apache Commons Math,如何从一系列数字中获得中位数?
在下议院数学用户指南说DescriptiveStatistics支持位,但在用于描述统计学JavaDoc中没有提到这一点.确实提到几何平均值,这和中位数是一样的吗?
我确实看到了getPercentile(double).是getPercentile(50)一样的中位数?
关于此答案,是否存在一种快速方法来计算具有不等数量元素的组的数组的中值?
例如:
data = [1.00, 1.05, 1.30, 1.20, 1.06, 1.54, 1.33, 1.87, 1.67, ... ]
index = [0, 0, 1, 1, 1, 1, 2, 3, 3, ... ]
Run Code Online (Sandbox Code Playgroud)
然后,我想计算数量和每组中位数之间的差(例如,组的中位数0为1.025,则第一个结果为1.00 - 1.025 = -0.025)。因此,对于上面的数组,结果将显示为:
result = [-0.025, 0.025, 0.05, -0.05, -0.19, 0.29, 0.00, 0.10, -0.10, ...]
Run Code Online (Sandbox Code Playgroud)
既然np.median.reduceat还不存在,还有另一种快速的方法来实现这一目标吗?我的数组将包含数百万行,因此速度至关重要!
可以假定索引是连续且有序的(如果不是,则很容易对其进行转换)。
import numpy as np
np.random.seed(0)
rows = 10000
cols = 500
ngroup = 100
# Create random data and groups …Run Code Online (Sandbox Code Playgroud) 给定一系列数据(可能有重复数据),固定大小的移动窗口,从数据序列的开始每次迭代移动窗口,以便(1)从窗口中移除最旧的数据元素并且新的数据元素被推入窗口(2)在每次移动时找到窗口内数据的中值.
以下帖子没有帮助.
我的想法:
使用2堆来保持中位数.在窗口旁边,在第一次迭代中对窗口中的数据进行排序,最小堆保存较大的部分,最大堆保存较小的部分.如果窗口具有奇数个数据,则最大堆返回中值,否则两个堆的顶部元素的算术平均值是中值.
将新数据推入窗口时,从其中一个堆中删除最旧的数据,并将新数据与max和min堆的顶部进行比较,以便确定要将数据放入哪个堆.然后,找到中间值就像在第一次迭代中一样.
但是,如何在堆中查找数据元素是一个问题.堆是二叉树而不是二叉搜索树.
是否有可能用O(n)或O(n*lg m)求解它,其中m是窗口大小和空间:O(1)?
任何帮助都非常感谢.
谢谢
我正在寻找一种 RAM 有效的方法来在 data.table 的帮助下计算补集的中位数。
对于来自不同组的一组观察结果,我对“其他组”的中位数的实现感兴趣。即,如果一个 data.table 有一个值列和一个分组列,我想为每个组计算除当前组之外的所有其他组中值的中位数。例如,对于第 1 组,我们计算除属于第 1 组的值以外的所有值的中位数,依此类推。
一个具体的例子 data.table
dt <- data.table(value = c(1,2,3,4,5), groupId = c(1,1,2,2,2))
dt
# value groupId
# 1: 1 1
# 2: 2 1
# 3: 3 2
# 4: 4 2
# 5: 5 2
Run Code Online (Sandbox Code Playgroud)
我希望将medianOfAllTheOtherGroups 定义为第2 组的1.5 并定义第1 组的4,对同一data.table 中的每个条目重复:
dt <- data.table(value = c(1,2,3,4,5), groupId = c(1,1,2,2,2), medianOfAllTheOtherGroups = c(4, 4, 1.5, 1.5, 1.5))
dt
# value groupId medianOfAllTheOtherGroups …Run Code Online (Sandbox Code Playgroud) 在我们的日志文件中,我们存储请求的响应时间.计算中间响应时间的最有效方法是什么,"75/90/95%的请求是在少于N个时间内提供的"数字等?(我想我的问题的一个变体是:计算一串数字流的中位数和标准差的最佳方法是什么).
我想出的最好的只是阅读所有数字,订购它们然后挑出数字,但这看起来真的很傻.是不是有更聪明的方法?
我们使用Perl,但任何语言的解决方案都可能有所帮助.
我正在研究一种基于Select算法的快速变量实现,用于选择一个好的枢轴元素.传统智慧似乎是将数组划分为5个元素块,取每个元素的中位数,然后递归地将相同的阻塞方法应用于得到的中位数以获得"中位数中位数".
令我困惑的是选择5元素块而不是3元素块.对于5元素块,在我看来,你执行n/4 = n/5 + n/25 + n/125 + n/625 + ...5个中值运算,而对于3个元素块,你执行n/2 = n/3 + n/9 + n/27 + n/81 + ...3个中值运算.由于每个5的中位数是6个比较,并且每个中位数3是2个比较,这导致3*n/2使用5的n中位数和使用3的中位数进行比较.
任何人都可以解释这种差异,使用5元素块的动机是什么?我不熟悉应用这些算法的常规做法,所以也许你可以通过某种方式减少一些步骤,并且仍然能够"足够接近"中位数以确保良好的转向,并且这种方法可以更好地使用5元素块?
我的问题是参考此链接的方法2 .这里给出了两个相等长度的排序数组,我们必须找到合并的两个数组的中位数.
Algorithm:
1) Calculate the medians m1 and m2 of the input arrays ar1[]
and ar2[] respectively.
2) If m1 and m2 both are equal then we are done.
return m1 (or m2)
3) If m1 is greater than m2, then median is present in one
of the below two subarrays.
a) From first element of ar1 to m1 (ar1[0...|_n/2_|])
b) From m2 to last element of ar2 (ar2[|_n/2_|...n-1])
4) If m2 is greater than m1, then …Run Code Online (Sandbox Code Playgroud) 我试图了解分布式计算,并遇到了一个查找大量数字中位数的问题:
假设我们有一大组数字(假设元素数量是N*K),它们不能适合内存(大小为N).我们如何找到这些数据的中位数?假设在存储器上执行的操作是独立的,即我们可以认为每个K机器最多可以处理N个元素.
我认为中位数的中位数可用于此目的.我们可以一次将N个数字加载到内存中.我们O(logN)及时找到该集合的中位数并保存.
然后我们保存所有这些K中位数并找出中位数的中位数.此外O(logK),到目前为止,复杂性一直是O(K*logN + logK).
但这个中位数的中位数只是一个近似的中位数.我认为将它用作获得最佳案例性能的支点是最佳的,但为此我们需要将所有N*K数字拟合到内存中.
现在我们有一个很好的近似支点,我们怎样才能找到集合的实际中位数?
我想绘制一个水平小平面线与该方面的总体中位数.
我尝试了这种方法,但没有使用以下代码创建虚拟汇总表:
require(ggplot2)
dt = data.frame(gr = rep(1:2, each = 500),
id = rep(1:5, 2, each = 100),
y = c(rnorm(500, mean = 0, sd = 1), rnorm(500, mean = 1, sd = 2)))
ggplot(dt, aes(x = as.factor(id), y = y)) +
geom_boxplot() +
facet_wrap(~ gr) +
geom_hline(aes(yintercept = median(y), group = gr), colour = 'red')
Run Code Online (Sandbox Code Playgroud)
过去,建议使用解决方案
geom_line(stat = "hline", yintercept = "median")
Run Code Online (Sandbox Code Playgroud)
但它已经停止(产生错误"没有名为StatHline的统计数据").
另一个解决方案建
geom_errorbar(aes(ymax=..y.., ymin=..y.., y = mean))
Run Code Online (Sandbox Code Playgroud)
但它产生了
Error in data.frame(y = function …Run Code Online (Sandbox Code Playgroud) median ×10
algorithm ×4
r ×2
c++ ×1
data.table ×1
excel ×1
facet ×1
function ×1
ggplot2 ×1
if-statement ×1
java ×1
logging ×1
math ×1
merge ×1
numpy ×1
numpy-ufunc ×1
optimization ×1
performance ×1
perl ×1
python ×1
quicksort ×1
ram ×1
sorting ×1
statistics ×1