是否有算法来估计值集的中值,模式,偏度和/或峰度,但这不需要一次将所有值存储在内存中?
我想计算基本的统计数据:
计算任何这些的基本公式是小学算术,我知道它们.还有许多统计库可以实现它们.
我的问题是我正在处理的集合中的大量(数十亿)值:在Python中工作,我不能只使用数十亿个元素创建列表或哈希.即使我用C语言编写,十亿元素数组也不太实用.
数据未排序.它是由其他过程随机,即时生成的.每组的大小变化很大,并且不会提前知道大小.
我已经弄清楚如何很好地处理均值和方差,以任何顺序迭代集合中的每个值.(实际上,在我的情况下,我按照它们生成的顺序来看它们.)这是我正在使用的算法,礼貌http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm:
这种"在线"算法存在缺陷(例如,精度问题,因为sum_of_squares快速增长大于整数范围或浮点精度),但它基本上给了我所需要的,而不必存储每个集合中的每个值.
但我不知道是否存在类似的技术来估计额外的统计数据(中位数,模式,偏度,峰度).只要处理N值所需的内存远小于O(N),我就可以使用有偏差的估计器,或者甚至是在一定程度上损害精度的方法.
如果库具有"在线"计算这些操作中的一个或多个的功能,那么将我指向现有的统计库也会有所帮助.
我有一系列数字列表,例如:
[0] (0.01, 0.01, 0.02, 0.04, 0.03)
[1] (0.00, 0.02, 0.02, 0.03, 0.02)
[2] (0.01, 0.02, 0.02, 0.03, 0.02)
...
[n] (0.01, 0.00, 0.01, 0.05, 0.03)
Run Code Online (Sandbox Code Playgroud)
我想要做的是有效地计算所有数组元素的列表的每个索引的平均值和标准差.
为了做到这一点,我一直循环遍历数组并将列表的给定索引处的值相加.最后,我将"平均值列表"中的每个值除以n.
为了做标准偏差,我再次循环,现在我已经计算了平均值.
我想避免两次通过阵列,一次为平均值,然后一次为SD(在我有一个意思之后).
是否有一种有效的方法来计算两个值,只通过一次数组?解释语言(例如Perl或Python)或伪代码中的任何代码都可以.
LINQ是否为聚合SQL函数STDDEV() (标准差)建模?
如果没有,那么计算它的最简单/最佳实践方法是什么?
例:
SELECT test_id, AVERAGE(result) avg, STDDEV(result) std
FROM tests
GROUP BY test_id
Run Code Online (Sandbox Code Playgroud) 我需要计算通用列表的标准偏差.我会尝试包含我的代码.它是一个包含数据的通用列表.数据主要是浮点数和整数.这是我的代码相对于它而没有深入细节:
namespace ValveTesterInterface
{
public class ValveDataResults
{
private List<ValveData> m_ValveResults;
public ValveDataResults()
{
if (m_ValveResults == null)
{
m_ValveResults = new List<ValveData>();
}
}
public void AddValveData(ValveData valve)
{
m_ValveResults.Add(valve);
}
Run Code Online (Sandbox Code Playgroud)
以下是需要计算标准偏差的函数:
public float LatchStdev()
{
float sumOfSqrs = 0;
float meanValue = 0;
foreach (ValveData value in m_ValveResults)
{
meanValue += value.LatchTime;
}
meanValue = (meanValue / m_ValveResults.Count) * 0.02f;
for (int i = 0; i <= m_ValveResults.Count; i++)
{
sumOfSqrs += Math.Pow((m_ValveResults - meanValue), 2);
}
return …Run Code Online (Sandbox Code Playgroud) 使用Python,假设我正在运行已知数量的项目I,并且能够计算处理每个项目所需的时间t,以及运行的总处理时间T和到目前为止处理的项目数c.我正在计算飞行中的平均值,A = T / c但这可能会因为单个项目需要非常长的时间来处理(几秒钟而不是几毫秒).
我想展示一个正在运行的标准偏差.如何在不记录每个记录的情况下这样做t?
我搜索过SQLite文档并找不到任何内容,但我也在谷歌上搜索了一些结果.
SQLite是否有任何内置的标准偏差功能?
我通常使用大量的模拟工作.有时,我需要计算粒子集的质心.我注意到在许多情况下,numpy.mean()返回的平均值是错误的.我可以弄清楚这是由于累加器的饱和.为了避免这个问题,我可以在小组粒子中将所有粒子的总和分开,但这是不舒服的.任何人都有如何以优雅的方式解决这个问题的想法?
只是为了提高你的好奇心,下面的例子产生类似于我在模拟中观察到的东西:
import numpy as np
a = np.ones((1024,1024), dtype=np.float32)*30504.00005
Run Code Online (Sandbox Code Playgroud)
如果你检查最大值和最小值,你得到:
a.max()
30504.0
a.min()
30504.0
Run Code Online (Sandbox Code Playgroud)
但是,平均值是:
a.mean()
30687.236328125
Run Code Online (Sandbox Code Playgroud)
你可以弄清楚这里出了什么问题.使用dtype = np.float64时不会发生这种情况,因此解决单精度问题应该不错.