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

news2025/1/19 11:07:30

文章目录

    • 什么是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》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习系列60: 大模型文本理解和生成概述

参考网络课程&#xff1a;https://www.bilibili.com/video/BV1UG411p7zv/?p98&spm_id_frompageDriver&vd_source3eeaf9c562508b013fa950114d4b0990 1. 概述 包含理解和分类两大类问题&#xff0c;对应的就是BERT和GPT两大类模型&#xff1b;而交叉领域则对应T5 2.…

【深度学习:视频注释】如何为机器学习自动执行视频注释

【深度学习&#xff1a;视频注释】如何为机器学习自动执行视频注释 #1&#xff1a;多目标跟踪 &#xff08;MOT&#xff09; 以确保帧与帧之间的连续性#2&#xff1a;使用插值来填补空白#3: 使用微模型加速人工智能辅助视频注释#4: 自动目标分割提高目标分割质量 自动视频标记通…

Sora将创造多少算力需求?

1.1 Sora 训练与推理算力需求初步测算 Sora发布表现亮眼&#xff0c;TransformerDiffusion架构或成为文生视频大模型新范式。据Sora技术报告&#xff0c;类似于LLM将不同文本数据统一为token&#xff0c;Sora可将不同类型的视频和图像等视觉数据统一为patches&#xff0c;具体…

<script> 标签中的type

typetext/javascript typeapplication/javascript 前者是比较早的版本&#xff0c;已经废弃&#xff0c;但是浏览器大都还支持 后者是最新的规范&#xff0c;但是会有兼容性问题&#xff0c;不兼容ie6-10 typeapplication/json 比较特殊&#xff0c;不常用 简单示例 <!DOCTY…

设计模式学习笔记 - 面向对象 - 7.为什么要多用组合少用继承?如何决定该用组合还是继承?

前言 在面向对象编程中&#xff0c;有一条非常经典的设计原则&#xff1a;组合优于继承&#xff0c;多用组合少用继承。 为什么不推荐使用继承&#xff1f; 组合比继承有哪些优势&#xff1f; 如何判断该用组合还是继承&#xff1f; 为什么不推荐使用继承&#xff1f; 继承…

如何在本地电脑部署HadSky论坛并发布至公网可远程访问【内网穿透】

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

uvloop,一个强大的 Python 异步IO编程库!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 ​编辑 前言 什么是uvloop库&#xff1f; 安装uvloop库 使用uvloop库 uvloop库的功能特性 1. 更…

redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案

缓存穿透 问题原因 解决方案 缓存并发 缓存雪崩 缓存失效时间设置一致导致的。 解决方案&#xff1a; 1&#xff09;方案一 2&#xff09;方案二 如何设计一个缓存策略&#xff0c;缓存热点数据&#xff1f;

自动化部署证书 acme.sh 使用教程

简介 acme.sh 是一个开源的 ACME 协议的客户端工具&#xff0c;用于自动化申请、更新和部署 SSL/TLS 证书。通过使用 acme.sh&#xff0c;用户可以轻松地在服务器上设置 HTTPS 加密连接&#xff0c;而无需手动操作。它支持多种 DNS 接口和证书颁发机构&#xff0c;可以与各种 …

多进程完成文件拷贝:2024/2/20(已修改)

作业1&#xff1a;使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 代码&#xff1a; #include<myhead.h>//定义获取文件长度的函数 int get_file_len(const char *srcfile, const char *de…

静态时序分析:SDC约束命令set_drive详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 目录 指定电阻值 指定端口列表 简单使用 指定上升、下降沿 指定最大最小、条件 写在最后 本章将讨论使用set_drive命令&#xff0c;它用于对输入端口的驱动能力建模。首先需要说明的…

【计算机网络】深度学习使用应用层的HTTP协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【计算机网络】深度学习使用应用层的HTTP协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 一:HTTP是什么二:HTTP请求1.HTTP请求的组成2.HTTP请求的方法…

freeswitch 权威指南 --- 高级篇

官网文档&#xff1a;https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程&#xff1a;https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》&#xff1a;目录&#xff1a;https://juejin.cn/post/702058079…

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…

STL - 图

1、图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 顶点集合 V {x|x属于某个数据对象集}是有穷非空集合&#xff1b; 边的集合 E {(x,y)|x,y属于V}或者E {<x&#xff0c;y>|x,y属于V …

1_怎么看原理图之GPIO和门电路笔记

一、GPIO类 如下图&#xff1a;芯片输出高电平/3.3V&#xff0c;LED亮&#xff1b;当芯片输出低电平&#xff0c;则LED暗 如下图&#xff1a;输入引脚&#xff0c;当开关闭合&#xff0c;则输入为低电平/0V&#xff0c;当开关打开&#xff0c;则输入为高电平/3.3V 现在的引脚都…

前端本地化部署

前言 现在成熟的前端团队里面都有自己的内部构建平台&#xff0c;我司云长便是我们 CI/CD 的提效利器。我先来简单介绍下我司的云长&#xff0c;此云长非彼云长&#xff0c;云长主要做的是&#xff1a;获取部署的项目&#xff0c;分支&#xff0c;环境基本信息后开始拉取代码&…

Servlet使用Cookie和Session

一、会话技术 当用户访问web应用时&#xff0c;在许多情况下&#xff0c;web服务器必须能够跟踪用户的状态。比如许多用户在购物网站上购物&#xff0c;Web服务器为每个用户配置了虚拟的购物车。当某个用户请求将一件商品放入购物车时&#xff0c;web服务器必须根据发出请求的…

大厂面试-美团高频考察算法之重排链表

本文学习目标或巩固的知识点 学习如何处理链表重排类题目 巩固反转链表巩固快慢指针巩固合并链表 提前说明&#xff1a;算法题目来自力扣、牛客等等途径 &#x1f7e2;表示简单 &#x1f7e1;表示中等 &#x1f534;表示困难 &#x1f92e;表示恶心 博主真实经历&#xff0c;…

docker-compose 搭建laravel环境

laravel环境包含nginx,mysql,php7.4,redis 一、安装好docker后pull镜像 1.nginx镜像 docker pull nginx:latest单独启动容器 docker run --name nginx -p 80:80 -d nginx 2.php镜像 docker pull php:7.4-fpm3.mysql镜像 docker pull mysql:5.74.redis镜像 docker pull r…