首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算标准差

计算标准差
EN

Code Review用户
提问于 2015-02-16 22:58:28
回答 3查看 11.7K关注 0票数 12

我们在聊天中讨论了标准偏差,所以我决定编写一个标准偏差计算器:

代码语言:javascript
复制
static double PopulationStandardDeviation(List<double> numberSet)
{
    double mean = numberSet.Average();

    return Math.Sqrt(numberSet.Sum(x => Math.Pow(x - mean, 2)) / numberSet.Count);
}

static double SampleStandardDeviation(List<double> numberSet)
{
    double mean = numberSet.Sum() / numberSet.Count;

    return Math.Sqrt(numberSet.Sum(x => Math.Pow(x - mean, 2)) / (numberSet.Count - 1));
}

如何改善这些情况呢?因为它们都是标准的Devation计算器,我应该将它们合并成一个带有static double StandardDeviation(List<double> numberSet, bool isSample)头的方法吗?它们是这个问题的最佳解决方案吗?

EN

回答 3

Code Review用户

回答已采纳

发布于 2015-02-17 07:04:16

有两种方法很好。因为@britishtea在一条评论中这么说的原因--我只想逐字引用它:

将布尔值作为参数并根据该值进行不同行为的方法不是一个方法,而是两个方法!你应该把他们分开。您可以使用共享功能实现coursec,但是您的公共API应该提供两种方法。()- @britishtea

事实上,.NET框架也是这样做的(参见StandardDeviation()StandardDeviationP(),谢谢@200_success)。

同时,当然不要重复自己。将公共逻辑提取到私有助手方法,然后根据私有方法重写公共方法:

代码语言:javascript
复制
private static double StandardDeviation(List<double> numberSet, double divisor)
{
    double mean = numberSet.Average();    
    return Math.Sqrt(numberSet.Sum(x => Math.Pow(x - mean, 2)) / divisor);
}

static double PopulationStandardDeviation(List<double> numberSet)
{
    return StandardDeviation(numberSet, numberSet.Count);
}

static double SampleStandardDeviation(List<double> numberSet)
{
    return StandardDeviation(numberSet, numberSet.Count - 1);
}

最后,参数名"numberSet“是一个用词不当的词,它指的是一个集合,而它实际上是一个列表。

票数 9
EN

Code Review用户

发布于 2015-02-16 23:09:51

双均值= numberSet.Average();双均值= numberSet.Sum() / numberSet.Count;

在这两种情况下,我都坚持使用numberSet.Average()

票数 5
EN

Code Review用户

发布于 2015-02-19 14:54:39

就性能而言,使用(x - mean) * (x - mean)而不是Math.Pow(x - mean, 2)

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/80714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档