稳健回归(Robustness regression)

2023-11-04

稳健回归(Robustness regression)

标签(空格分隔): 监督学习


@ author : duanxxnj@163.com
@ time : 2016-07-08


最小二乘法的弊端

之前文章里的关于线性回归的模型,都是基于最小二乘法来实现的。但是,当数据样本点出现很多的异常点(outliers),这些异常点对回归模型的影响会非常的大,传统的基于最小二乘的回归方法将不适用。

比如下图中所示,数据中存在一个异常点,如果不剔除改点,适用OLS方法来做回归的话,那么就会得到途中红色的那条线;如果将这个异常点剔除掉的话,那么就可以得到图中蓝色的那条线。显然,蓝色的线比红色的线对数据有更强的解释性,这就是OLS在做回归分析时候的弊端。

8.png-6.5kB

当然,可以考虑在做回归分析之前,对数据做预处理,剔除掉那些异常点。但是,在实际的数据中,存在两个问题:

  1. 异常点并不能很好的确定,并没有一个很好的标准用于确定哪些点是异常点
  2. 即便确定了异常点,但这些被确定为异常的点,真的是错误的数据吗?很有可能这看似异常的点,就是原始模型的数据,如果是这样的话,那么这些异常的点就会带有大量的原始模型的信息,剔除之后就会丢失大量的信息。

再比如下面这幅图,其中红色的都是异常点,但是很难从数据中剔除出去。

255px-Fitted_line.svg.png-8.2kB

稳健回归

稳健回归(Robust regression),就是当最小二乘法遇到上述的,数据样本点存在异常点的时候,用于代替最小二乘法的一个算法。当然,稳健回归还可以用于异常点检测,或者是找出那些对模型影响最大的样本点。

Breakdown point

关于稳健回归,有一个名词需要做解释:Breakdown point,这个名词我并不想翻译,我也没找到一个很好的中文翻译。对于一个估计器而言,原始数据中混入了脏数据,那么,Breakdown point 指的就是在这个估计器给出错误的模型估计之前,脏数据最大的比例 α ,Breakdown point 代表的是一个估计器对脏数据的最大容忍度。

举个简单的例子:有 n 个随机变量,(X1,X2,,Xn), 其对应的数据为 (x1,x2,,xn) ,那么,我么可以求出这 n 个随机变量的均值:

X¯¯¯=X1+X2++Xnn

这个均值估计器的Breakdown point 为0,因为使任意一个 xi 变成足够大的脏数据之后,上面估计出来的均值,就不再正确了。

毫无疑问,Breakdown point越大,估计器就越稳健。

Breakdown point 是不可能达到 50% 的,因为如果总体样本中超过一半的数据是脏数据了,那么从统计上来说,就无法将样本中的隐藏分布和脏数据的分布给区分开来。

本文主要介绍两种稳健回归模型:RANSAC(RANdom SAmple Consensus 随机采样一致性)和Theil-Sen estimator。

RANSAC随机采样一致性算法

RANSAC算法的输入是一组观测数据(往往含有较大的噪声或无效点),它是一种重采样技术(resampling technique),通过估计模型参数所需的最小的样本点数,来得到备选模型集合,然后在不断的对集合进行扩充,其算法步骤为:

  1. 随机的选择估计模型参数所需的最少的样本点。
  2. 估计出模型的参数。
  3. 找出在误差 ϵ 内,有多少点适合当前这个模型,并将这些点标记为模型内点
  4. 如果内点的数目占总样本点的比例达到了事先设定的阈值 τ ,那么基于这些内点重新估计模型的参数,并以此为最终模型, 终止程序。
  5. 否则重复执行1到4步。

RANSAC算法是从输入样本集合的内点的随机子集中学习模型。

RANSAC算法是一个非确定性算法(non-deterministic algorithm),这个算法只能得以一定的概率得到一个还不错的结果,在基本模型已定的情况下,结果的好坏程度主要取决于算法最大的迭代次数。

