hello,大家好
这里是第11期概率论与数理统计的学习,我将用这篇博客去总结知识点和用C语言实现简单例题的过程。
本期知识点:方差
- 方差的定义
- 方差的性质
- 几种常用随机变量的方差
方差刻画了随机变量取值在其中心位置附近的分散程度,即随机变量取值与平均值的偏离程度。
设随机变量 X X X的期望为 E ( X ) E(X) E(X),为了刻画偏离程度的大小,用 E [ ∣ X − E ( X ) ∣ ] E[|X-E(X)|] E[∣X−E(X)∣]作为描述 X X X取值分散程度的数字特征,称之为 X X X的平均绝对差。
但由于在数学上绝对值的处理很不方便,因此常用 [ X − E ( X ) ] 2 [X-E(X)]^2 [X−E(X)]2的平均值度量 X X X与 E ( X ) E(X) E(X)的偏离程度,这个平均值就是方差。
定义:设 X X X为一随机变量,如果 E { ∣ X − E ( X ) ] 2 } E\{|X-E(X)]^2\} E{∣X−E(X)]2}存在,则称之为 X X X的方差,记为 V a r ( X ) Var(X) Var(X),有时也记为 D ( X ) D(X) D(X)。即 V a r ( X ) = E { [ X − E ( X ) ] 2 } Var(X)=E\{[X-E(X)]^2\} Var(X)=E{[X−E(X)]2}
并称 V a r ( X ) \sqrt{Var(X)} Var(X)为 X X X的标准差。
再将上式做一个变换,可得 V a r ( X ) = E ( X 2 ) − [ E ( X ) ] 2 Var(X)=E(X^2)-[E(X)]^2 Var(X)=E(X2)−[E(X)]2
c c c为常数,则 V a r ( c ) = 0 Var(c)=0 Var(c)=0
V a r ( X + c ) = V a r ( X ) Var(X+c)=Var(X) Var(X+c)=Var(X)
设 k k k为常数,则 V a r ( k X ) = k 2 V a r ( X ) Var(kX)=k^2Var(X) Var(kX)=k2Var(X)
设 X X X与 Y Y Y相互独立,则
V a r ( X + ‾ Y ) = V a r ( X ) + V a r ( Y ) Var(X\underline +Y)=Var(X)+Var(Y) Var(X+Y)=Var(X)+Var(Y)
设随机变量 X X X的期望和方差分别为 E ( X ) E(X) E(X)和 V a r ( X ) Var(X) Var(X),则 Y = X − E ( X ) V a r ( X ) Y=\frac{X-E(X)}{\sqrt{Var(X)}} Y=Var(X)X−E(X)的期望和方差为 E ( Y ) = 0 , V a r ( Y ) = 1 E(Y)=0,Var(Y)=1 E(Y)=0,Var(Y)=1
这里称 Y Y Y为 X X X的标准化的随机变量。
即:
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)
设 X X X服从参数为 p p p的两点分布,有 E ( X ) = p E(X)=p E(X)=p,则
V a r ( X ) = p ( 1 − p ) Var(X)=p(1-p) Var(X)=p(1−p)
设 X X X~ B ( n , p ) B(n,p) B(n,p), X = X 1 + X 2 + . . . + X n X=X_{1}+X_{2}+...+X_{n} X=X1+X2+...+Xn,则
V a r ( X ) = V a r ( X 1 ) + V a r ( X 2 ) + . . . + V a r ( X n ) = n p ( 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)
设 X X X~ P ( λ ) P(\lambda) P(λ),则
V a r ( X ) = λ Var(X)=\lambda Var(X)=λ
设 X X X~ U [ a , b ] U[a,b] U[a,b],则
V a r ( X ) = ( b − a ) 2 12 Var(X)=\frac{(b-a)^2}{12} Var(X)=12(b−a)2
设 X X X服从参数为 λ \lambda λ的指数分布,则
V a r ( X ) = 1 λ 2 Var(X)=\frac{1}{\lambda^2} Var(X)=λ21
设 X X X~ N ( μ , σ 2 ) N(\mu,\sigma^2) N(μ,σ2),则
V a r ( X ) = σ 2 Var(X)=\sigma^2 Var(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,不是则输入1
scanf("%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 ( X 1 ) + E ( X 2 ) + E ( X 3 ) E(X)=E(X_{1})+E(X_{2})+E(X_{3}) E(X)=E(X1)+E(X2)+E(X3), V a r ( X ) = V a r ( X 1 ) + V a r ( X 2 ) + V a r ( X 3 ) Var(X)=Var(X_{1})+Var(X_{2})+Var(X_{3}) Var(X)=Var(X1)+Var(X2)+Var(X3)。进而每个部件只有两种情况,所以每个部件符合一次实验的二项分布,即 X 1 X_{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 ——初始化X
for(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;
}
代码分析:主要是一个数据存储的问题,你可以用数组,也可以用结构体来实现。然后其它方面跟上面的代码差不多,然后就是具体算法需要仔细跟数学算式比对,用代码一步一步地去实现每一个步骤。