m估计及其c++简单实现

文章目录

    • 什么是m估计
    • 怎么求解m估计呢?
    • Huber函数时的线性m估计

什么是m估计

自20世纪60年代稳健统计建立以来,在国内外众多学者的研究之下,诞生了一系列稳健统计重要理论和成果。其中最主要且广泛使用的稳健统计有以下三类:

  • L-estimators (linear combinations of order statistics of the observations);
  • R-estimators (estimator based on waste ranking);
  • M-estimators (generalizations of a Maximum Likelihood estimator)
    m估计可以翻译为通用的最大似然估计,其是由Huber提出的,是最常用的稳健统计方法。其标准形式为:

min ⁡ S ( x j ) = min ⁡ ∑ i = 1 n ρ ( r i ) (1) \min{S(x_j)}=\min \sum_{i=1}^n \rho(r_i)\tag{1} minS(xj)=mini=1nρ(ri)(1)
S 为目标函数, x j 为估计参数, ρ ( ) 为残差函数 , r i 为残差 S为目标函数,x_j为估计参数,\rho()为残差函数,r_i为残差 S为目标函数,xj为估计参数,ρ()为残差函数,ri为残差 ρ ( ) 残差函数需要满足以下性质: \rho()残差函数需要满足以下性质: ρ()残差函数需要满足以下性质:
连续性,偶函数,非负性,通过原点,在正半轴单调递增。
提出了很多的残差函数:Huber, l1-l2, Fair, Cauchy, Geman-McClure, Welsch, and Tukey estimators等等。

怎么求解m估计呢?

通常使用迭代加权最小二乘(Iterative Reweight Least Square, IRLS,有时也叫迭代选权最小二乘?)求解m估计。具体过程如下:
要求解的式1,一般需要对其求一阶偏导:
∂ S ∂ x j = ∑ i = 1 m d ρ ( r i ) d r i ∂ r i ∂ x j = 0 , j = 0 , … , n (2) \frac{\partial S}{\partial x_j}=\sum_{i=1}^m \frac{d \rho\left(r_i\right)}{d r_i} \frac{\partial r_i}{\partial x_j}=0, j=0, \ldots, n\tag{2} xjS=i=1mdridρ(ri)xjri=0,j=0,,n(2) ρ ( r ) \rho(r) ρ(r) 的一阶导数(梯度)为 ψ ( r ) = a ρ ( r ) d r , ψ ( r ) \psi(r)=\frac{a \rho(r)}{d r} , \psi(r) ψ(r)=draρ(r)ψ(r) 在M估计中被叫做影响力函数(Influence Function);
w ( r ) = ψ ( r ) r w(r)=\frac{\psi(r)}{r} w(r)=rψ(r) ,该函数在M估计中被叫做权重函数(Weight Function);
( 2 ) (2) (2) 变形:
∂ S ∂ x j = ∑ i = 1 m d ρ ( r i ) d r i ∂ r i ∂ x j = ∑ i = 1 m ψ ( r i ) ∂ r i ∂ x j = ∑ i = 1 m w ( r i ) r i ∂ r i ∂ x j = 0 (3) \frac{\partial S}{\partial x_j}=\sum_{i=1}^m \frac{d \rho\left(r_i\right)}{d r_i} \frac{\partial r_i}{\partial x_j}=\sum_{i=1}^m \psi\left(r_i\right) \frac{\partial r_i}{\partial x_j}=\sum_{i=1}^m w\left(r_i\right) r_i \frac{\partial r_i}{\partial x_j}=0\tag{3} xjS=i=1mdridρ(ri)xjri=i=1mψ(ri)xjri=i=1mw(ri)rixjri=0(3)

如果 w ( r i ) w\left(r_i\right) w(ri) 是一个常数,比如用上一次迭代优化的结果 x k x^k xk 的残差替换:
∑ i = 1 m w ( r i k ) r i ∂ r i ∂ x j = 0 (4) \sum_{i=1}^m w\left(r_i^k\right) r_i \frac{\partial r_i}{\partial x_j}=0\tag{4} i=1mw(rik)rixjri=0(4)

