python统计分析——一般线性回归模型

参考资料:python统计分析【托马斯】

        当我想用一个或多个其他的变量预测一个变量的时候,我们可以用线性回归的方法。

        例如,当我们寻找给定数据集(x_i,y_i)的最佳拟合线的时候,我们是在寻找让下式的残差平方和最小的参数(k,d):

y_i=k\times x_i+d+\varepsilon _i

        其中,k是线的斜率,d是截距。残差是观测值和预测值之间的差异。

        由于线性回归方程是用最小化残差平方和的方法来解决的,线性回归又是也成为普通最小二乘法(OLS)回归。

        这里注意:与相关性相反,x和y之间的这种关系不再是对称的;它假设x值是精确的,所有的变异性都在于残差。

1、决定系数

        我们约定:y_i是数据集中的观测值,\hat{y_i}为模型计算得到的于y_i相对应的预测值,\bar{y}为所有y_i的平均值。那么:

SS_{mod}=\sum_{i=1}^n(\hat{y_i}-\bar{y})^2是模型平方和,或回归平方和,或可解释平方和。

SS_{res}=\sum_{i=1}^n(y_i-\hat{y_i})^2是残差平方和,或误差平方和。

SS_{tot}=\sum_{i=1}^n(y_i-\bar{y})^2是总平方和,它等于样本方差乘以n-1。

决定系数一般表示为:

R^2=1-\frac{SS_{res}}{SS_{tot}}

由于SS_{tot}=SS_{mod}+SS_{res}

所以:

R^2=\frac{SS_{mod}}{SS_{tot}}

        用文字表达:决定系数就是模型的可解释平方和与总平方和的比值。

        对于简单线性回归(即直线拟合),决定系数就是相关系数r的平方。如果我们的自变量和因变量之间存在非线性关系,那么简单的相关性和决定系数会对结果造成误导。

2、带置信区间的直线

        对于单变量分布,基于标准差的置信区间表示我们期望包含95%的数据的区间(用于数据);而基于平均数标准误的置信区间表示95%概率下包含真正均值的区间(用于参数)。如下:

3、曲线拟合

        为了了解如何使用不同的模型来评估给定的数据集,让我们来看一个简单的例子:拟合一个有噪声的、略微二次项弯曲的曲线。让我们从numpy中实现的算法开始,然后用线性、二次方、三次方曲线来拟合数据。

        代码如下:

# 导入库
import numpy as np
import matplotlib.pyplot as plt# 生成一个有噪声、略微二次项弯曲的数据集
x=np.arange(100)
y=150+3*x+0.3+x**2+5*np.random.randn(len(x))# 线性拟合、二次方拟合、三次方拟合
# 创建设计矩阵
M1=np.vstack((np.ones_like(x),x)).T
M2=np.vstack((np.ones_like(x),x,x**2)).T
M3=np.vstack((np.ones_like(x),x,x**2,x**3)).T# 解方程
p1=np.linalg.lstsq(M1,y)
p2=np.linalg.lstsq(M2,y)
p3=np.linalg.lstsq(M3,y)np.set_printoptions(precision=3)
print('the coefficients from the linear fit:{0}'.format(p1[0]))
print('the coefficients from the quadratic fit:{0}'.format(p2[0]))
print('the coefficients from the cubic fit:{0}'.format(p3[0]))

# 计算x对应的预测值
p1_y=-1466.335+101.978*x
p2_y=150.394+2.994*x+x**2
p3_y=150+3.04*x+0.9987*x**2+7.842*(10**(-6))*x**3# 作图
plt.rcParams['font.sans-serif']="SimHei"    # 设置中文显示
plt.rcParams['axes.unicode_minus']=False    # 设置负号显示
plt.scatter(x,y,c="black",s=0.1,label="数据")
plt.plot(x,p1_y,"b:",label="线性拟合")
plt.plot(x,p2_y,"r--",label="二次方拟合")
plt.plot(x,p3_y,'g-.',label="三次方拟合")
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

