线性回归
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集合确实正确即可。
以上是关于线性回归的主要内容,如果未能解决你的问题,请参考以下文章