标签:plt ict 回归 rand regress 目的 class nes with
回归拟合是最基础的数据分析方法,而线性回归又是最基础的回归拟合。对于分布非常集中的数据,可以直接采用最小二乘法进行回归拟合。甚至,我们可以直接把数据放到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集合确实正确即可。
标签:plt ict 回归 rand regress 目的 class nes with
原文地址:http://www.cnblogs.com/wangjingchn/p/7302451.html