正态分布的均值与方差怎么算?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正态分布的均值与方差怎么算?相关的知识,希望对你有一定的参考价值。

在正态分布中,均值是数据的中心位置,表示数据的平均值;方差是数据的离散程度,表示数据的分散程度。
计算正态分布的均值和方差的公式如下:
均值:μ = ∑x_i / n
方差: σ^2 = ∑(x_i - μ)^2 / (n - 1)
其中,x_i 表示样本中第 i 个数据,n 表示样本数据的个数,μ 表示均值,σ^2 表示方差。
例如,对于一组数据3, 4, 5, 6, 7,计算其均值和方差如下:
均值:μ = (3 + 4 + 5 + 6 + 7) / 5 = 5
方差: σ^2 = [(3 - 5)^2 + (4 - 5)^2 + (5 - 5)^2 + (6 - 5)^2 + (7 - 5)^2] / (5 - 1) = 2
因此,对于这组数据,均值为5,方差为2。
参考技术A 不用二重积分的,可以有简单的办法的。

设正态分布概率密度函数是f(x)=[1/(√2π)t]*e^[-(x-u)^2/2(t^2)]
其实就是均值是u,方差是t^2,百度不太好打公式,你将就看一下。
于是:
∫e^[-(x-u)^2/2(t^2)]dx=(√2π)t。。。。。。(*)
积分区域是从负无穷到正无穷,下面出现的积分也都是这个区域,所以略去不写了。

(1)求均值

对(*)式两边对u求导:
∫e^[-(x-u)^2/2(t^2)]*[2(u-x)/2(t^2)]dx=0

约去常数,再两边同乘以1/(√2π)t得:
∫[1/(√2π)t]*e^[-(x-u)^2/2(t^2)]*(u-x)dx=0

把(u-x)拆开,再移项:
∫x*[1/(√2π)t]*e^[-(x-u)^2/2(t^2)]dx=u*∫[1/(√2π)t]*e^[-(x-u)^2/2(t^2)]dx

也就是
∫x*f(x)dx=u*1=u

这样就正好凑出了均值的定义式,证明了均值就是u。

(2)方差
过程和求均值是差不多的,我就稍微略写一点了。

对(*)式两边对t求导:
∫[(x-u)^2/t^3]*e^[-(x-u)^2/2(t^2)]dx=√2π

移项:
∫[(x-u)^2]*[1/(√2π)t]*e^[-(x-u)^2/2(t^2)]dx=t^2
也就是
∫(x-u)^2*f(x)dx=t^2
正好凑出了方差的定义式,从而结论得证。

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

【中文标题】如何根据随机分布数据计算 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 个样本的标准差吗?您的意思是要计算卡方统计量? 感谢您的帮助。我使用了您更新的代码并添加到我的功能中。抱歉,也许我的问题不清楚,无法解释我第一次在寻找什么。谢谢你这么耐心:)

以上是关于正态分布的均值与方差怎么算?的主要内容,如果未能解决你的问题,请参考以下文章

matlab中已知一组数据服从正态分布,怎么求均值和方差?

样本方差跟样本均值有啥关系?

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

概率论考点总结类型28 正态总体下均值与方差的分布

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

关于正态总体的样本均值与样本方差的重要结论