RANSAC算法在线性和非线性回归中都得到了广泛的应用,而其最典型也是最成功的应用,莫过于在图像处理中处理图像拼接问题,这部分在Opencv中有相关的实现。

从总体上来讲,RANSAC算法将输入样本分成了两个大的子集:内点(inliers)和外点(outliers)。其中内点的数据分布会受到噪声的影响;而外点主要来自于错误的测量手段或者是对数据错误的假设。而RANSAC算法最终的结果是基于算法所确定的内点集合得到的。

下面这份代码是RANSAC的适用实例:

# -*- coding: utf-8 -*-

"""
author : duanxxnj@163.com
time : 2016-07-07-15-36



"""

import numpy as np
import time
from sklearn import linear_model,datasets

import matplotlib.pyplot as plt

# 产生数据样本点集合
# 样本点的特征X维度为1维,输出y的维度也为1维
# 输出是在输入的基础上加入了高斯噪声N(0,10)
# 产生的样本点数目为1000个

n_samples = 1000
X, y, coef = datasets.make_regression(n_samples=n_samples,
                                      n_features=1,
                                      n_informative=1,
                                      noise=10,
                                      coef=True,
                                      random_state=0)

# 将上面产生的样本点中的前50个设为异常点(外点)
# 即:让前50个点偏离原来的位置,模拟错误的测量带来的误差
n_outliers = 50
np.random.seed(int(time.time()) % 100)
X[:n_outliers] = 3 + 0.5 * np.random.normal(size=(n_outliers, 1))
y[:n_outliers] = -3 + 0.5 * np.random.normal(size=n_outliers)

# 用普通线性模型拟合X,y
model = linear_model.LinearRegression()
model.fit(X, y)

# 使用RANSAC算法拟合X,y
model_ransac = linear_model.RANSACRegressor(linear_model.LinearRegression())
model_ransac.fit(X, y)
inlier_mask = model_ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)

# 使用一般回归模型和RANSAC算法分别对测试数据做预测
line_X = np.arange(-5, 5)
line_y = model.predict(line_X[:, np.newaxis])
line_y_ransac = model_ransac.predict(line_X[:, np.newaxis])

print "真实数据参数:", coef
print "线性回归模型参数:", model.coef_
print "RANSAC算法参数: ", model_ransac.estimator_.coef_


plt.plot(X[inlier_mask], y[inlier_mask], '.g', label='Inliers')
plt.plot(X[outlier_mask], y[outlier_mask], '.r', label='Outliers')
plt.plot(line_X, line_y, '-k', label='Linear Regression')
plt.plot(line_X, line_y_ransac, '-b', label="RANSAC Regression")
plt.legend(loc='upper left')
plt.show()

figure_1-1.png-46.8kB

运行结果为:

真实数据参数: 82.1903908408
线性回归模型参数: [ 55.19291974]
RANSAC算法参数:  [ 82.08533159]

Theil-Sen Regression 泰尔森回归

Theil-Sen回归是一个参数中值估计器,它适用泛化中值,对多维数据进行估计,因此其对多维的异常点(outliers 外点)有很强的稳健性。

一般的回归模型为:

y=α+βx+ϵ

其中, α,β 模型的参数,而 ϵ 为模型的随机误差。

Theil-Sen回归则是这么处理的:

β=Median{yiyjxixj:xixj,i<j=1,,n}

在实践中发现,随着数据特征维度的提升,Theil-Sen回归的效果不断的下降,在高维数据中,Theil-Sen回归的效果有时甚至还不如OLS(最小二乘)。

在之间的文章《线性回归》中讨论过,OLS方法是渐进无偏的,Theil-Sen方法在渐进无偏方面和OLS性能相似。和OLS方法不同的是,Theil-Sen方法是一种非参数方法,其对数据的潜在分布不做任何的假设。Theil-Sen方法是一种基于中值的估计其,所以其对异常点有更强的稳健性。

在单变量回归问题中,Theil-Sen方法的Breakdown point为29.3%,也就是说,Theil-Sen方法可以容忍29.3%的数据是outliers。

