A15 算法估计均值方差——原理和 Python 实现

Posted zhuo木鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A15 算法估计均值方差——原理和 Python 实现相关的知识,希望对你有一定的参考价值。


本文主要参考:Analytical Methods Committee 的 Part.1. Robust Statistics——How Not to Reject Outliers

稳健估计要解决的两个问题是:

  1. 避免由于粗大误差(gross error)导致估计不稳定
  2. 避免因为随机误差的“拖尾分布”(类似于 σ \\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=1n(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(xiMedian(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 实现

双全估计算均值和方差——理论与 Python 实现

一些常用的机器学习算法实现

学机器学习要学一些什么?机器学习和深度学习项目实战分享

均值模型

用于估计统计中位数、众数、偏度、峰度的“在线”(迭代器)算法?