有没有办法使用 Boost 计算包含样本的向量的均值和标准差?
或者我必须创建一个累加器并将向量输入其中?
发布于 2018-08-13 21:31:21
对 the answer by musiphil 进行了改进,您可以在没有临时向量 diff 的情况下编写标准差函数,只需使用一个带有C++11 lambda功能的 inner_product 调用:
diff
inner_product
double stddev(std::vector<double> const & func) double mean = std::accumulate(func.begin(), func.end(), 0.0) / func.size(); double sq_sum = std::inner_product(func.begin(), func.end(), func.begin(), 0.0, [](double const & x, double const & y) { return x + y; }, [mean](double const & x, double const & y) { return (x - mean)*(y - mean); }); return std::sqrt(sq_sum / func.size()); }
我怀疑多次做减法比消耗额外的中间存储更便宜,而且我认为它更具可读性,但我还没有测试它的性能。
发布于 2019-03-14 14:04:53
以下优雅的递归解决方案似乎没有被提及,尽管它已经存在了很长一段时间。参考Knuth的计算机编程艺术,
mean_1 = x_1, variance_1 = 0; //initial conditions; edge case; //for k >= 2, mean_k = mean_k-1 + (x_k - mean_k-1) / k; variance_k = variance_k-1 + (x_k - mean_k-1) * (x_k - mean_k);
然后,对于 n>=2 值列表,标准差的估计值为:
n>=2
stddev = std::sqrt(variance_n / (n-1)).
希望这能有所帮助!
发布于 2015-04-22 20:38:25
我的答案与Josh Greifer类似,但推广到样本协方差。样本方差只是样本协方差,但两个输入相同。这包括贝塞尔的相关性。
template <class Iter> typename Iter::value_type cov(const Iter &x, const Iter &y) double sum_x = std::accumulate(std::begin(x), std::end(x), 0.0); double sum_y = std::accumulate(std::begin(y), std::end(y), 0.0); double mx = sum_x / x.size(); double my = sum_y / y.size(); double accum = 0.0; for (auto i = 0; i < x.size(); i++)