# -*- coding: utf-8 -*-

"""

@author : duanxxnj@163.com
@time ;2016-07-08_08-50

Theil-Sen 回归

本例生成一个数据集,然后在该数据集上测试Theil-Sen回归

"""

print __doc__

import time
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, TheilSenRegressor,\
                                 RANSACRegressor

estimators = [('OLS', LinearRegression()),
              ('Theil-Sen', TheilSenRegressor())]

# 异常值仅仅出现在y轴
np.random.seed((int)(time.time() % 100))
n_samples = 200

# 线性模型的函数形式为: y = 3 * x + N(2, .1 ** 2)
x = np.random.randn(n_samples)
w = 3.
c = 2.
noise = c + 0.1 * np.random.randn(n_samples)
y = w * x + noise

# 加入10%的异常值,最后20个值称为异常值
y[-20:] += -20 * x[-20:]

X = x[:, np.newaxis]
plt.plot(X, y, 'k+', mew=2, ms=8)
line_x = np.array([-3, 3])

for name, estimator in estimators:
    t0 = time.time()
    estimator.fit(X, y)
    elapsed_time = time.time() - t0
    y_pred = estimator.predict(line_x.reshape(2, 1))
    plt.plot(line_x, y_pred, label='%s (fit time: %.2fs)'
             %(name, elapsed_time))

plt.axis('tight')
plt.legend(loc='upper left')

plt.show()

figure_1-1.png-32.2kB

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

稳健回归(Robustness regression) 的相关文章

