线性回归

Posted Apple@Jing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性回归相关的知识,希望对你有一定的参考价值。

回归拟合是最基础的数据分析方法,而线性回归又是最基础的回归拟合。对于分布非常集中的数据,可以直接采用最小二乘法进行回归拟合。甚至,我们可以直接把数据放到excel表格中,使用excel直接进行拟合。然而,当数据中含有噪声的时候,必须采用新的算法过滤噪声点。

在此,介绍一种RANSAC(Random sample consensus)算法。

上图为采用sklearn的RANSAC算法进行线性拟合的结果图。如图所示,图中绿色点被RANSAC算法识别为inliers,而黄色点被RANSAC算法识别为outliers。

 1 import numpy as np
 2 from matplotlib import pyplot as plt
 3 
 4 from sklearn import linear_model, datasets
 5 
 6 
 7 n_samples = 1000
 8 n_outliers = 50
 9 
10 
11 X, y, coef = datasets.make_regression(n_samples=n_samples, n_features=1,
12                                       n_informative=1, noise=10,
13                                       coef=True, random_state=0)
14 
15 # Add outlier data
16 np.random.seed(0)
17 X[:n_outliers] = 3 + 0.5 * np.random.normal(size=(n_outliers, 1))
18 y[:n_outliers] = -3 + 10 * np.random.normal(size=n_outliers)
19 
20 # Fit line using all data
21 model = linear_model.LinearRegression()
22 model.fit(X, y)
23 
24 # Robustly fit linear model with RANSAC algorithm
25 model_ransac = linear_model.RANSACRegressor(linear_model.LinearRegression())
26 model_ransac.fit(X, y)
27 inlier_mask = model_ransac.inlier_mask_
28 outlier_mask = np.logical_not(inlier_mask)
29 
30 # Predict data of estimated models
31 line_X = np.arange(-5, 5)
32 line_y = model.predict(line_X[:, np.newaxis])
33 line_y_ransac = model_ransac.predict(line_X[:, np.newaxis])
34 
35 # Compare estimated coefficients
36 print("Estimated coefficients (true, normal, RANSAC):")
37 print(coef, model.coef_, model_ransac.estimator_.coef_)
38 
39 lw = 2
40 plt.scatter(X[inlier_mask], y[inlier_mask], color=\'yellowgreen\', marker=\'.\',
41             label=\'Inliers\')
42 plt.scatter(X[outlier_mask], y[outlier_mask], color=\'gold\', marker=\'.\',
43             label=\'Outliers\')
44 plt.plot(line_X, line_y, color=\'navy\', linestyle=\'-\', linewidth=lw,
45          label=\'Linear regressor\')
46 plt.plot(line_X, line_y_ransac, color=\'cornflowerblue\', linestyle=\'-\',
47          linewidth=lw, label=\'RANSAC regressor\')
48 plt.legend(loc=\'lower right\')
49 plt.show()

 上述代码从sklearn中复制而来,具体路径如下

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RANSACRegressor.html

补充说明:针对RANSAC算法,我在使用过程中发现执行一次算法没有找到正确的直线。后面我在该算法外面加了一个for循环,这样多执行几次之后,就可以找到真正的inliers集合,拟合出的曲线效果非常好。当然,由于多次执行RANSAC算法,这就导致很多inliers被判定为outliers。但是,考虑我最终的目的是获取这条直线,只要保证最终的inliers集合确实正确即可。


以上是关于线性回归的主要内容,如果未能解决你的问题,请参考以下文章

线性回归详解(代码实现+理论证明)

机器学习入门 ----线性回归模型及其Python代码解析

线性回归模型|机器学习

Python应用实战线性回归(附Python代码)

如何用matlab线性回归分析?

贝叶斯线性回归和多元线性回归构建工资预测模型|附代码数据