稳健性回归(RANSAC)

  New Question:

  如何在存在有损数据(异常值或错误)的情况下拟合回归模型?

  Answer:

  scikit-learn提供了3种稳健性回归估计方法:

  1.随机抽样一致性算法(RANSAC)

  2.泰森回归(Theil Sen)

  3.Huber回归

  RANSAC(Random Sample Consensus)算法:

  步骤:

  1)从原始数据中随机选择一些样本作为“内点”;

  2)从1中选择的样本拟合模型;

  3)利用模型计算其他样本的残差,若某个样本残差小于预先设置的阈值t。则将其加入内点,将内点中的样本量扩充;

  4)用扩充后的内点拟合模型,计算均方误差;

  5)重复1-4步,最终选取均方误差最小的模型。

  下图给出了具体方法:

稳健性回归(RANSAC)

 

  具体参数:

  base_estimator:用于线性回归模型选择,默认None(LinearRegression())

  min_samples:从原始数据随机选择的最小样本数

  residual_threshold:被归为内点数据的最大残差

  max_trails:随机样本选择的最大迭代次数

  stop_n_inliers:停止迭代的内点数目阈值

  stop_score:停止迭代的得分阈值

  loss:每个样本的损失计算方法,默认为“absolute_loss”(绝对损失),还可选择“squared_loss”(平方和损失)

  属性:

  estimator:返回base_estimator中的最佳拟合模型

  inlier_mask:标记数据是否为内点

  构建模拟数据集利用稳健性回归预测:

import numpy as np
from sklearn import datasets
#模拟数据集
n_samples = 2000
n_outliers = 200

#创建用于一元回归的数据
X,Y,coef = datasets.make_regression(n_samples = n_samples, n_features = 1, n_informative = 1, noise = 20, random_state = 1, coef = True)
#添加噪音数据
X[:n_outliers] = 3+0.5 * np.random.normal(size = (n_outliers , 1))
Y[:n_outliers] = 3+np.random.normal(size=n_outliers)

#应用线性回归和RANSAC做回归
from sklearn.linear_model import LinearRegression , RANSACRegressor
lr = LinearRegression()
lr.fit(X,Y)

RAN = RANSACRegressor()
RAN.fit(X,Y)
inlier = RAN.inlier_mask_
outlier = np.logical_not(inlier)

#回归结果
line_X = np.arange(X.min(),X.max())[:,np.newaxis]
lr_y = lr.predict(line_X)
RAN_Y = RAN.predict(line_X)

#做出线性回归和RANSAC回归的图像
import matplotlib.pyplot as plt
plt.scatter(X[inlier],Y[inlier],color = 'yellowgreen', marker = '.', label = 'Inliers')
plt.scatter(X[outlier],Y[outlier],color = 'gold', marker = '.', label = 'Outliers')
plt.plot(line_X,lr_y, color = 'navy', marker = '.', label = 'Linear regressor')
plt.plot(line_X,RAN_Y,color = 'cornflowerblue', linewidth = 2, label = 'RANSACregressor')

  得到结果:

稳健性回归(RANSAC)

 

  深蓝色线代表构建的线性回归模型,浅蓝色线构建的是稳健性回归(RANdom SAmple Consensus)模型;

  可以看见,稳健性回归不受黄色数据点(离群点)影响,而线性回归受离群点影响较大。

  

 

 

  

上一篇:基于图像的三维重建——三角测量(4)


下一篇:RANSAC及其经典变种