【问题标题】:How to Calculate the sample mean, standard deviation, and variance in C++ from random distributed data and compare with original mean and sigma如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较
【发布时间】:2018-10-04 03:47:58
【问题描述】:

我有用于高斯正态分布的 Python 脚本:

import numpy as np

x_mu = 25
x_sigma = 5
size = 1000

x_distribution = np.random.normal(x_mu, x_sigma, size)

#i am looking for help ONLY FOR this line below
test_distribution = np.std(x_distribution)  
print (test_distribution)

更新:对于大数据(可能是 10000 或只有 500,所以我也会测试它),样本均值和标准差必须接近原始输入(sigma 和均值)。

我指的是这个link,需要用c++编写。

如果您知道 C++ 中的任何库或想法,请留下 cmets 或回答。谢谢

【问题讨论】:

  • 我不是在问如何用 C++ 编写正态分布。这部分我明白了。我只问如何验证平均值和西格玛。伙计们,为什么你如此刻薄和粗鲁,并贬低我的问题。
  • 根据分布收集样本数据后,样本均值和样本标准差应该不难计算。您是专门寻找单线还是内置功能?
  • 我正在寻找如何测试我的数据是否正常分布。我绘制了数据并且看起来是正确的。但是,我想在我的代码中检查它。也许,答案很明显,但我刚开始学习统计数据并寻求帮助社区:( Python 有验证,但它使用的是 Numpy 库。docs.scipy.org/doc/numpy/reference/generated/…
  • 对不起,我仍然不确定你想要什么,你只是想验证样本均值和样本标准差接近 x_mu 和 x_sigma 吗?我们都在努力提供帮助,所以不要灰心。但我们首先必须确定你在问什么

标签: c++ statistics normal-distribution


【解决方案1】:

C++ 没有标准差函数,因此您需要自己编写所有必要的函数——生成随机数并计算标准差。

double stDev(const vector<double>& data) {
    double mean = std::accumulate(data.begin(), data.end(), 0.0) / data.size();
    double sqSum = std::inner_product(data.begin(), data.end(), data.begin(), 0.0);
    return std::sqrt(sqSum / data.size() - mean * mean);
}

int main() {

    double x_mu = 25;
    double x_sigma = 5;
    size_t size = 1000;
    std::normal_distribution<double> x_distribution(x_mu, x_sigma);

    //generate random numbers and store them in a vector
    vector<double> data(size);
    std::random_device rd;
    std::mt19937 gen(rd());
    for(size_t i=0; i<size; i++) {
        data[i] = x_distribution(gen);
    }

    double test_distribution = stDev(data); 
    cout << test_distribution << endl;
    return 0;
}

更新: 要获得均值、方差和标准差,您可以创建单独的函数来进行计算。一种可能的实现是:

double mean(const vector<double>& data) {
        return  std::accumulate(data.begin(), data.end(), 0.0) / data.size();
}

double variance(const vector<double>& data) {
        double xBar = mean(data);
        double sqSum = std::inner_product(data.begin(), data.end(), data.begin(), 0.0);
        return sqSum / data.size() - xBar * xBar;
}

double stDev(const vector<double>& data) {
     return std::sqrt(variance(data));       
}

【讨论】:

  • 感谢您的回答。我有我的 C++ 代码。我正在寻找如何测试数据是否呈正态分布。
  • np.std(x_distribution) 不只是返回 1000 个样本的标准差吗?您的意思是要计算卡方统计量?
  • 感谢您的帮助。我使用了您更新的代码并添加到我的功能中。抱歉,也许我的问题不清楚,无法解释我第一次在寻找什么。谢谢你这么耐心:)
猜你喜欢
  • 2020-05-28
  • 2021-10-09
  • 2021-06-15
  • 1970-01-01
  • 2011-10-12
  • 2020-07-30
  • 2014-03-21
相关资源
最近更新 更多