显示图片如下 

        如果我们想找到哪个才是拟合的“最好的”,我们可以使用statsmodels提供的工作来再次拟合模型。使用statsmodels,我们不仅可以得到最佳拟合参数,还能得到关于模型的许多价值的额外信息。python代码如下:

import statsmodels.api as sm
import statsmodels.formula.api as smfRes1=sm.OLS(y,M1).fit()
Res2=sm.OLS(y,M2).fit()
Res3=sm.OLS(y,M3).fit()# 以Res1为例输出结果
print(Res1.summary2())
print('the AIC-value is {0:4.1f} for the linear fit ,\n{1:4.1f} for the quadratic fit ,and \n {2:4.1f} for the cubic fit'.format(Res1.aic,Res2.aic,Res3.aic))

        在这里,我们需要知道AIC值(Akaike信息准则)可用于评估模型的质量:AIC值越低,模型越好。我们看到,二次模型的AIC值最小,因此是最好的模型:它提供了与三次方模型相同的拟合质量,但使用较少的参数来得到该质量。

        下面我们再用公式语言执行相同的拟合,但不需要手动生成设计矩阵,以及如何提取模型参数、标准误和置信区间。值得注意的是,使用pandas数据框允许Python添加单独参数的信息。

import pandas as pd
import statsmodels.formula.api as smf# 将数据转化为pandas的dataframe格式
df=pd.DataFrame({"x":x,"y":y})# 拟合模型,并展示结果
Res1F=smf.ols("y~x",df).fit()
Res2F=smf.ols("y~x+I(x**2)",df).fit()
Res3F=smf.ols("y~x+I(x**2)+I(x**3)",df).fit()# 作为示例,显示二次方拟合的参数
print(Res2F.params)
print(Res2F.bse)
print(Res2F.conf_int())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机的秒表设计—0.01精度99.99s

基于51单片机的秒表设计 (仿真+程序+原理图+PCB+设计报告) 功能介绍 具体功能: 1.数码管显示秒表,精度为0.01; 2.记时最大为99.99s,过后清零记数。 3.一个按键实现开始…

突破传统,创新营销:淘宝天猫详情接口API的无限可能

随着互联网的迅猛发展,电子商务平台成为了现代商业营销的重要组成部分。淘宝和天猫作为中国最大的电子商务平台之一,拥有庞大的商品数据库和海量的买家资源。为了更好地实现个性化、精准化的营销策略,淘宝天猫推出了详情接口API,联…

Kibana管理ES生命周期

希望通过Kibana界面管理ES索引的生命周期 版本:7.15.2 创建索引模板 创建索引模板方便匹配索引,对匹配到的一批索引采用同一套生命周期管理策略,例如开发环境的所有索引以dev-开头,可以创建样式为dev-*的索引模板以匹配开发环境…

uni-starter和uni-admin初始化