式(4)等价于 argmin ⁡ x 1 2 ∑ i = 1 m w i ( r i k ) . r i ( x ) 2 \underset{x}{\operatorname{argmin}} \frac{1}{2} \sum_{i=1}^m w_i\left(r_i^k\right). r_i(x)^2 xargmin21i=1mwi(rik).ri(x)2,即等价于加权最小二乘求解问题。由于权重函数的数值不是固定的,因此我们很自然地想到通过多次迭代求解加权最小二乘来得到的最终的 x x x.因此迭代加权最小二乘算法步骤如下:

  • (1)获取 x x x初值,线性最小二乘可以通过 x 0 = ( X T X ) − 1 X T Y x_0=(X^TX)^{-1}X^TY x0=(XTX)1XTY,非线性问题,可以通过别的方式获得
  • (2)利用得到的 x k x_k xk计算 ψ ( r ) \psi(r) ψ(r),再计算 w ( r ) w(r) w(r)
  • (3)利用权重求解 argmin ⁡ x 1 2 ∑ i = 1 m w i ( r i k ) . r i ( x ) 2 \underset{x}{\operatorname{argmin}} \frac{1}{2} \sum_{i=1}^m w_i\left(r_i^k\right). r_i(x)^2 xargmin21i=1mwi(rik).ri(x)2,获得新的 x k + 1 x_{k+1} xk+1.非线性问题可以通过梯度法,牛顿高斯法,牛顿法,共轭梯度法或者lm方法求解,线性问题可以利用 x k + 1 = ( X T W X ) − 1 X T W Y , W 为权重 x_{k+1}=(X^TWX)^{-1}X^TWY,W为权重 xk+1=(XTWX)1XTWY,W为权重
  • (4)若 ∣ x k + 1 − x k ∣ < ε |x_{k+1}-x_{k}|<\varepsilon xk+1xk<ε或者大于迭代次数,终止迭代,否则返回第二步

Huber函数时的线性m估计

