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比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 Python
详解python的webrtc库实现语音端点检测
May 31 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
python调用摄像头显示图像的实例
Aug 03 Python
python3.7.0的安装步骤
Aug 27 Python
Python 字符串换行的多种方式
Sep 06 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
详解python中的time和datetime的常用方法
Jul 08 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 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 CURL 内存泄露问题解决方法
2015/02/12 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
python读取二进制mnist实例详解
2017/05/31 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
美国知名生活购物网站:Goop
2017/11/03 全球购物
优秀的茶餐厅创业计划书
2014/01/03 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
小学毕业感言150字
2014/02/05 职场文书
大学秋游活动方案
2014/02/11 职场文书
班主任新年寄语
2014/04/04 职场文书
工作会议方案
2014/05/21 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
武夷山导游词
2015/02/03 职场文书
会议室管理制度范本
2015/08/06 职场文书
团队拓展训练感想
2015/08/07 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript