C 语言结构体、概率分布、相对熵

# 1 几何分布

在伯努利实验中,记每次试验中事件 A 发生的概率为 p,试验进行到事件 A 出现停止,此时所进行的试验次数为 X,其分布就是几何分布。

该分布的期望为 1/p1/p,方差为 1pp2\frac{1-p}{p^2}

# 2 C 语言结构体大小

结构体内偏移规则:

  • 每个成员的偏移量必须是当前成员所占内存大小的整数倍,若不是则编译器会在成员之前加上填充字节。
  • 当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍,若不是则会在最后一个成员后做字节填充。

例如下面的结构体,

struct foo
{
    int		a;
    char	b;
    int		c;
    long	d;
    char	e;
};
1
2
3
4
5
6
7
8

该结构体的大小就是 32 个字节。

# 3 相对熵

熵反应一个系统有序化的程度,越有序熵越低。如果一个随机变量 X=x1,x2,,xnX = {x_1, x_2, \cdots, x_n},对应的概率为 p(X=xi)(i=1,2,,n)p(X = x_i) (i = 1, 2, \cdots, n),则随机变量 XX 的熵定义为

H(X)=i=1np(xi)logp(xi)H(X) = -\sum_{i=1}^{n}p(x_i)\log{p(x_i)}

相对熵也叫交叉熵,KL 散度等。设 p(x)p(x)q(x)q(x)XX 取值的两个概率密度分布,则 ppqq 的相对熵为

D(pq)=inp(xi)logp(xi)q(xi)D(p||q) = \sum_{i}^{n}p(x_i)\log{\frac{p(x_i)}{q(x_i)}}

在一定程度上,熵可以度量两个分布的距离。KL 散度是两个概率分布 PPQQ 差别的非对称性度量。KL 散度是用来度量使用基于 QQ 的编码来编码来自 PP 的样本平均所需的额外的位元数。典型情况下,PP 表示真实分布,QQ 表示数据的理论分布,或 PP 的近似分布。

相对熵具有非负性和不对称性。前向 KL 散度是“0避免”的,后向 KL 散度是“0趋近”的。