设为首页 加入收藏

TOP

线性回归
2017-09-30 17:03:17 】 浏览:3441
Tags:线性 回归

回归拟合是最基础的数据分析方法,而线性回归又是最基础的回归拟合。对于分布非常集中的数据,可以直接采用最小二乘法进行回归拟合。甚至,我们可以直接把数据放到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 学习之路 下一篇eclipse + pydev

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目