随机推荐

  • 分支结构 --> if else分支结构

    if else分支结构 if 条件表达式 语句块1 else 语句块2 判断条件表达式是否成立 gt 若成立 则执行语句块1 gt 若不成立 则执行语句块2 package demo 编程使用if else分支结构来模拟考试成绩查询的过程
  • 关于DOTS的个人总结

    网上已经有比较多的DOTS的资料了 这里就简单介绍一下 DOTS Data Oriented Technology Stack 数据导向型技术栈 的缩写 是Unity退出的面向多线程编程的解决方案 其包含了 C Job System Ent
  • 如何根据芯片手册时序图编写驱动程序

    如何根据芯片手册时序图编写驱动程序 对于电子开发者来说 刚刚拿到一个芯片 常用的芯片可以参考网上的例程来做深入了解 对于一个不常用的芯片来说 Datasheet几乎是使用芯片的唯一的资料 所以根据Datasheet时序图写出对应的驱动程序就
  • vue样式穿透(::v-deep,/deep/的使用)

    在 vue 项目的开发过程 使用了vant ElementUI antdui等组件且样式 style 使用了 scoped 属性 当想要修改组件样式 发现直接修改不了 需去掉 scoped 属性或者使用深度选择器才能修改成功 去掉scope
  • GD32F190 ADC多通道DMA自动接收踩坑指南

    如果条件允许的话 请不要用GD32F1x0系列 题记 这个系列的芯片官方连个库函数指南都没有你敢信 我都不要求中文版的了 起码英文版的得有吧 以往stm32的ADC工作模式 一般都是配置成多个通道自动连续切换 然后通过DMA把数据读走 这次
  • Vue和React的区别和优势对比

    相同点 1 都使用了 Virtual DOM 虚拟DOM 2 都支持服务器端渲染 3 提供了响应式 Reactive 和组件化 Composable 的视图组件 4 都有 props 的概念 这是properties的简写 props在组件
  • 办公室共享打印机怎么连接?

    每个办公室内 必不可少的就是打印机 但是也不可能给每个人都配备一台打印机吧 为了方便打印 可以局域网设置让多台电脑共享一台打印机 下面就来看看连接办公室共享打印机的方法 1 在桌面上打开我的电脑 2 打开控制面板 找到查看和打印机 打开 3
  • MTF浅谈概论,SFR原理,CTF,各自优缺点

    MTF浅谈概论 SFR原理 CTF 各自优缺点 好像很多人很多地方 不管什么样的清晰度测试都通通叫MTF 比如用线对的方式测的对比度也叫MTF SFR 也叫MTF 其实如果将MTF作为一个统称概念不是不行 但容易造成很多人混淆 概念模糊 尤
  • Unity动画系统简单介绍

    Unity动画系统知识点简单介绍 简易 本文是学习文 其中转载某些文章 如有侵权 联系删除 学习要点 1 动画的分类 游戏物体的基础动画设置 UGUI设置的按钮状态 2D游戏Sprite动画 Root Motion设置 人物模型动画设置 1
  • Opencv中的轮廓检测及应用

    在openCV中 我们可以对图片的轮廓进行检测 虽然轮廓的检测看起来很简单 只是对一个图形的边框进行描绘 但是 它在很多领域上都应用到了 例如 人脸识别 车辆检测 视频采集等 下面我会通过人脸识别和车辆检测两部分为大家展示 1 轮廓的概述
  • linux中gcc指令,Linux GCC命令备忘

    简介 gcc GNU C Compiler 但不局限于c语言 还支持C JAVA OBJECIVE C PASCAL等 变成了GNU Complier Collection 即GNU编译器家族 几个简单的指令 gcc hello c o h
  • pytorch如何计算平方_如何使用pytorch自动求梯度

    构建深度学习模型的基本流程就是 搭建计算图 求得损失函数 然后计算损失函数对模型参数的导数 再利用梯度下降法等方法来更新参数 搭建计算图的过程 称为 正向传播 这个是需要我们自己动手的 因为我们需要设计我们模型的结构 由损失函数求导的过程
  • 关于ICMP简介

    ICMP 简介 ICMP是 Internet Control Message Protocol Internet控制报文协议 ICMP协议是一种面向无连接的协议 它是TCP IP协议族的一个子协议 用于在IP主机 路由器之间传递控制消息 I
  • 不作35岁的程序员

    http blog chinaunix net uid 28647963 id 3540115 html 在中国 程序员不能超过35岁 似乎已经是不争的事实 软件开发工作就是青春饭 顶多靠毕业这十年的时间 超过这个年龄 要不成功跃身成为管理
  • UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)

    官方介绍https docs unrealengine com en us Programming UnrealArchitecture Objects The UCLASS macro gives the UObject a refere
  • python3中使用pip3错误syn_python-pip3错误-'_NamespacePath'对象没有属性'sort'

    python pip3错误 NamespacePath 对象没有属性 sort 我尝试通过pip3安装软件包 但出现此错误 我运行的每个pip pip3命令都会给我这个错误 alexg hitbox pip3 V Traceback mos
  • 2021全国计算机3月试题,2021年3月全国计算机等级考试二级MS Office高级应用历年真题与模拟试题答案分析_圣考资料网...

    部分 历年真题及详解 2016年3月全国计算机等级考试 二级MS Office高级应用 真题及详解 考试时间120分钟 满分100分 一 单选题 每小题1分 共20分 1 软件按功能可以分为应用软件 系统软件和支撑软件 工具软件 下面属于应
  • 周末用Python兼职赚了5000,分享一些接单技巧

    大家最近过得开心吗 元旦假日将至 Python副业圈子里的朋友们一定很开心 每年年末都是Python技术变现旺季 尤其是在目前这种大厂都缺人的特殊时期 私活订单多到接不完 很多人都在接单 近两年开辟副业兼职赚钱的人越来越多 我们似乎进入了一
  • vscode统计代码行数,前端开发配置、快捷键使用

    1 统计代码行数 使用场景是项目年终统计行数 实现 在需要统计得文件夹右键 在文件夹中查找 后输入筛选得正则表达式 b b 注意右边小图标都点亮 这里顺便将自己使用vscode进行前端开发环境配置归纳一下 便于自己以后快速搭建 vscode
  • 稳健回归(Robustness regression)

    稳健回归 Robustness regression 标签 空格分隔 监督学习 author duanxxnj 163 com time 2016 07 08 稳健回归Robustness regression 最小二乘法的弊端 稳健回归