衡量分布间的差距
基于高斯核的 MMD
MMD 全称 Maximum Mean Discrepancy,用来度量两个分布之间的差异。
如果我们知道两个分布的概率密度函数,那直接用函数的范数来度量就完事了。
问题是大多数时候咱不知道,就退而求其次,如果我们分别有两个分布的无限个
简单随机抽样呢?
一个简单的想法就是用这些样本来估计分布的参数,比如一阶矩乃至无穷阶矩。
我们对两个分布分别得到一个参数估计向量:
[a1,a2,...,an,...][b1,b2,...,bn,...]
然后对比这两个向量差的二范数,越小代表这两个分布越接近,没毛病吧?
好,那这些参数选啥啊。就选一阶矩乃至无穷阶矩。我记得有个定理说,
一定条件下,分布的各阶矩可以唯一确定分布。
我们拿到两个随机变量 X,Y,它们分别服从分布 P,Q。定义
φ(x)=[x,x2,...,xn,...]
那么
MMD=∥E[φ(X)−φ(Y)]∥
问题是:MMD 咋算?Here comes the kernel trick!
支持向量机里咱见过这东西。
我们先把 MMD平方了,得到
∥μX∥2+∥μY∥2−2⟨μX,μY⟩=⟨μX,μX⟩+⟨μY,μY⟩−2⟨μX,μY⟩
其中 μX=E[φ(X)],是无穷维向量,我们希望找到一个核函数,把两个无穷维向量的内积转化成好计算的形式。
考虑
k(x,y)=exp(−2σ2∣x−y∣2).
它就是高斯核,长得很像高斯分布的 pdf,对吧?那个 σ 随便取的,我们下面讲。
用泰勒展开,这个核函数可以写成
n=0∑∞(exp(−2σ2x2)n!σnxn)(exp(−2σ2y2)n!σnyn)=exp(−2σ2x2)exp(−2σ2y2)⟨1σx2!σ2x2⋮,1σy2!σ2y2⋮⟩
我们上面那个 φ(x) 改成这样定义:
φ(x)=exp(−2σ2x2)[1,σx,2!σ2x2,...]
这样就有 ⟨φ(x),φ(y)⟩=k(x,y),⟨μX,μY⟩ 什么的就好算了:
⟨μX,μX⟩=⟨E[φ(X)],E[φ(X)]⟩=⟨E[φ(X)],E[φ(X′)]⟩(X,X′i.i.d.)=E[⟨φ(X),φ(X′)⟩](E[⟨A,B⟩]=⟨E(A),E(B)⟩ if A⊥B)=E[k(X,X′)]
其他的略,于是
MMD2=E[k(X,X′)]+E[k(Y,Y′)]−2E[k(X,Y)]
这样一来,估计量也变得很容易提出:
MMD2=m21i=1∑mj=1∑mk(xi,xj)+n21i=1∑ni=1∑nk(yi,yj)−mn2i=1∑mj=1∑nk(xi,yj)
进一步理解
对于两个分布的差异,我们没有一个放之四海皆准的描述方法,每个指标都有其侧重点,也有不同的估计难度。对于这个指标,我们应该问:
- 它侧重体现两个分布在哪一方面的差异?
- 它的估计难度如何?
首先我想说,要用上面的估计量,必须要两个随机变量 X,Y 相互独立,且抽样也是简单随机抽样,才合法。这是一个相当苛刻的条件,试图用这玩意儿做因子,我想结果不会太好(实际上也确实不好)。
下面看看这个指标在比较分布差异的表现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import math
def normal_mmd(mu1, var1, mu2, var2, return_squared=False): """ MMD between: X ~ N(mu1, var1) Y ~ N(mu2, var2)
Kernel: k(x, y) = exp(-|x-y| / 2)
Parameters ---------- mu1, mu2 : float Means. var1, var2 : float Variances, NOT standard deviations. return_squared : bool If True, return MMD^2. Otherwise return MMD. Returns ------- float """
def expected_kernel_normal(mu, var): sigma = math.sqrt(var) a = 0.5
def Phi(x): return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))
return ( math.exp(0.5 * a*a*var - a*mu) * Phi((mu - a*var) / sigma) + math.exp(0.5 * a*a*var + a*mu) * Phi((-mu - a*var) / sigma) )
k_xx = expected_kernel_normal(0.0, 2.0 * var1)
k_yy = expected_kernel_normal(0.0, 2.0 * var2)
k_xy = expected_kernel_normal(mu1 - mu2, var1 + var2)
mmd2 = k_xx + k_yy - 2.0 * k_xy
mmd2 = max(mmd2, 0.0)
if return_squared: return mmd2
return math.sqrt(mmd2) print(normal_mmd(0,1,0.1,1)) print(normal_mmd(0,1,0,1.1)) print(normal_mmd(1,1,1.1,1)) print(normal_mmd(0,2,0,2.1))
|
上面的脚本的运行结果如下:
1 2 3 4
| 0.03578846461473315 0.015846320705190348 0.03578846461472695 0.008844676520750891
|
可以看出几点:
- 对高阶矩的变化不如低阶矩敏感(这从 Gauss 核的形式能看出来,权重随阶数是越来越低的)
- 具有平移不变性(对比输出1、3)
- 对高阶矩差异的捕捉能力随其数值有递减趋势(对比输出2、4)
我看有研报用这个做因子,好像是用来衡量量价波动性,从这就能看出,若是直接用,效果必然不会太好。应该做些处理,抹平一阶矩的差异。
衡量分布的均匀程度
熵
随机变量的熵越大,平均而言我们观测这个随机变量的惊讶程度越高,它的概率分布得越均匀,就越难预测。
在机器学习拾遗中简单介绍过,这里再说说。熵是一个衡量概率的分布是否均匀的指标,若分布像正态分布那样呈现聚集特征,就是说大部分事件具有较高的概率密度,即信息量低,这个分布的熵就不会大,事实上,标准正态分布的熵约为 1.4189;作为对比,考虑 [0,200] 上的均匀分布,它的熵为 ln200≈5.298.
本来想用 [−2,2] 上的均匀分布来对比的,因为这覆盖了标准正态分布约 95.45% 的概率质量,但是这货的熵是 1.386,还比正态分布小。这说明正态分布还是挺均匀的,也就是说它的尾部没我想的那么薄,当然也不厚,总之就是一个薄厚适中的香香软软的分布吖(
Gemini 告诉我正态分布有同方差下最大微分熵的特性,就是说相同方差下,正态分布的概率最均匀。作为对比, [−3,3] 上均匀分布的熵约为 1.242(它跟标准正态分布同方差)。
我觉得还是一个权衡取舍的问题:给定方差,你要怎么分配概率,使得平均看来,随机变量的实现带给我们最大的惊讶?
事实上,给定区间,均匀分布的熵最大。
别把熵当作是衡量随机变量取值均匀程度的指标。举个极端的例子,常数,够平稳吧,采样值够稳定吧,它的熵是0。
还是得从信息量的角度理解:平均下来,观测这个随机变量能给我们带来多少惊讶。
从构建因子的角度来说,我觉得单纯熵特征的因子不是很能预测股票,因为惊喜和惊吓都是惊讶。
列几个熵的性质:
- h(aX)=h(X)+ln∣a∣,说明微分熵是一个绝对信息量
- H(aX)=H(X),微分熵会随尺度变化是因为取值空间的“体积”发生了缩放,离散熵则没有这个性质
- h(X+c)=h(X)
视股价为随机变量,用成交量占比作为概率,那么高熵意味着成交分散在很多价位,没有特别明确的价格共识;低熵意味着成交高度集中于少数价位,市场形成了比较强的成本中心。
注意熵与随机变量具体的值无关,还是那句话,它只看概率是怎么分配的,至于分配到哪,它不看。所以 90% 的概率被分配到 10 元档位,剩下的被分配到 10.01 元档位,和 90% 的概率被分配到 10 元档位,剩下的被分配到 11 元档位,在它看来是一样的。下面的基尼系数能捕捉到这一点。
区别一下离散熵和微分熵
两者出发点是一样的,都是信息量的期望:
H(X)h(X)=−∑pilnpi=−∫f(x)lnf(x)dx
但注意概率密度可以大于 1,所以微分熵可以是负数。
下面说说它们的估计,离散熵好估计,计算频率就行。微分熵的话,不能简单靠分桶来估计。比如对于一个连续随机变量,咱有 N 个样本,从大到小排在数轴上,分成 n 个桶,每个桶宽度为 Δ ,然后计算落在每个桶的概率 p1,...,pn ,然后用估计离散熵的方法估计:
HΔ(X)=−∑pilnpi≈−∫f(x)dxln(f(x)Δ)≈h(X)−lnΔ
如果桶分得很细(这要求大数据量)的话,这个约等于关系是合理的。这个估计量随分桶变细会趋向于无穷。实践中我们除以 lnn (n 是桶数)来压制它,获得一个经验离散熵指标。它并不是熵的估计量。
基尼系数
对于随机变量 X ,其基尼系数定义为
G=2E[X]E∣X1−X2∣
其中 X1,X2 与 X 独立同分布。测量差距的平均值,再除以两倍均值做标准化。
几个性质:
- G(aX)=G(X)
- G(X+c)<G(X)(c>0)
可以推得,给定均值和方差 μ,σ2 ,正态分布的基尼系数为 π1μσ,均匀分布的基尼系数为 31μσ 。正态分布的小一点,说明它的平均相对差异要更小。