截断正态分布(Truncated normal distribution)

Truncated normal distribution - Wikipedia

Normal Distribution 称为正态分布,也称为高斯分布,Truncated Normal Distribution一般翻译为截断正态分布,也有称为截尾正态分布。

截断正态分布是截断分布(Truncated Distribution)的一种,那么截断分布是什么?截断分布是指,限制变量x" role="presentation">xx 取值范围(scope)的一种分布。例如,限制x取值在0到50之间,即{0<x<50}。因此,根据限制条件的不同,截断分布可以分为:

  • 2.1 限制取值上限,例如,负无穷<x<50
  • 2.2 限制取值下限,例如,0<x<正无穷
  • 2.3 上限下限取值都限制,例如,0<x<50

正态分布则可视为不进行任何截断的截断正态分布,也即自变量的取值为负无穷到正无穷;

1. 概率密度函数

假设 X 原来服从正太分布,那么限制 x 的取值在(a,b)范围内之后,X 的概率密度函数,可以用下面公式计算:

f(x;μ,σ,a,b)=1σϕ(x−μσ)Φ(b−μσ)−Φ(a−μσ)" role="presentation">f(x;μ,σ,a,b)=1σϕ(x−μσ)Φ(b−μσ)−Φ(a−μσ)f(x;μ,σ,a,b)=1σϕ(x−μσ)Φ(b−μσ)−Φ(a−μσ)

也可简写为:

⇒f(x)F(b)−F(a)⋅I(a<x<b)" role="presentation">⇒f(x)F(b)−F(a)⋅I(a<x<b)⇒f(x)F(b)−F(a)⋅I(a<x<b)
  • 其中 ϕ(⋅)" role="presentation">ϕ(⋅)ϕ(⋅):均值为 0,方差为 1 的标准正态分布;

    ϕ(ξ)=12πexp⁡(−12ξ2)" role="presentation">ϕ(ξ)=12π−−√exp(−12ξ2)ϕ(ξ)=12πexp⁡(−12ξ2)
  • Φ(⋅)" role="presentation">Φ(⋅)Φ(⋅) 为标准正态分布的累积分布函数;

  • 对其分母部分的一些简单认识,
    • b→∞" role="presentation">b→∞b→∞,⇒ Φ(b−μσ)=1" role="presentation">Φ(b−μσ)=1Φ(b−μσ)=1
    • a→−∞" role="presentation">a→−∞a→−∞ ⇒ Φ(a−μσ)=0" role="presentation">Φ(a−μσ)=0Φ(a−μσ)=0

2. 截断型正态分布期望、方差

https://www.youtube.com/watch?v=cvvrOqTIodk

对于正态分布:f(x)=12πσexp⁡(−(x−μ)22σ2)" role="presentation">f(x)=12π√σexp(−(x−μ)22σ2)f(x)=12πσexp⁡(−(x−μ)22σ2),有如下基本结论:

  • f′(x)=−x−μσ2f(x)" role="presentation">f′(x)=−x−μσ2f(x)f′(x)=−x−μσ2f(x)
  • ∫abf′(x)dx=f(b)−f(a)" role="presentation">∫baf′(x)dx=f(b)−f(a)∫abf′(x)dx=f(b)−f(a)(牛顿莱布尼茨公式)
  • S(x)=1−F(x)" role="presentation">S(x)=1−F(x)S(x)=1−F(x)(F(x)" role="presentation">F(x)F(x) 是 cdf)

对于下截断型正态分布,其数学期望 E(x|c<x)" role="presentation">E(x|c<x)E(x|c<x):

