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+1
	double 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》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux之前后端项目部署与发布

目录 前言 简介 一、安装Nginx 二、后端部署 2.1多个tomcat负载均衡 2.2 负载均衡 2.3 后端项目部署 三、前端部署 1.解压前端 2.Nginx配置文件修改 3.IP域名映射 4.重启Nginx服务 前言 上篇博主已经讲解过了单机项目的部署linux之JAVA环境配置JDK&Tomcat&a…

【elasticsearch】搜索结果处理

搜索结果处理 排序 elasticsearch支持对搜索结果排序&#xff0c;默认是根据相关度算分&#xff08;_score&#xff09;来排序。可以排序字段类型有&#xff1a;keyword类型、数值类型、地理坐标类型、日期类型等。 GET /indexName/_search {"query":{"match_a…

java 内存模型

程序计数器 线程私有主要字节码解释器通过读取程序计数器来选取下一条需要执行的指令&#xff0c;比如分支&#xff0c;循环&#xff0c;跳转和异常处理如果执行的是java 方法&#xff0c;那么程序计数器记录的时候虚拟机字节码指令的地址&#xff0c;如果执行的是native 方法…

【FreeRTOS】任务管理

一、任务管理介绍 1.任务状态 1&#xff09;调度器切换任务调度 2&#xff09;任务是一个死循环&#xff0c;如果想要停止这个任务则会调用在函数最后写的delete函数进行自杀 1.就绪态 1&#xff09;已经具备执行的能力&#xff0c;只等待调度器进行调度。 2&#xff09;新创建…

Linux系统前后端分离项目

目录 一.jdk安装 二.tomcat安装 三.MySQL安装 四.nginx安装 五.Nginx负载均衡tomcat 六.前端部署 一.jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2. 解压安装包 这里需要解压到usr/local目录下&#xff0c;在这里新建一个…

python程序设计基础:异常处理结构与程序调试、测试

第八章&#xff1a;异常处理结构与程序调试、测试 简单地说,异常是指程序运行时引发的错误,引发错误的原因有很多例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。 如果这些错误得不到正确的处理将会导致程序终止运行,而合理…

HuggingFists系统功能介绍(1)--系统概述

HuggingFists是一款低代码AI应用工具&#xff0c;力图发展为LangChain的低代码平替工具。HuggingFists发起于数由科技的Sengee数据科学计算框架&#xff0c;因此其界面风格继承了数据科学工具的很多特征。有别于完全基于LangChain衍生出的低代码工具Flowise&#xff0c;其风格更…

YOLO如何训练自己的模型

目录 步骤 一、打标签 二、数据集 三、跑train代码出模型 四、跑detect代码出结果 五、详细操作 步骤 一、打标签 &#xff08;1&#xff09;在终端 pip install labelimg &#xff08;2&#xff09;在终端输入labelimg打开 如何打标签&#xff1a; 推荐文章&#xf…

2.23 Day05

#include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget) {ui->setupUi(this);//居中ui->label02->setAlignment(Qt::AlignCenter);ui->Edit1->setAlignment(Qt::Alig…

协程源码 launch 流程跟踪学习

为了更深入学习协程的底层实现原理&#xff0c;了解协程线程切换的根本本质。也为了以后在工作中可以根据不同的需求场景&#xff0c;更加随心所欲的使用不同的协程。 今天通过 launch 跟踪一下协程的执行流程。 fun getData() {Trace.beginSection("getData");Log.…

knife4j springboot3使用

简介 在日常开发中&#xff0c;写接口文档是我们必不可少的&#xff0c;而Knife4j就是一个接口文档工具&#xff0c;可以看作是Swagger的升级版&#xff0c;但是界面比Swagger更好看&#xff0c;功能更丰富 使用 我使用的是springboot3.2.3 knife4j 4.3.0,knife4j 4.4版本有…

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:主设备和次设备

🚀返回专栏总目录 文章目录 一、主设备和次设备的概念二、设备号的分配和释放沉淀、分享、成长,让自己和他人都能有所收获!😄 字符设备通过字符(一个接一个的字符)以流方式向用户程序传递数据,就像串行端口那样。字符设备驱动通过/dev目录下的特殊文件公开设备的属性和…

dolphinscheduler单机版部署教程

文章目录 前言一、安装准备1. 安装条件2. 安装jdk3. 安装MySQL 二、安装dolphinscheduler1. 下载并解压dolphinscheduler2. 修改配置文件2.1 修改 dolphinscheduler_env.sh 文件2.2 修改 application.yaml 文件 3. 配置mysql数据源3.1 修改MySQL安全策略3.2 查看数据库3.3 创建…

UE5 文字游戏(1) 仅UI截图转换为texture2d(适用于window端)

目录 需求 思路 1.截图并读取到本地 2.本地读取图片并转换为纹理2d 效果展示 找了好多的解决办法&#xff0c;都不管用。这个算是折中的。 需求 将当前的用户控件&#xff08;ui&#xff09;截图下来&#xff0c;并赋值到一个texture2d上。 我的需求&#xff1a;文字游戏…

golang通过http访问外部网址

不同项目之前,通过http访问,进行数据沟通 先设定一个接口,确认外部能访问到 PHP写一个接口 public function ceshi_return() {$data $this->request->param();$id $data[id];$res Db::name(user)->field(id,status,price,name)->where([id>$id])->find…

抖音视频抓取软件的优势|视频评论内容提取器|批量视频下载

抖音视频抓取软件在市场上的优势明显&#xff1a; 功能强大&#xff1a;我们的软件支持关键词搜索抓取和分享链接单一视频提取两种方式&#xff0c;满足用户不同的需求。同时&#xff0c;支持批量处理数据&#xff0c;提高用户获取视频的效率。 操作简单&#xff1a;我们的软件…

matlab|计及源荷不确定性的综合能源生产单元运行调度与容量配置随机优化模型

目录 1 主要内容 1.1 风光场景聚类 1.2 主模型程序结果 1.3 随机模型和确定性模型对比 1.4 有无储气对比 1.5 煤价灵敏性分析 1.6 甲烷价格灵敏性分析 2 部分程序 3 下载链接 1 主要内容 本程序复现《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机…

OpenGL ES (OpenGL) Compute Shader 计算着色器是怎么用的?

OpenGL ES (OpenGL) Compute Shader 是怎么用的? Compute Shader 是 OpenGL ES(以及 OpenGL )中的一种 Shader 程序类型,用于在GPU上执行通用计算任务。与传统的顶点着色器和片段着色器不同,Compute Shader 被设计用于在 GPU 上执行各种通用计算任务,而不是仅仅处理图形…

前端导出下载文件后提示无法打开文件

问题 项目中的导出文件功能&#xff0c;导出下载后的文件打开提示如下&#xff1a; 原因 对返回的响应数据进行打印&#xff0c;发现响应数据为字符串格式&#xff0c;前期规划的后端返回数据应该 blob 对象的。后经排查后发现是请求头缺少了响应数据格式的配置&#xff0c;应…

SpringMVC 学习(六)之视图

目录 1 SpringMVC 视图介绍 2 JSP 视图 3 Thymeleaf 视图 4 FreeMarker 视图 5 XSLT 视图 6 请求转发与重定向 6.1 请求转发 (Forward) 6.2 重定向 (Redirect) 7 视图控制器 (view-controller) 1 SpringMVC 视图介绍 在 SpringMVC 框架中&#xff0c;视图可以是一个 J…