千杯不醉的遥控器 · 合并Typescript中具有匹配相同键的两 ...· 4 月前 · |
正直的桔子 · getGlobalVisibleRect、g ...· 1 年前 · |
英俊的草稿纸 · WPF样式(Style)入门 - 知乎· 1 年前 · |
曾深爱过的电池 · go 字符串转json数组-掘金· 1 年前 · |
有没有办法使用 Boost 计算包含样本的向量的均值和标准差?
或者我必须创建一个累加器并将向量输入其中?
发布于 2018-08-13 21:31:21
对
the answer by musiphil
进行了改进,您可以在没有临时向量
diff
的情况下编写标准差函数,只需使用一个带有C++11 lambda功能的
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
值列表,标准差的估计值为:
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++)
正直的桔子 · getGlobalVisibleRect、getLocalVisibleRect、getLocationInWindow、getLocationOnScreen-CSDN博客 1 年前 |
英俊的草稿纸 · WPF样式(Style)入门 - 知乎 1 年前 |
曾深爱过的电池 · go 字符串转json数组-掘金 1 年前 |