C# 如何计算双精度[]列表中每个双精度的总体标准偏差?
我有一个双数组列表,例如:C# 如何计算双精度[]列表中每个双精度的总体标准偏差?,c#,linq,standard-deviation,C#,Linq,Standard Deviation,我有一个双数组列表,例如:list ys 它们都包含xy图中的y值。我想计算x的所有点的总体标准偏差,本质上是每个数组中的每个元素的总体标准偏差。例如: 取每个数组的第一个元素,计算总体标准偏差,将值放入新数组。移动到列表中所有数组中的下一个元素,计算总体标准偏差并放入新创建的数组。等等,直到我们到达所有阵列的末尾 我是否可以在不使用linq或类似工具的嵌套for循环的情况下快速实现这一点 示例输入ys={[1,2,3,4,5],[10,20,30,40,50],[100200300400500
list ys
它们都包含xy图中的y值。我想计算x的所有点的总体标准偏差,本质上是每个数组中的每个元素的总体标准偏差。例如:
取每个数组的第一个元素,计算总体标准偏差,将值放入新数组。移动到列表中所有数组中的下一个元素,计算总体标准偏差并放入新创建的数组。等等,直到我们到达所有阵列的末尾
我是否可以在不使用linq或类似工具的嵌套for循环的情况下快速实现这一点
示例输入ys={[1,2,3,4,5],[10,20,30,40,50],[100200300400500]}
输出:double[]=[44.69899328、89.39798655、134.0969798178.7959731223.4949664]
44.69899328
来自:1,10100
89.39798655
来自:2200
134.0969798
来自:33000
178.7959731
来自:44000
223.4949664
来自:55000
尝试以下内容:
static void Main(string[] args)
{
List<Double[]> ys = new List<double[]>() { new double[] { 1, 2, 3, 4, 5 }, new double[] { 10, 20, 30, 40, 50 }, new double[] { 100, 200, 300, 400, 500 } };
double[] results = ys.SelectMany(x => x.Select((y,i) => new {y = y, i = i})).GroupBy(x => x.i).Select(x => StandardDeviation(x.Select(y => y.y).ToArray())).ToArray();
}
static double StandardDeviation(double[] input)
{
double average = input.Average();
double sumOfSquares = input.Select(x => (average - x) * (average - x)).Sum();
return Math.Sqrt(sumOfSquares / input.Length);
}
static void Main(字符串[]args)
{
List ys=new List(){new double[]{1,2,3,4,5},new double[]{10,20,30,40,50},new double[]{100,200,300,400,500};
double[]results=ys.SelectMany(x=>x.Select((y,i)=>new{y=y,i=i})).GroupBy(x=>x.i).Select(x=>standarddiation(x.Select(y=>y.y).ToArray()).ToArray();
}
静态双标准偏差(双[]输入)
{
双重平均=输入。平均();
double-sumOfSquares=input.Select(x=>(average-x)*(average-x)).Sum();
返回Math.Sqrt(sumOfSquares/input.Length);
}
尝试以下操作:
static void Main(string[] args)
{
List<Double[]> ys = new List<double[]>() { new double[] { 1, 2, 3, 4, 5 }, new double[] { 10, 20, 30, 40, 50 }, new double[] { 100, 200, 300, 400, 500 } };
double[] results = ys.SelectMany(x => x.Select((y,i) => new {y = y, i = i})).GroupBy(x => x.i).Select(x => StandardDeviation(x.Select(y => y.y).ToArray())).ToArray();
}
static double StandardDeviation(double[] input)
{
double average = input.Average();
double sumOfSquares = input.Select(x => (average - x) * (average - x)).Sum();
return Math.Sqrt(sumOfSquares / input.Length);
}
static void Main(字符串[]args)
{
List ys=new List(){new double[]{1,2,3,4,5},new double[]{10,20,30,40,50},new double[]{100,200,300,400,500};
double[]results=ys.SelectMany(x=>x.Select((y,i)=>new{y=y,i=i})).GroupBy(x=>x.i).Select(x=>standarddiation(x.Select(y=>y.y).ToArray()).ToArray();
}
静态双标准偏差(双[]输入)
{
双重平均=输入。平均();
double-sumOfSquares=input.Select(x=>(average-x)*(average-x)).Sum();
返回Math.Sqrt(sumOfSquares/input.Length);
}
我首先要定义一个扩展方法,它可以透视数据
public static class Extensions
{
public static IEnumerable<T[]> Pivot<T>(this List<T[]> items)
{
return items.SelectMany( arr => arr.Select( (x,i) => new{Value=x,Index = i}) )
.GroupBy(x => x.Index)
.Select(g => g.Select(x => x.Value).ToArray());
}
}
StDev
功能:
public static double StDev(double[] input)
{
double avg = input.Average();
double sum = input.Select(x => (avg - x) * (avg - x)).Sum();
return Math.Sqrt(sum / input.Length);
}
实例:首先,我将定义一个扩展方法,它可以透视数据
public static class Extensions
{
public static IEnumerable<T[]> Pivot<T>(this List<T[]> items)
{
return items.SelectMany( arr => arr.Select( (x,i) => new{Value=x,Index = i}) )
.GroupBy(x => x.Index)
.Select(g => g.Select(x => x.Value).ToArray());
}
}
StDev
功能:
public static double StDev(double[] input)
{
double avg = input.Average();
double sum = input.Select(x => (avg - x) * (avg - x)).Sum();
return Math.Sqrt(sum / input.Length);
}
实时示例:对于所有子阵列长度相同的数据,这可能是:
var stdDevs = Enumerable.Range(0, ys[0].Length)
.Select(i => ys.Select(y => y[i]))
.Select(StdDev);
最后一部分可以是。选择(Z=>new{Z,V=StdDev(Z)})代码>如果需要输入值
测试:
不同长度
如果子数组的长度不同,那么版本就不那么漂亮,但仍然可读
var stdDevs = Enumerable.Range(0, ys.Max( y => y.Length))
.Select(i => ys.Where( y => i < y.Length).Select(y => y[i]))
.Select(Z => new { Z, V = StdDev(Z) });
对于所有子阵列长度相同的数据,这可能是:
var stdDevs = Enumerable.Range(0, ys[0].Length)
.Select(i => ys.Select(y => y[i]))
.Select(StdDev);
最后一部分可以是。选择(Z=>new{Z,V=StdDev(Z)})代码>如果需要输入值
测试:
不同长度
如果子数组的长度不同,那么版本就不那么漂亮,但仍然可读
var stdDevs = Enumerable.Range(0, ys.Max( y => y.Length))
.Select(i => ys.Where( y => i < y.Length).Select(y => y[i]))
.Select(Z => new { Z, V = StdDev(Z) });
你能举个例子吗?例如,{[1,2,3],[15,20,40]}
的期望输出是什么?示例的输出是[7,9,18.5]@Fildor 7是样本的标准偏差:1,15。9是2,15的标准偏差。18.5是3的标准偏差,40@Fildor可能是因为您使用的是样本标准偏差。如果你使用总体标准差,这些就是你得到的数字。将数字插入你选择的标准偏差计算器:)我正在使用这个:哦哦,你用Dmitry的例子了吗??是的,对不起,算了吧。我的错。错过了你实际上是行动和回答Dmitry。。。哈哈,你能举个例子吗?例如,{[1,2,3],[15,20,40]}
的期望输出是什么?示例的输出是[7,9,18.5]@Fildor 7是样本的标准偏差:1,15。9是2,15的标准偏差。18.5是3的标准偏差,40@Fildor可能是因为您使用的是样本标准偏差。如果你使用总体标准差,这些就是你得到的数字。将数字插入你选择的标准偏差计算器:)我正在使用这个:哦哦,你用Dmitry的例子了吗??是的,对不起,算了吧。我的错。错过了你实际上是行动和回答Dmitry。。。hahaI相信你已经获得了每个数组的标准偏差。不完全是我需要的。因为我需要每个数组中每个元素的标准偏差。请看我在原帖中的例子。为了更好地反映我的问题,我对示例进行了修改。在您发表评论之前,我更新了代码。我稍微更新了代码,使其更简单。我相信您已经使用了每个数组的标准偏差。不完全是我需要的。因为我需要每个数组中每个元素的标准偏差。请看我在原帖中的例子。为了更好地反映我的问题,我对示例进行了修改。在您发表评论之前,我更新了代码。我稍微更新了代码,使之更简单。