E(x|c<x)=∫c∞x⋅f(x)S(c)dx=∫c∞(x−μ+μ)⋅f(x)S(c)dx=μS(c)∫c∞f(x)dx+−σ2S(c)∫c∞−(x−μ)σ2f(x)dx=μS(c)(1−F(c))−σ2S(c)(f(∞)−f(c))=μS(c)⋅S(c)+σ2S(c)f(c)=μ+σ2S(c)f(c)=μ+σ2f(c)S(c)" role="presentation">E(x|c<x)====∫∞cx⋅f(x)S(c)dx=∫∞c(x−μ+μ)⋅f(x)S(c)dxμS(c)∫∞cf(x)dx+−σ2S(c)∫∞c−(x−μ)σ2f(x)dxμS(c)(1−F(c))−σ2S(c)(f(∞)−f(c))=μS(c)⋅S(c)+σ2S(c)f(c)μ+σ2S(c)f(c)=μ+σ2f(c)S(c)E(x|c<x)=∫c∞x⋅f(x)S(c)dx=∫c∞(x−μ+μ)⋅f(x)S(c)dx=μS(c)∫c∞f(x)dx+−σ2S(c)∫c∞−(x−μ)σ2f(x)dx=μS(c)(1−F(c))−σ2S(c)(f(∞)−f(c))=μS(c)⋅S(c)+σ2S(c)f(c)=μ+σ2S(c)f(c)=μ+σ2f(c)S(c)

为计算其方差,还需计算 E(x2|c<x)" role="presentation">E(x2|c<x)E(x2|c<x):

E(x2|c<x)=∫c∞x2⋅f(x)S(c)dx=∫c∞x(x−μ+μ)⋅f(x)S(c)dx=−σ2S(c)∫c∞x−(x−μ)σ2f(x)dx+μS(c)∫c∞x⋅f(x)dx=−σ2S(c)∫c∞xf′(x)dx+μ∫c∞x⋅f(x)S(c)dx=−σ2S(c)(xf(x)|c∞−∫c∞f(x)dx)+μ⋅E(x|c<x)=−σ2S(c)(0−cf(c)−S(c))+μ⋅E(x|c<x)=μ2+σ2+(μ+c)σ2f(c)S(c)" role="presentation">E(x2|c<x)======∫∞cx2⋅f(x)S(c)dx=∫∞cx(x−μ+μ)⋅f(x)S(c)dx−σ2S(c)∫∞cx−(x−μ)σ2f(x)dx+μS(c)∫∞cx⋅f(x)dx−σ2S(c)∫∞cxf′(x)dx+μ∫∞cx⋅f(x)S(c)dx−σ2S(c)(xf(x)|∞c−∫∞cf(x)dx)+μ⋅E(x|c<x)−σ2S(c)(0−cf(c)−S(c))+μ⋅E(x|c<x)μ2+σ2+(μ+c)σ2f(c)S(c)E(x2|c<x)=∫c∞x2⋅f(x)S(c)dx=∫c∞x(x−μ+μ)⋅f(x)S(c)dx=−σ2S(c)∫c∞x−(x−μ)σ2f(x)dx+μS(c)∫c∞x⋅f(x)dx=−σ2S(c)∫c∞xf′(x)dx+μ∫c∞x⋅f(x)S(c)dx=−σ2S(c)(xf(x)|c∞−∫c∞f(x)dx)+μ⋅E(x|c<x)=−σ2S(c)(0−cf(c)−S(c))+μ⋅E(x|c<x)=μ2+σ2+(μ+c)σ2f(c)S(c)

进一步 Var(x|c<x)=E(x2|c<x)−(E(x|c<x))2" role="presentation">Var(x|c<x)=E(x2|c<x)−(E(x|c<x))2Var(x|c<x)=E(x2|c<x)−(E(x|c<x))2

3. 实现

  • R 语言 :

    > install.packages('truncnorm')
    > library(truncnorm)
    > norm_data <- rnorm(n = 1000, mean = 90, sd = 4)
    > hist(norm_data)
    > truncnorm_data <- rtruncnorm(n = 1000, a = 85, b = 100, mean = 90, sd = 4)
    > hist(truncnorm_data)
  • tensorflow:

    • tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
(0)

相关推荐