hello,大家好
这里是第11期概率论与数理统计的学习,我将用这篇博客去总结知识点和用C语言实现简单例题的过程。
本期知识点:方差
- 方差的定义
- 方差的性质
- 几种常用随机变量的方差
方差刻画了随机变量取值在其中心位置附近的分散程度,即随机变量取值与平均值的偏离程度。
设随机变量XXX的期望为E(X)E(X)E(X),为了刻画偏离程度的大小,用E[∣X−E(X)∣]E[|X-E(X)|]E[∣X−E(X)∣]作为描述XXX取值分散程度的数字特征,称之为XXX的平均绝对差。
但由于在数学上绝对值的处理很不方便,因此常用[X−E(X)]2[X-E(X)]^2[X−E(X)]2的平均值度量XXX与E(X)E(X)E(X)的偏离程度,这个平均值就是方差。
🌱 定义:设XXX为一随机变量,如果E{∣X−E(X)]2}E\{|X-E(X)]^2\}E{∣X−E(X)]2}存在,则称之为XXX的方差,记为Var(X)Var(X)Var(X),有时也记为D(X)D(X)D(X)。即Var(X)=E{[X−E(X)]2}Var(X)=E\{[X-E(X)]^2\}Var(X)=E{[X−E(X)]2}
并称Var(X)\sqrt{Var(X)}Var(X)为XXX的标准差。
再将上式做一个变换,可得Var(X)=E(X2)−[E(X)]2Var(X)=E(X^2)-[E(X)]^2Var(X)=E(X2)−[E(X)]2
ccc为常数,则Var(c)=0Var(c)=0Var(c)=0
Var(X+c)=Var(X)Var(X+c)=Var(X)Var(X+c)=Var(X)
设kkk为常数,则Var(kX)=k2Var(X)Var(kX)=k^2Var(X)Var(kX)=k2Var(X)
设XXX与YYY相互独立,则
Var(X+‾Y)=Var(X)+Var(Y)Var(X\underline +Y)=Var(X)+Var(Y)Var(X+Y)=Var(X)+Var(Y)
设随机变量XXX的期望和方差分别为E(X)E(X)E(X)和Var(X)Var(X)Var(X),则Y=X−E(X)Var(X)Y=\frac{X-E(X)}{\sqrt{Var(X)}}Y=Var(X)X−E(X)的期望和方差为E(Y)=0,Var(Y)=1E(Y)=0,Var(Y)=1E(Y)=0,Var(Y)=1
这里称YYY为XXX的标准化的随机变量。
即:
X~~~~~~~~~~~~~X X~N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2)
Y=X−μσ~Y=\frac{X-\mu}{\sigma} Y=σX−μ~N(0,1)N(0,1)N(0,1)
设XXX服从参数为ppp的两点分布,有E(X)=pE(X)=pE(X)=p,则
Var(X)=p(1−p)Var(X)=p(1-p)Var(X)=p(1−p)
设XXX~B(n,p)B(n,p)B(n,p),X=X1+X2+...+XnX=X_{1}+X_{2}+...+X_{n}X=X1+X2+...+Xn,则
Var(X)=Var(X1)+Var(X2)+...+Var(Xn)=np(1−p)Var(X)=Var(X_{1})+Var(X_{2})+...+Var(X_{n})=np(1-p)Var(X)=Var(X1)+Var(X2)+...+Var(Xn)=np(1−p)
设XXX~P(λ)P(\lambda)P(λ),则
Var(X)=λVar(X)=\lambdaVar(X)=λ
设XXX~U[a,b]U[a,b]U[a,b],则
Var(X)=(b−a)212Var(X)=\frac{(b-a)^2}{12}Var(X)=12(b−a)2
设XXX服从参数为λ\lambdaλ的指数分布,则
Var(X)=1λ2Var(X)=\frac{1}{\lambda^2}Var(X)=λ21
设XXX~N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2),则
Var(X)=σ2Var(X)=\sigma^2Var(X)=σ2
题目分析:因为是离散型的,所以直接按照公式来即可。
#include
#include
#include
typedef struct
{int X;float p;
}Variate;// The algorithm of variance ——离散型随机变量方差的算法
float D(Variate *b,int pos)
{float sum1 = 0,sum2 = 0;for(int i = 0 ; i < pos ; i++){sum1 += b[i].p * b[i].X;sum2 += pow(b[i].X,2) * b[i].p;}return sum2 - pow(sum1,2);
}int main()
{printf("-----------------------------Read-in datas-------------------------------------\n"); // 读入数据// Use pos to judge the number of the datas ——用pos表示数据的个数(一个结构体代表一个数据)int pos = 0;// Use sign to be the condition of the circle ——用sign作为循环判断的条件int sign = 1;// It can be regarded as head pointer ——可以把var当作一个头指针Variate* var = NULL;// And view a as the pointer to move ——把a看作用来移动的指针Variate* a = NULL;while(sign == 1){// Allocate spaces dynamically ——动态分配内存空间var = (Variate *) realloc (var,sizeof(Variate));a = var;// The pointer is moving ——这个指针在移动a += pos;printf("Please input the value of X:"); // 请输入X的值scanf("%d",&a->X);printf("Please input the probability of the X:"); // 请输入X的概率scanf("%f",&a->p);pos++;printf("\n");printf("Do you want to end up reading in?If so input 0,else input 1------------:"); // 你是否想结束读入数据?若是,输入0,不是则输入1scanf("%d",&sign);}printf("-----------------------------Stop reading--------------------------------------\n"); // 停止读取printf("The probability distrubution is :\n"); // 概率分布为:for(int i = 0 ; i < pos ; i++){printf("P{X=%d}=%.2f\n",var[i].X,var[i].p);}float result = D(var,pos);printf("-------------------------------------------------------------------------------\n");printf("\n");printf("Var(X)=%.2f",result);return 0;
}
代码分析:虽然这个题目十分简单,但是我们可以用代码将做题的这个过程丰富起来。写这个代码的时候的主要难度就在于指针的问题,因为动态分配内存空间时,var指针是一直不变的,始终指向分配的第一块内存空间,所以我们需要另设一个指针a来移动,实现对每个分配的空间的赋值。所以需要注意的就是指针与指针之间的关系。
题目分析:由各部件的状态相互独立可以知道,E(X)=E(X1)+E(X2)+E(X3)E(X)=E(X_{1})+E(X_{2})+E(X_{3})E(X)=E(X1)+E(X2)+E(X3),Var(X)=Var(X1)+Var(X2)+Var(X3)Var(X)=Var(X_{1})+Var(X_{2})+Var(X_{3})Var(X)=Var(X1)+Var(X2)+Var(X3)。进而每个部件只有两种情况,所以每个部件符合一次实验的二项分布,即X1X_{1}X1~B(1,0.01)...B(1,0.01)...B(1,0.01)...
#include
#include
#include
typedef struct
{int X[2]; // Each X has two values ——每个X有两个值float p[2]; // Each X corresponds to a probability ——每个X对应于一个概率
}Data;// The algorithm of Expectation and Variance ——期望和方差的算法
// Here I calculate them through the cognitions ——这里我用概念法计算的
void D(Data* d,int len)
{float sum1 = 0,sum2 = 0;for(int i = 0 ; i < len ; i++){for(int j = 0 ; j < 2 ; j++){float a = d[i].X[j] * d[i].p[j];sum1 += a;sum2 += pow(d[i].X[j],2) * d[i].p[j];sum2 -= pow(a,2);}}printf("E(X)=%.2f\n",sum1);printf("Var(X)=%.4f\n",sum2);
}int main()
{Data* d = NULL;Data* a = NULL;int len;printf("Please input the number of the units(which is regarded as the variate 'X'):"); // 请输入部件的数量(X的数量)scanf("%d",&len);printf("Each unit(Each X) has two values :0,1\n"); // 每个X有两个值d = (Data *) malloc (sizeof(Data) * len);// Initiate X ——初始化Xfor(int i = 0 ; i < len ; i++){d[i].X[0] = 0;d[i].X[1] = 1;}printf("\n");printf("Now we need to input the values of the probability of each condition of each X:\n"); // 现在我们需要输入每个X的每个值对应的概率for(int i = 0 ; i < len ; i++){// Xi=1的概率printf("Input P{X%d=1}=",i + 1);scanf("%f",&d[i].p[1]);// Xi=0的概率d[i].p[0] = 1 - d[i].p[1];}printf("\n");for(int i = 0 ; i < len ; i++){printf("P{X%d=%d}=%.2f\n",i + 1,d[i].X[0],d[i].p[0]);printf("P{X%d=%d}=%.2f\n",i + 1,d[i].X[1],d[i].p[1]);printf("\n");}D(d,len);return 0;
}
代码分析:主要是一个数据存储的问题,你可以用数组,也可以用结构体来实现。然后其它方面跟上面的代码差不多,然后就是具体算法需要仔细跟数学算式比对,用代码一步一步地去实现每一个步骤。
这一期的学习就到这里了,咱们下期再见~~