A15 算法估计均值方差——原理和 Python 实现
Posted zhuo木鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A15 算法估计均值方差——原理和 Python 实现相关的知识,希望对你有一定的参考价值。
本文主要参考:Analytical Methods Committee 的 Part.1. Robust Statistics——How Not to Reject Outliers
稳健估计要解决的两个问题是:
- 避免由于粗大误差(gross error)导致估计不稳定
- 避免因为随机误差的“拖尾分布”(类似于 σ \\sigma σ 很大的正态分布),影响估计的不稳定
记样本为 x 1 , x 2 , ⋯ , x n x_1, x_2, \\cdots, x_n x1,x2,⋯,xn,n 为样本容量。
A15 算法——估计均值
步骤
基本原理:
对数据均值的估计,一般需要求解一个最小值优化问题:
∑
i
=
1
n
(
x
i
−
μ
)
2
\\sum_{i=1}^n (x_i - \\mu)^2
i=1∑n(xi−μ)2
当然,为了实现均值的稳健估计,我们需要换一个问题:
ρ
(
(
x
−
μ
)
σ
)
=
{
(
(
x
−
μ
)
σ
)
2
∣
(
x
−
μ
)
σ
∣
≤
c
c
×
(
2
∣
(
x
−
μ
)
σ
∣
−
c
)
∣
(
x
−
μ
)
σ
∣
>
c
\\rho(\\frac{(x-\\mu)}{\\sigma}) =\\left\\{\\begin{array}{c} (\\frac{(x-\\mu)}{\\sigma})^2 & |\\frac{(x-\\mu)}{\\sigma}| \\leq c \\\\ c\\times (2|\\frac{(x-\\mu)}{\\sigma}| - c) & |\\frac{(x-\\mu)}{\\sigma}| > c \\\\ \\end{array}\\right.
ρ(σ(x−μ))={(σ(x−μ))2c×(2∣σ(x−μ)∣−c)∣σ(x−μ)∣≤c∣σ(x−μ)∣>c
而求解上述问题,实际上就是要找出伪值
x
^
i
\\hat{x}_i
x^i 的均值:
x
^
i
=
{
x
i
∣
x
i
−
μ
∣
≤
c
σ
μ
−
c
σ
x
i
<
c
σ
−
μ
μ
+
c
σ
x
i
>
c
σ
+
μ
\\hat{x}_i =\\left\\{\\begin{array}{c} x_i & |x_i -\\mu| \\leq c\\sigma \\\\ \\mu - c\\sigma & x_i < c\\sigma - \\mu\\\\ \\mu + c\\sigma & x_i > c\\sigma + \\mu \\\\ \\end{array}\\right.
x^i=⎩⎨⎧xiμ−cσμ+cσ∣xi−μ∣≤cσxi<cσ−μxi>cσ+μ
同时用
x
^
i
\\hat{x}_i
x^i 的均值
μ
\\mu
μ 代替上述的
μ
\\mu
μ,当然,迭代初始值
μ
0
\\mu_0
μ0 可以为均值或方差;持续上述迭代,求解伪值
x
^
\\hat{x}
x^ 的均值直到收敛(变化很小)。
上述的过程也等价于,对加权的样本求取均值,权重
w
i
w_i
wi 如下:
w
i
=
{
1
∣
x
i
−
μ
∣
≤
c
σ
c
σ
/
∣
x
i
−
μ
∣
∣
x
i
−
μ
∣
>
c
σ
−
μ
w_i =\\left\\{\\begin{array}{c} 1 & |x_i -\\mu| \\leq c\\sigma \\\\ c\\sigma/|x_i - \\mu| & |x_i -\\mu| > c\\sigma - \\mu\\\\ \\end{array}\\right.
wi={1cσ/∣xi−μ∣∣xi−μ∣≤cσ∣xi−μ∣>cσ−μ
(当然也是通过迭代,收敛后的均值)
上述算法的常数 c 一般取 [ 1 , 2 ] [1,2] [1,2],一般常用 1.5;
A15 算法其实就是 ISO 13528 的条款 C.3 中算法 A 的始祖啦。
A15 需要提供一个
σ
\\sigma
σ,也即总体的标准差。若总体的标准差未知,则一般用样本的 MADe 作为标准差的估计,MADe 的求解如下:
MADe
=
1.4826
×
Median
(
∣
x
i
−
Median
(
x
)
∣
)
\\text{MADe} = 1.4826 \\times \\text{Median} ( |x_i - \\text{Median}(x)|)
MADe=1.4826×Median(∣xi−Median(x)∣)
Python 实现
def pseudo_value(x, loc, scale, c):
x = x.copy()
idx_upper = x > loc + c*scale
idx_lower = x < loc - c*scale
x[idx_upper] = loc + c*scale
x[idx_lower] = loc - c*scale
return x
def perform_A15(x, c=1.5, epochs=100, loc=None, scale=None):
if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):
x = x.astype('float').values
if isinstance(x, list):
x = np.array(x)
if scale == None:
# 若没有提供标准差,则用 MADe 估计
scale = 1.4826*np.median(np.abs(x-np.median(x)))
if loc == None:
# 用中位数作为稳健均值的初始迭代值
loc = np.median(x)
loc_last = loc
loc_curr = None
epoch = 0
while True:
pseudo_x = pseudo_value(x, loc=loc_last, scale=scale, c=c)
loc_curr = np.mean(pseudo_x)
if np.abs(loc_curr - loc_last) <= 1e-6:
return loc_curr
epoch = epoch + 1
if epoch >= epochs:
return loc_curr
loc_last = loc_curr
A15 算法——估计标准差
步骤
A15 算法估计标准差需要提供一个已知的均值(总体均值),若总体均值未知,可以用样本中位数估计,即为 μ \\mu μ。
A15 算法估计标准差的原理是求解方程:
min
(
∣
x
i
−
μ
∣
/
σ
,
c
)
2
=
n
⋅
β
\\min (|x_i - \\mu|/\\sigma, c)^2 = n\\cdot \\beta
min(∣xi−μ∣/σ,c)2=n⋅β
其中
β
\\beta
β 作为一个修正因子,用于将样本分布修正为正态分布。其取值与 c 有关,计算公式如下:
β
=
θ
+
c
2
⋅
(
1
−
θ
)
−
2
c
⋅
exp
(
−
c
2
/
2
)
2
π
\\beta = \\theta + c^2 \\cdot (1-\\theta) - 2c \\cdot \\frac{ \\exp(-c^2/2)} {\\sqrt{2 \\pi} }
β=θ+c2⋅(1−双全估计算均值和方差——理论与 Python 实现