熵/方差/相似度

5 分钟阅读

Entropy, [ˈentrəpi], 熵,无序状态

信息量

信息不确定性越大,信息量越大。

假定X是随机事件集合,其中$ p(x_0) $表示事件$ x_0 $的概率,那么事件$ x_0 $的信息量定义为 $ h(x_0) = - \log_2p(x_0) $。

信息熵

\[H(X) = -\sum^{n}_{i=1}{p(x_i)log_2p(x_i)}\]

信息熵用来衡量事物的不确定性,信息熵越大,事物越具有不确定性。

相对熵 (KL散度)

设 p(x)、q(x) 是 离散随机变量 X 中取值的两个概率分布,则 pq 的相对熵是:

\[DKL(p \parallel q) = \sum_{i=1}^{n}{p(x_i)log_2\frac{p(x_i)}{q(x_i)}}\]

另外有推导证明:$ DKL(p \parallel q) \ge 0 $

相对熵可以用来衡量两个概率分布之间的差异。该公式的意义在于,求p与q之间的对数差在p上的期望值。

交叉熵

设p(x)是真实分布,q(x)是非真实分布。使用q(x)来表示p(x)的编码长度,则:

\[H(p,q) = -\sum_{i=1}^{n}{p(x)log_2q(x)}\]

另外有:

\[DKL(p \parallel q) = \sum_{i=1}^{n}{p(x_i)log_2\frac{p(x_i)}{q(x_i)}} = \sum_{i=1}^{n}{p(x_i)log_2{p(x_i)}} - \sum_{i=1}^{n}{p(x_i)log_2{q(x_i)}}\]

可以得出:

\[DKL(p \parallel q) = H(p,q) - H(p)\]

既可以理解为:用交叉熵比信息熵多出的部分,就是相对熵。

又有$ DKL(p \parallel q) \ge 0 $,得出 $ H(p,q) \ge H(p) $。

交叉熵广泛用于sigmoid和softmax函数中作为损失函数使用。

方差

方差

方差(variance): 用来度量随机变量和其数学期望(即均值)之间的偏离程度。

\[\sigma^2 = \frac{\sum{(x_i-\mu)^2}}{N} \\ \sigma^2为总体方差,x_i为样本变量,\mu为总体均值,N为样本数量\]

标准差

标准差:方差的平方根,用来反映数据集的离散程度。

\[\sigma = \sqrt{\frac{\sum(x_i-\mu)^2}{N}}\]

均方误差

均方误差:数据偏离真实值的距离平方和的平均数

均方根误差:均方误差的平方根

\[MSE = \frac{\sum(x-x_i)^2}{N} \\ 均方根误差 = \sqrt{MSE}\]

欧式距离

以二维空间举例如图:

求A点与B点的欧氏距离。

在二维空间欧式距离就是两点的直线距离:

\[E(A,B) = c = \sqrt{(b_1-a_1)^2+(b_2-a_2)^2}\]

多维空间同理:

\[E(p,q)= \sqrt{(p_1 - q_1)^2 + (p_2 - q_2)^2 + ... + (p_n - q_n)^2} = \sqrt{\sum_{i=1}^{n}(p_i - q_i)^2}\]

欧式相似度:

\[euclidean\_similarity = \frac{1}{1 + E(p,q)}\]

意义:用于对数值差异敏感的场景。

python实现

#!/usr/bin/env python

from math import *

def euclidean_distance(x,y):
  return sqrt(sum(pow(a-b,2) for a, b in zip(x, y)))

print euclidean_distance([0,3,4,5],[7,6,3,-1]) #9.74679434481

余弦相似度

余弦定理:

\[c^2 = a^2 + b^2 - 2ab \:cos(\theta)\]

进一步推导:

\[cos(\theta) = \frac{a^2+b^2 - c^2}{2ab} = \frac{a_1b_1 + a_2b_2}{\sqrt{a_1^2 + a_2^2} \times \sqrt{b_1^2+b_2^2}}\]

多维空间同理:

\[cosine\_similary(A,B) = cos(\theta) = \frac{A\times B}{||A|| \times ||B||} = \frac{\sum_i^n{(A_i \times B_i)}}{\sqrt{\sum_i^n(A_i^2)} \times \sqrt{\sum_i^n{(B_i^2)}}}\]

意义:值越趋于1越相似。一般用于数值不敏感,方向差异敏感的场景。

python实现

#!/usr/bin/env python

from math import *

def square_rooted(x):
   return round(sqrt(sum([a*a for a in x])),3)

def cosine_similarity(x,y):
  numerator = sum(a*b for a,b in zip(x,y))
  denominator = square_rooted(x)*square_rooted(y)
  return round(numerator/float(denominator),3)

print cosine_similarity([3, 45, 7, 2], [2, 54, 13, 15]) # 0.972

参考:

IMPLEMENTING THE FIVE MOST POPULAR SIMILARITY MEASURES IN PYTHON

评论