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中的len()函数的使用
Apr 07 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
解决Python中回文数和质数的问题
Nov 24 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 Python
python使用多线程查询数据库的实现示例
Aug 17 Python
Python如何在bool函数中取值
Sep 21 Python
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 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 header示例代码(推荐)
2010/09/08 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
python读取浮点数和读取文本文件示例
2014/05/06 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
Eclipse面试题
2014/03/22 面试题
J2EE中常用的名词进行解释
2015/11/09 面试题
村庄环境整治方案
2014/05/15 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
南京导游词
2015/02/03 职场文书
鼋头渚导游词
2015/02/05 职场文书
小学运动会加油稿
2015/07/22 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python