码迷,mamicode.com
首页 > 其他好文 > 详细

线性回归

时间:2017-08-08 00:37:38      阅读:302      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!