1. 初始化uni-starter项目之后需要在uniCloud–>cloudfunctions–>common–>uni-config-center下面新增uni-id文件夹,下面新增config.json文件。 1.1配置好tokenSecret和微信的appId,appSecret等,如下: {"passwordSecret"…

pygame旋转角度发射射线

self.x self.x math.cos(math.radians(self.xuanzhuanjiao)) * 70 self.y self.y - math.sin(math.radians(self.xuanzhuanjiao)) * 70 旋转角度,70是间隔 间隔太小会卡 import pygame from pygame.locals import * import sys import mathpygame.init()width, …

03-JAVA设计模式-装饰模式

装饰模式 什么装饰模式 装饰器模式(Decorator Pattern)也叫包装器模式,是一种结构型设计模式,允许用户在不改变对象的情况下,动态地给对象增加一些额外的职责(功能)。装饰器模式相比生成子类更…

echarts 多环形图

环形图效果: option {"angleAxis": {"max": 1,"show": false,"splitLine": {"show": false},"axisLabel": {"show": false},"axisTick": {"show": false}},"ra…

美国N4433A安捷伦电子校准件

181/2461/8938产品概述: 安捷伦N4433A微波电子校准(ECal)模块使矢量网络分析仪的校准变得快速、简单和准确。ECal是一种用于矢量网络分析仪的精密单连接校准技术。与机械校准套件相比,使用ECal进行完整的三端口或四端口校准所需的…

基于FPGA的HDMI设计导航页面

FPGA使用HDMI更多时候用于传输图像数据,并不会传输音频数据,因此以下文章均采用DVI接口协议,HDMI与DVI的视频传输协议基本一致,区别也很小。 首先需要了解HDMI的来源,以及物理接口类型以及引脚信号,最后对几…

【Java】Java使用Swing实现一个模拟计算器(有源码)

📝个人主页:哈__ 期待您的关注 今天翻了翻之前写的代码,发现自己之前还写了一个计算器,今天把我之前写的代码分享出来。 我记得那会儿刚学不会写,写的乱七八糟,但拿来当期末作业还是不错的哈哈。 直接上…

力扣404,左叶子之和

404. 左叶子之和 已解答 简单 相关标签 相关企业 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,…

C:数据结构之链栈(不带头)

目录 前序 准备工作 函数声明 函数接口 1.初始化 2.创造节点 3. 判断栈空 4.入栈 5.出栈 6.取栈顶元素 7.销毁栈 8. 获取栈的元素个数 总结 前序 链栈是基于单链表实现的,其实栈更加适合使用顺序表来实现的,这篇文章我们来探讨一下链栈的实现。 准备工作 老规…

透视 Insilico 英矽智能:AI 制药明星企业的飞跃、困境与破局

衰老,从古至今困扰了无数仁人志士。无论是千古一帝秦始皇,还是雄才大略汉武帝,亦或者挥斥方遒唐太宗,这些伟大的帝王无一例外的都留下了许多追求长生的故事。当时光的指针落在了 21 世纪的第二个十年,随着全球老龄化问…

【c++】string类常见接口函数

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,本节我们来到STL内容的第一部分:string类接口函数的介绍 目录 1.string类的认识2.常见接口讲解2.1 string类对象的常见构造2.2 对string对象的遍历和…

Jackson解析Json数据

1.概述 Jackson 和 FastJson 一样,是一个 Java 语言编写的,可以进行 JSON 处理的开源工具库,Jackson 的使用非常广泛,Spring 框架默认使用 Jackson 进行 JSON 处理。 Jackson 有三个核包,分别是 Streaming、Databid、…

【实战JVM】类的生命周期

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

百度OCR身份证识别C++离线SDKV3.0 C#对接

百度OCR身份证识别C离线SDKV3.0 C#对接 目录 说明 效果 问题 项目 代码 下载 说明 自己根据SDK封装了动态库,然后C#调用。 SDK 简介 本 SDK 适应于于 Windows 平台下的⾝份证识别系统,⽀持 C接⼜开发的 SDK,开发者可在VS2015 下⾯进⾏开发(推荐…

推荐学习什么编程语言?

选择编程语言学习时,除了就业因素外,还可以考虑以下几个方面来决定学习哪些编程语言: 个人兴趣与目标:如果你对某个特定领域感兴趣,比如游戏开发、数据分析、人工智能等,可以选择与该领域紧密相关的编程语言…

Altair® Access™ 面向研究人员和工程师的 HPC 作业提交门户

Altair Access™ 面向研究人员和工程师的 HPC 作业提交门户 Access 具有一个简单、强大且统一的界面,可以从中提交和监控远程集群、云或其他资源的相关作业,使工程师和研究人员能够专注于主要活动,减少在应用程序运行及数据移动上投入的时间。…

搭建第一个Web服务器(在eclipse或idea上部署Tomcat服务器)

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…