对于Huber而言:
ρ ( r ) = { r 2 2 , ∣ r ∣ ≤ k k ∣ r ∣ − k 2 2 , ∣ r ∣ > k \rho(r)= \begin{cases}\frac{r^2}{2}, & |r| \leq k \\ k|r|-\frac{k^2}{2}, & |r|>k\end{cases} ρ(r)={2r2,kr2k2,rkr>k

φ ( r ) \varphi(\mathrm{r}) φ(r) ρ ( r ) \rho(\mathrm{r}) ρ(r) 的导数:
φ ( r ) = { − k r < − k r ∣ r ∣ ≤ k k r > k \varphi(r)=\left\{\begin{array}{cc} -k & r<-k \\ r & |r| \leq k \\ k & r>k \end{array}\right. φ(r)= krkr<krkr>k
权重函数 w ( r ) w(r) w(r):
w ( r ) = { − k r r < − k 1 ∣ r ∣ ≤ k k r r > k w(r)=\left\{\begin{array}{cc} \frac{-k}{r} & r<-k \\ 1 & |r| \leq k \\ \frac{k}{r} & r>k \end{array}\right. w(r)= rk1rkr<krkr>k
已知线性函数的自变量为 x i x_i xi,因变量为 y i y_i yi,设线性函数为 a x + b = 0 ax+b=0 ax+b=0,有残差 r i = a x i + b − y i r_i=ax_i+b-y_i ri=axi+byi,令:

A = [ x 1 1 x 2 1 . . . x i 1 . . . x n 1 ] , Y = [ y 1 y 2 . . . y i . . . y n ] , A= \begin{bmatrix} x_1&1\\ x_2&1\\ ...\\ x_i&1\\ ...\\ x_n&1 \end{bmatrix}, Y=\begin{bmatrix} y_1\\ y_2\\ ...\\ y_i\\ ...\\ y_n \end{bmatrix}, A= x1x2...xi...xn1111 ,Y= y1y2...yi...yn ,
有: r = A [ a , b ] T − Y r=A[a,b]^T-Y r=A[a,b]TY
对于最小二乘直接解为: a , b = ( X T X ) − 1 X T Y a,b=(X^TX)^{-1}X^TY a,b=(XTX)1XTY,对于加权最小二乘直接解为: a , b = ( X T W X ) − 1 X T W Y , W a,b=(X^TWX)^{-1}X^TWY,W a,b=(XTWX)1XTWY,W为权重.
codes:

#include <iostream>
#include<Eigen/Core>
#include<Eigen/Dense>
int main()
{const  int size = 7;const double k = 1.5;//huber超参数//y=2x+1double x[size]{ 1.0,2.1,2.9,5.01,8.093,6.0,3.0 };double y[size]{ 3.02,4.97,7.1,10.88,17.06 ,2.0,17.6};//初值Eigen::MatrixXd  A = Eigen::MatrixXd::Zero(size, 2);Eigen::MatrixXd  Y = Eigen::MatrixXd::Zero(size, 1);for (size_t i = 0; i < size; i++){A(i, 0) = x[i];A(i, 1) = 1;Y(i, 0) = y[i];}Eigen::MatrixXd ab0 = (A.transpose()*A).inverse()*A.transpose()*Y;std::cout << ab0 << std::endl;//残差Eigen::MatrixXd  R = Eigen::MatrixXd::Zero(size, 1);Eigen::MatrixXd  W = Eigen::MatrixXd::Zero(size, size);//对角阵//初值double a_k = ab0(0, 0);double b_k = ab0(1, 0);int iter_times = 1;while (true){for (size_t j = 0; j < size; j++){//计算残差R(j, 0) = a_k * x[j] + b_k - y[j];//计算Huber权重if (R(j, 0)<-1.0*k){W(j, j) = -1.0*k / R(j, 0);}else if (std::abs(R(j, 0)) < k){W(j, j) = 1.0;}else if (R(j, 0) > k){W(j, j) = k/ R(j, 0);}}Eigen::MatrixXd ab= (A.transpose()*W*A).inverse()*A.transpose()*W*Y;++iter_times;if (std::abs(ab(0,0)-a_k)<1e-3&&std::abs(ab(1, 0) - b_k) < 1e-3){std::cout << ab << std::endl;break;}else if(iter_times>20){std::cout << ab << std::endl;break;}else{a_k=ab(0,0);b_k = ab(1, 0);}}std::cout << "Hello World!\n"; std::cout << iter_times << std::endl;
}

结果:

a0=1.09263
b0=4.56053
a=1.83641
b=1.58977

在这里插入图片描述

直线h为直接最小二乘计算的结果,直线p为m估计的结果。
参考:
1
2
3
4
《A review on robust M-estimators for regression analysis》
《ROBUST ESTIMATION IN ROBOT VISION AND PHOTOGRAMMETRY: A NEW MODEL AND ITS APPLICATIONS》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/491362.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据集】世界水评估方案指标:灌溉面积/灌溉用水等

世界水评估方案指标 概述(Overview)数据下载(Data Download)案例1:F. Irrigated lands案例2:G. Irrigated water use参考World Water Development Report II-Indicators for World Water Assessment Programme 概述(Overview) 在关于全球环境变化和可持续发展的辩论…

搭建非maven spring boot项目 并且idea进行打包

1.所需jar包 2.搭建web项目 3 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class SpringBootTemplateApplications { public static void main(String\[\] ar…

利用缓冲区模拟进度条加载

界面呢非常简洁&#xff0c;代码也非常简单&#xff0c;非常适合有用来练手或者消遣。 以下就是进度条的样子咯&#xff0c;感兴趣的朋友可以自己去“美化”一下hh ProgressBar.c文件 用来定义ProcBar函数&#xff0c;该函数就是实现进度条的主核心代码&#xff0c;用“#”表示…

05 EXTI外部中断

一、中断系统 中断系统&#xff1a;管理和执行中断的逻辑结构。中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件——中断源&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继…

Java/Python/Go不同开发语言基础数据结构和相关操作总结-GC篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. 常见gc方式1.1 gc判断对象是否存活1.2 引用计数法1.2 标记-清除算法1.3 复制算法1.4 标记-压缩算法1.5 分代收集算法 2. java的gc方式以及垃圾回收器2.1 gc方式2.1 gc回收器2.1.1 Serial收集器2.1.2 ParNew收集器2.1.…

UE引擎, 在create blueprint from selection中, 点击select卡死问题处理

1. bug场景 在创建子类时点击select&#xff0c; ue会直接冻结无法点击 2. 解决方案 点击“Edit” -> “Edit Preference” 选择Asset Editor Open Location的选项从默认改为“Main Window”即可解决问题 3. 问题产生的原因 原因是UE的弹窗在拓展显示器或者笔记本显示…

2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024)

【EI检索】2024年环境安全科学、材料工程与制造国际学术会议&#xff08;ESSMEM2024) 会议简介 我们很高兴邀请您参加将在三亚举行的2024年环境安全科学、材料工程和制造国际学术会议&#xff08;ESSMEM 2024&#xff09;。 ESSMEM2024将汇集世界各国和地区的研究人员&…

微信小程序的医院体检预约管理系统springboot+uniapp+python

本系统设计的目的是建立一个简化信息管理工作、便于操作的体检导引平台。共有以下四个模块&#xff1a; uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 语言&#xff1a;pythonjavanode.js…

Jenkins自动化部署构建说明(8)

Jenkins构建说明 - 20211012 什么是Jenkins? Jenkins 是一款流行的开源持续集成&#xff08;Continuous Integration&#xff09;工具&#xff0c;广泛用于项目开发&#xff0c;具有自动化构建、测试和部署等功能。它是一个自动化的周期性的集成测试过程&#xff0c;从检出代…

【C++进阶】STL容器--list底层剖析(迭代器封装)

目录 前言 list的结构与框架 list迭代器 list的插入和删除 insert erase list析构函数和拷贝构造 析构函数 拷贝构造 赋值重载 迭代器拷贝构造、析构函数实现问题 const迭代器 思考 总结 前言 前边我们了解了list的一些使用及其注意事项&#xff0c;今天我们进一步深入…

自定义神经网络二之模型训练推理

文章目录 前言模型概念模型是什么&#xff1f;模型参数有哪些神经网络参数案例 为什么要生成模型模型的大小什么是大模型 模型的训练和推理模型训练训练概念训练过程训练过程中的一些概念 模型推理推理概念推理过程 总结 前言 自定义神经网络一之Tensor和神经网络 通过上一篇…

2.25 day5 QT

闹钟 .h代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJ…