gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:26 25 4
gpt4 key购买 nike

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

我有一个对象列表,这些对象具有我想要计算其均值和标准差的属性。我想用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com