Python实现的简单线性回归算法实例分析


Posted in Python onDecember 26, 2018

本文实例讲述了Python实现的简单线性回归算法。分享给大家供大家参考,具体如下:

用python实现R的线性模型(lm)中一元线性回归的简单方法,使用R的women示例数据,R的运行结果:

> summary(fit)
Call:
lm(formula = weight ~ height, data = women)
Residuals:
    Min      1Q  Median      3Q     Max
-1.7333 -1.1333 -0.3833  0.7417  3.1167
Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept) -87.51667    5.93694  -14.74 1.71e-09 ***
height        3.45000    0.09114   37.85 1.09e-14 ***
---
Signif. codes:  0 ‘***' 0.001 ‘**' 0.01 ‘*' 0.05 ‘.' 0.1 ‘ ' 1
Residual standard error: 1.525 on 13 degrees of freedom
Multiple R-squared:  0.991, Adjusted R-squared:  0.9903
F-statistic:  1433 on 1 and 13 DF,  p-value: 1.091e-14

python实现的功能包括:

  1. 计算pearson相关系数
  2. 使用最小二乘法计算回归系数
  3. 计算拟合优度判定系数R2R2
  4. 计算估计标准误差Se
  5. 计算显著性检验的F和P值
import numpy as np
import scipy.stats as ss
class Lm:
  """简单一元线性模型,计算回归系数、拟合优度的判定系数和
  估计标准误差,显著性水平"""
  def __init__(self, data_source, separator):
    self.beta = np.matrix(np.zeros(2))
    self.yhat = np.matrix(np.zeros(2))
    self.r2 = 0.0
    self.se = 0.0
    self.f = 0.0
    self.msr = 0.0
    self.mse = 0.0
    self.p = 0.0
    data_mat = np.genfromtxt(data_source, delimiter=separator)
    self.xarr = data_mat[:, :-1]
    self.yarr = data_mat[:, -1]
    self.ybar = np.mean(self.yarr)
    self.dfd = len(self.yarr) - 2 # 自由度n-2
    return
  # 计算协方差
  @staticmethod
  def cov_custom(x, y):
    result = sum((x - np.mean(x)) * (y - np.mean(y))) / (len(x) - 1)
    return result
  # 计算相关系数
  @staticmethod
  def corr_custom(x, y):
    return Lm.cov_custom(x, y) / (np.std(x, ddof=1) * np.std(y, ddof=1))
  # 计算回归系数
  def simple_regression(self):
    xmat = np.mat(self.xarr)
    ymat = np.mat(self.yarr).T
    xtx = xmat.T * xmat
    if np.linalg.det(xtx) == 0.0:
      print('Can not resolve the problem')
      return
    self.beta = np.linalg.solve(xtx, xmat.T * ymat) # xtx.I * (xmat.T * ymat)
    self.yhat = (xmat * self.beta).flatten().A[0]
    return
  # 计算拟合优度的判定系数R方,即相关系数corr的平方
  def r_square(self):
    y = np.mat(self.yarr)
    ybar = np.mean(y)
    self.r2 = np.sum((self.yhat - ybar) ** 2) / np.sum((y.A - ybar) ** 2)
    return
  # 计算估计标准误差
  def estimate_deviation(self):
    y = np.array(self.yarr)
    self.se = np.sqrt(np.sum((y - self.yhat) ** 2) / self.dfd)
    return
  # 显著性检验F
  def sig_test(self):
    ybar = np.mean(self.yarr)
    self.msr = np.sum((self.yhat - ybar) ** 2)
    self.mse = np.sum((self.yarr - self.yhat) ** 2) / self.dfd
    self.f = self.msr / self.mse
    self.p = ss.f.sf(self.f, 1, self.dfd)
    return
  def summary(self):
    self.simple_regression()
    corr_coe = Lm.corr_custom(self.xarr[:, -1], self.yarr)
    self.r_square()
    self.estimate_deviation()
    self.sig_test()
    print('The Pearson\'s correlation coefficient: %.3f' % corr_coe)
    print('The Regression Coefficient: %s' % self.beta.flatten().A[0])
    print('R square: %.3f' % self.r2)
    print('The standard error of estimate: %.3f' % self.se)
    print('F-statistic: %d on %s and %s DF, p-value: %.3e' % (self.f, 1, self.dfd, self.p))

python执行结果:

The Regression Coefficient: [-87.51666667   3.45      ]
R square: 0.991
The standard error of estimate: 1.525
F-statistic:  1433 on 1 and 13 DF,  p-value: 1.091e-14

其中求回归系数时用矩阵转置求逆再用numpy内置的解线性方程组的方法是最快的:

a = np.mat(women.xarr); b = np.mat(women.yarr).T
timeit (a.I * b)
99.9 µs ± 941 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
timeit ata.I * (a.T*b)
64.9 µs ± 717 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
timeit np.linalg.solve(ata, a.T*b)
15.1 µs ± 126 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现获取域名所用服务器的真实IP
Oct 25 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
Python设计模式之状态模式原理与用法详解
Jan 15 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
python 遍历pd.Series的index和value
Nov 26 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
python中二分查找法的实现方法
Dec 06 Python
如何利用python生成MD5并去重
Dec 07 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 Python
Python使用DFA算法过滤内容敏感词
Apr 22 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 #Python
python使用knn实现特征向量分类
Dec 26 #Python
python调用staf自动化框架的方法
Dec 26 #Python
Django unittest 设置跳过某些case的方法
Dec 26 #Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 #Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 #Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 #Python
You might like
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
php文件上传的简单实例
2013/10/19 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
计算机维护专业推荐信
2014/02/27 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
工程承诺书怎么写
2014/05/24 职场文书
宣传普通话标语
2014/06/27 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
酒店员工管理制度
2015/08/05 职场文书
反邪教学习心得体会
2016/01/15 职场文书
React如何创建组件
2021/06/27 Javascript
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers