c# - 对列表中对象的属性使用 Math.NET 统计函数的最佳方法

标签 c# list math.net mathnet-numerics

我正在尝试找出快速执行计算的最佳方法,并想了解人们在这种情况下通常会采用哪种方法。

我有一个对象列表,这些对象具有我想要计算其均值和标准差的属性。我想用 this Math.NET 库可能会更容易/针对性能进行优化。

不幸的是,这些函数的输入参数是数组。编写自己的函数来计算均值和 STD 是我唯一的解决方案吗?我可以为使用 lambda 函数的列表编写某种扩展方法吗 here ?还是我最好编写返回我的对象​​属性数组的函数并将它们与 Math.NET 一起使用。

大概答案取决于某些因素,比如列表的大小?为了便于讨论,假设列表有 50 个元素。我关心的只是性能。

最佳答案

ArrayStatistics 确实需要数组,因为它针对这种特殊情况进行了优化(这就是它被称为 ArrayStatistics 的原因)。同样,StreamingStatistics 针对 IEnumerable 序列流进行了优化,无需将数据保存在内存中。 Statistics 类是适用于所有类型输入的通用类。

您是否已确认仅使用 LINQ 和 StreamingStatistics 在您的用例中速度不够快?为仅包含 50 个条目的列表计算这些统计数据几乎是不可测量的,除非您循环执行一百万次。

使用 Math.NET Numerics v3.0.0-alpha7 的示例,在列表中使用元组来模拟您的自定义类型:

using MathNet.Numerics.Statistics;

var data = new List<Tuple<string, double>>
{
    Tuple.Create("A", 1.0),
    Tuple.Create("B", 2.0),
    Tuple.Create("C", 1.5)
};

// using the normal extension methods within `Statistics`
var stdDev1 = data.Select(x => x.Item2).StandardDeviation();
var mean1 = data.Select(x => x.Item2).Mean();

// single pass variant (unfortunately there's no single pass MeanStdDev yet):
var meanVar2 = data.Select(x => x.Item2).MeanVariance();
var mean2 = meanVar2.Item1;
var stdDev2 = Math.Sqrt(meanVar2.Item2);

// directly using the `StreamingStatistics` class:
StreamingStatistics.MeanVariance(data.Select(x => x.Item2));

关于c# - 对列表中对象的属性使用 Math.NET 统计函数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22012737/

相关文章:

python - 每次运行时清除函数中的列表

python - 给定一组字母,如何创建一个单词与这些字母的所有可能组合,并用指定的数字重复?

vb.net - Math.Net 中是否有类似 linspace() 的方法

c# - MathNet- 'System.TypeInitializationException'

c# - json.net 将元素映射到集合

c# - 图像处理后得到错误的颜色

c# - 如何在c#中获取IOT集线器设备的最后事件时间

c# - 如何使用 Selenium WebDriver 和 c# 从 Telerik RadComboBox 中选择一个选项?

python - 在 Python 中反转列表的顺序

c# - 获取密集矩阵元素的最小值和最大值