标签: median

从整数流中查找运行中位数

可能重复:
C中的滚动中值算法

鉴于从数据流中读取整数.到目前为止,以有效的方式查找元素的中位数.

解决方案我已经读过:我们可以使用左侧的最大堆来表示小于有效中位数的元素,在右侧使用最小堆来表示大于有效中位数的元素.

在处理传入元素之后,堆中元素的数量最多相差1个元素.当两个堆包含相同数量的元素时,我们发现堆的根数据的平均值为有效中值.当堆不平衡时,我们从包含更多元素的堆的根中选择有效中值.

但是我们如何构建最大堆和最小堆,即我们如何知道这里的有效中位数呢?我认为我们会在max-heap中插入1个元素,然后在min-heap中插入下一个元素,依此类推所有元素.纠正我如果我错在这里.

algorithm heap median

219
推荐指数
7
解决办法
15万
查看次数

在SQL Server中计算中值的函数

根据MSDN,Median不能作为Transact-SQL中的聚合函数使用.但是,我想知道是否可以创建此功能(使用Create Aggregate函数,用户定义函数或其他方法).

这样做的最佳方式(如果可能) - 允许在聚合查询中计算中值(假设数值数据类型)?

sql sql-server aggregate-functions median

212
推荐指数
6
解决办法
40万
查看次数

用MySQL计算中值的简单方法

使用MySQL计算中值的最简单(并且希望不是太慢)的方法是什么?我已经习惯AVG(x)了找到平均值,但我很难找到一种计算中位数的简单方法.现在,我将所有行返回给PHP,进行排序,然后选择中间行,但肯定必须有一些简单的方法在单个MySQL查询中执行此操作.

示例数据:

id | val
--------
 1    4
 2    7
 3    2
 4    2
 5    9
 6    8
 7    3
Run Code Online (Sandbox Code Playgroud)

排序上val给出2 2 3 4 7 8 9的,所以中间应该是4,与SELECT AVG(val)这== 5.

mysql sql statistics median

191
推荐指数
12
解决办法
22万
查看次数

在Python中查找列表的中位数

你如何在Python中找到列表的中位数?该列表可以是任何大小,并且不保证数字具有任何特定顺序.

如果列表包含偶数个元素,则该函数应返回中间两个的平均值.

以下是一些示例(按显示目的排序):

median([1]) == 1
median([1, 1]) == 1
median([1, 1, 2, 4]) == 1.5
median([0, 2, 5, 6, 8, 9, 9]) == 6
median([0, 0, 0, 0, 4, 4, 6, 8]) == 2
Run Code Online (Sandbox Code Playgroud)

python sorting list median

160
推荐指数
11
解决办法
38万
查看次数

C中的滚动中值算法

我目前正致力于在C中实现滚动中值滤波器(类似于滚动均值滤波器)的算法.从我对文献的研究中,似乎有两种合理有效的方法.第一种是对值的初始窗口进行排序,然后执行二进制搜索以插入新值并在每次迭代时删除现有值.

第二个(来自Hardle和Steiger,1995,JRSS-C,算法296)构建了一个双端堆结构,一端是maxheap,另一端是minheap,中间是中间值.这产生线性时间算法而不是O(n log n).

这是我的问题:实现前者是可行的,但我需要在数百万个时间序列中运行它,因此效率很重要.后者证明非常难以实施.我在R的stats包的代码的Trunmed.c文件中找到了代码,但它是相当难以理解的.

有没有人知道线性时间滚动中值算法的编写良好的C实现?

修改:链接到Trunmed.c代码http://google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#mYw3h_Lb_e0/R-2.2.0/src/library/stats/src/Trunmed.c

c algorithm statistics r median

109
推荐指数
5
解决办法
4万
查看次数

用于估计统计中位数,模式,偏度,峰度的"在线"(迭代器)算法?

是否有算法来估计值集的中值,模式,偏度和/或峰度,但这不需要一次将所有值存储在内存中?

我想计算基本的统计数据:

  • 平均值:算术平均值
  • 方差:平均偏差的平均值
  • 标准差:方差的平方根
  • 中位数:将较大一半的数字与较小的一半分开的值
  • mode:在集合中找到最频繁的值
  • 偏斜:tl; 博士
  • 峰度:tl; 博士

