gpt4 book ai didi

c# - 使用 LINQ 计算百分位数

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

全部,

在回顾了 StackOverflow 和更广泛的互联网之后,我仍在努力使用 LINQ 来高效计算百分位数。

其中 percentile是统计中使用的一种度量,表示一组观察值中给定百分比的观察值低于该值。下面的示例尝试将值列表转换为数组,其中每个(唯一)值都用关联的百分位数表示。列表的 min() 和 max() 必然是返回数组百分位数的 0% 和 100%。

使用 LINQPad , 下面的代码生成所需的输出 VP[]:

enter image description here

这可以解释为: - 在 0% 时,最小值为 1 - 在 100% 时,最大值为 3 - 在最小值和最大值之间的 50% 处,值为 2

void Main()
{
var list = new List<double> {1,2,3};
double denominator = list.Count - 1;
var answer = list.Select(x => new VP
{
Value = x,
Percentile = list.Count(y => x > y) / denominator
})
//.GroupBy(grp => grp.Value) --> commented out until attempted duplicate solution
.ToArray();
answer.Dump();
}

public struct VP
{
public double Value;
public double Percentile;
}

但是,当“列表”包含重复条目(例如 1,2,**2,**3)时,这将返回不正确的 VP[]:

enter image description here

我尝试按列表中的唯一值进行分组(通过包含“.GroupBy(grp => grp.Value)”)未能产生所需的结果(值 =2,& Percentile = 0.666):

enter image description here

欢迎所有建议。包括考虑到“list.Count(y => x > y)”的重复迭代,这是否是一种有效的方法。

一如既往,谢谢香农

最佳答案

我不确定我是否理解这个问题的要求。当我运行接受的答案代码时,我得到了这个结果:

original result

但是如果我将输入更改为:

var dataSet = new List<double> { 1, 1, 1, 1, 2, 3, 3, 3, 2 };

...然后我得到这个结果:

updated result

随着“列表的 min() 和 max() 必然是返回数组百分位数的 0% 和 100%。”在我看来,OP 要求值从 0 到 1,但更新后的结果超出了 1。

第一个值应该为 0% 对我来说似乎也是错误的,因为我不确定这在数据上下文中意味着什么。

阅读链接的维基百科页面后,OP 似乎实际上是在尝试进行反向计算以计算百分位值。事实上,文章说 0 的百分位数是未定义的。这是有道理的,因为百分位数 0 将是空值集 - 空集的最大值是多少?

OP 似乎是根据值计算百分位数。因此,从这个意义上说,并且知道 0 是未定义的,似乎最适合计算的值是等于或低于集合中每个不同值的值的百分比。

现在,如果我使用 Microsoft 的 Reactive Framework Team 的交互式扩展(NuGet“Ix-Main”),那么我可以运行此代码:

var dataSet = new List<double> { 1, 1, 1, 1, 2, 3, 3, 3, 2 };

var result =
dataSet
.GroupBy(x => x)
.Scan(
new VP()
{
Value = double.MinValue, Proportion = 0.0
},
(a, x) =>
new VP()
{
Value = x.Key,
Proportion = a.Proportion + (double)x.Count() / dataSet.Count
});

我得到这个结果:

result

这告诉我大约 44% 的值是 1;大约 67% 的值是 1 或 2;并且 100% 的值是 1、2 或 3。

在我看来,这是对需求最合乎逻辑的计算。

关于c# - 使用 LINQ 计算百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27682779/

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