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 Web开发模板引擎优缺点总结
May 06 Python
Python下的subprocess模块的入门指引
Apr 16 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
200行python代码实现2048游戏
Jul 17 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
python 线程的五个状态
Sep 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
Python实现iOS自动化打包详解步骤
2018/10/03 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
解决python 上传图片限制格式问题
2019/10/30 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
大学校园生活自我鉴定
2014/01/13 职场文书
擅自离岗检讨书
2014/09/12 职场文书
关于开学的感想
2015/08/10 职场文书
python 批量压缩图片的脚本
2021/06/02 Python