计算任何这些的基本公式是小学算术,我知道它们.还有许多统计库可以实现它们.

我的问题是我正在处理的集合中的大量(数十亿)值:在Python中工作,我不能只使用数十亿个元素创建列表或哈希.即使我用C语言编写,十亿元素数组也不太实用.

数据未排序.它是由其他过程随机,即时生成的.每组的大小变化很大,并且不会提前知道大小.

我已经弄清楚如何很好地处理均值和方差,以任何顺序迭代集合中的每个值.(实际上,在我的情况下,我按照它们生成的顺序来看它们.)这是我正在使用的算法,礼貌http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm:

  • 初始化三个变量:count,sum和sum_of_squares
  • 对于每个值:
    • 增量计数.
    • 将值添加到sum.
    • 将值的平方添加到sum_of_squares.
  • 按计数除以总和,作为变量均值存储.
  • 将sum_of_squares除以count,存储为变量mean_of_squares.
  • 平方均值,存储为square_of_mean.
  • 从mean_of_squares中减去square_of_mean,存储为方差.
  • 输出均值和方差.

这种"在线"算法存在缺陷(例如,精度问题,因为sum_of_squares快速增长大于整数范围或浮点精度),但它基本上给了我所需要的,而不必存储每个集合中的每个值.

但我不知道是否存在类似的技术来估计额外的统计数据(中位数,模式,偏度,峰度).只要处理N值所需的内存远小于O(N),我就可以使用有偏差的估计器,或者甚至是在一定程度上损害精度的方法.

如果库具有"在线"计算这些操作中的一个或多个的功能,那么将我指向现有的统计库也会有所帮助.

algorithm statistics iterator median

84
推荐指数
4
解决办法
3万
查看次数

如何使用Spark查找中值和分位数

如何RDD使用分布式方法,IPython和Spark 找到整数的中位数?的RDD是约700 000元,因此过大,以收集和发现中位数.

这个问题与这个问题类似.但是,问题的答案是使用Scala,我不知道.

如何使用Apache Spark计算精确中位数?

使用Scala答案的思考,我试图在Python中编写类似的答案.

我知道我首先要排序RDD.我不知道怎么.我看到sortBy(按给定的方式对此RDD进行排序keyfunc)和sortByKey(对此进行排序RDD,假设它由(键,值)对组成.)方法.我认为两者都使用键值,而我RDD只有整数元素.

  1. 首先,我在考虑做什么myrdd.sortBy(lambda x: x)
  2. 接下来我将找到rdd(rdd.count())的长度.
  3. 最后,我想在rdd的中心找到元素或2个元素.我也需要这个方法的帮助.

编辑:

我有个主意.也许我可以索引我的RDD然后key = index和value = element.然后我可以尝试按价值排序?我不知道这是否可行,因为只有一种sortByKey方法.

python median apache-spark rdd pyspark

55
推荐指数
3
解决办法
6万
查看次数

如何使用堆找到线性时间内的数字中位数?

维基百科说:

选择算法:使用堆可以在线性时间内完成最小值,最大值,最小值和最大值,中值或甚至第k个最大元素的查找.

它说的只是它可以完成,而不是如何完成.

你能给我一些关于如何使用堆来完成这项工作的开始吗?

algorithm heap time-complexity median

50
推荐指数
1
解决办法
5万
查看次数

计算c#的中位数

我需要编写接受小数组数组的函数,它会找到中位数.

.net Math库中是否有函数?

.net c# algorithm median

49
推荐指数
6
解决办法
8万
查看次数

查找未排序数组的中位数

为了找到未排序数组的中位数,我们可以在O(nlogn)时间内为n个元素创建一个最小堆,然后我们可以逐个提取n/2个元素来获得中值.但这种方法需要O(nlogn)时间.

我们可以在O(n)时间内通过某种方法做同样的事情吗?如果可以的话,请告诉或建议一些方法.

algorithm heap median

46
推荐指数
4
解决办法
10万
查看次数