如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较

Posted

技术标签:

【中文标题】如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较【英文标题】:How to Calculate the sample mean, standard deviation, and variance in C++ from random distributed data and compare with original mean and 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 或回答。谢谢

【问题讨论】:

也许是这个? docs.scipy.org/doc/numpy-1.13.0/reference/… 我不是在问如何用 C++ 编写正态分布。这部分我明白了。我只问如何验证平均值和西格玛。伙计们,为什么你如此刻薄和粗鲁,并贬低我的问题。 根据分布收集样本数据后,样本均值和样本标准差应该不难计算。您是专门寻找单线还是内置功能? 我正在寻找如何测试我的数据是否正常分布。我绘制了数据并且看起来是正确的。但是,我想在我的代码中检查它。也许,答案很明显,但我刚开始学习统计数据并寻求帮助社区:( Python 有验证,但它使用的是 Numpy 库。docs.scipy.org/doc/numpy/reference/generated/… 对不起,我仍然不确定你想要什么,你只是想验证样本均值和样本标准差接近 x_mu 和 x_sigma 吗?我们都在努力提供帮助,所以不要灰心。但我们首先必须确定你在问什么 【参考方案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 个样本的标准差吗?您的意思是要计算卡方统计量? 感谢您的帮助。我使用了您更新的代码并添加到我的功能中。抱歉,也许我的问题不清楚,无法解释我第一次在寻找什么。谢谢你这么耐心:)

以上是关于如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

方差如何计算,为啥要计算方差?

蒙特卡洛方法

应用统计学简单随机抽样的区间估计和样本容量的确定

应用统计学简单随机抽样的区间估计和样本容量的确定

应用统计学简单随机抽样的区间估计和样本容量的确定

应用统计学简单随机抽样的区间估计和样本容量的确定