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 15 Python
python各种语言间时间的转化实现代码
Mar 23 Python
python 类详解及简单实例
Mar 24 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
浅谈Python 参数与变量
Jun 20 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
python 常见的反爬虫策略
Sep 27 Python
python中mongodb包操作数据库
Apr 19 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
解决CodeIgniter伪静态失效
2014/06/09 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
php上传后台无法收到数据解决方法
2019/10/28 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
javascript常用的方法分享
2015/07/01 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
基于javascript实现的快速排序
2016/12/02 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python中的列表知识点汇总
2015/04/14 Python
django 修改server端口号的方法
2018/05/14 Python
python中cPickle类使用方法详解
2018/08/27 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
python中正则表达式与模式匹配
2019/05/07 Python
python程序如何进行保存
2020/07/03 Python
Python如何在bool函数中取值
2020/09/21 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
Unix如何在一行中运行多个命令
2015/05/29 面试题
音乐系毕业生自荐信
2013/10/27 职场文书
申报职称专业技术个人的自我评价
2013/12/12 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
寒假生活随笔
2015/08/15 职场文书