Python机器学习:一元回归

news2024/10/5 22:21:35

→ \rightarrow 回归效果评价

🌕 一元回归

一元回归主要研究一个自变量和一个因变量之间的关系,而这个自变量和因变量之间的关系又可分为线性回归非线性回归

⭐️ 一元线性回归分析两个变量之间的线性关系,如 y = k x + b y=kx+b y=kx+b x x x y y y就是线性关系。
⭐️ 一元非线性回归分析两个变量之间的非线性关系,如指数关系、对数关系等。

🌗 一元线性回归

下面用Iris数据集中的PetalLengthCm和PetalWidthCm两个变量来建立一元线性回归模型。

在建立模型前,我们要先知道一元线性回归分析法的预测模型: y = a x + b y=ax+b y=ax+b,我们要求的就是参数a和b,可以由下列公式求得:
a = n ∑ x i y i − ∑ x i ∑ y i n ∑ x i 2 − ( ∑ x i ) 2 a = \frac{n\sum x_iy_i-\sum x_i\sum y_i}{n\sum x_i^2-(\sum x_i)^2} a=nxi2(xi)2nxiyixiyi
b = ∑ y i n − a ∑ x i n b = \frac{\sum y_i}{n}-a\frac{\sum x_i}{n} b=nyianxi

🌑 第一种

原谅我只在这里自己实现求回归方程,因为其它的太难了0.0

import pandas as pd
from matplotlib import pyplot as plt
# 中文显示问题
import seaborn as sns
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

def add_up(data):               # 累加函数
    sum = 0
    for i in range(len(data)):
        sum += data[i]
    return sum

def cal_a(x,y):                 # 求a
    a = (len(x) * add_up(x * y) - add_up(x) * add_up(y)) / (len(x) * add_up(x ** 2) - add_up(x) ** 2)
    return a

def cal_b(x,y,a):               # 求b
    b = add_up(y) / len(x) - a * add_up(x) / len(x)
    return b

a = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")	# 读取数据
x = a.PetalLengthCm		# 读取x的数据
y = a.PetalWidthCm		# 读取y的数据
a = cal_a(x,y)			# 计算a
b = cal_b(x,y,a)		# 计算b
print(a,b)
plt.figure(figsize = (10,6))
plt.scatter(x,y,c = "blue")		# 原始数据的点
plt.plot(x,a * x + b,"r-",linewidth = 3)	# 预测的模型
plt.xlabel("PetalWidthCm")
plt.ylabel("PetalLengthCm")
plt.title("一元线性回归模拟拟合曲线")
plt.grid()
plt.show()

在这里插入图片描述

在这里插入图片描述

🌑 第二种

现在我们再来使用python花里胡哨的包来实现一下:

import pandas as pd
import statsmodels.formula.api as smf

import seaborn as sns
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
model = smf.ols("PetalWidthCm~PetalLengthCm",data = data).fit()
print(model.summary())

在这里插入图片描述
图中红圈部分就是我们之前求的a和b。

针对于回归模型的残差,可以使用Q-Q图来检验是否服从正态分布(关于Q-Q图是什么,可以看一下我这篇博客 → \rightarrow 假设检验)。

import pandas as pd
from matplotlib import pyplot as plt
import statsmodels.formula.api as smf
import statsmodels.api as sm

import seaborn as sns
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
model = smf.ols("PetalWidthCm~PetalLengthCm",data = data).fit()
fig = plt.figure(figsize = (14,6))
plt.subplot(1,2,1)                      # 将画布分为一行两列,现在对从上到下从左到右第一部分进行绘图
plt.hist(model.resid,bins = 30)         # 绘制直方图
plt.grid()
plt.title("回归残差分布直方图")
ax = fig.add_subplot(1,2,2)             # 现在对第二部分进行绘图
sm.qqplot(model.resid,line = "q",ax = ax)
plt.title("回归残差Q-Q图")
plt.show()

在这里插入图片描述
从上图可知,回归模型的拟合残差值符合正态分布。

针对获得的回归模型,可以使用predict()函数对新的数据进行预测:

import pandas as pd
from matplotlib import pyplot as plt
import statsmodels.formula.api as smf
import numpy as np

import seaborn as sns
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
model = smf.ols("PetalWidthCm~PetalLengthCm",data = data).fit()

X = pd.DataFrame(data = np.arange(0.5,8,step = 0.1),columns = ["PetalLengthCm"])
Y = model.predict(X)
data.plot(kind = "scatter",x = "PetalLengthCm",y = "PetalWidthCm",c = "blue",figsize = (10,6))	# 绘制原始数据
plt.plot(X,Y,"r-",linewidth = 3)	# 绘制回归模型
plt.grid()
plt.title("一元线性回归模型拟合曲线")
plt.show()

在这里插入图片描述
可以看到,上图跟第一种方法绘制出来的图是一样的,只是横纵坐标的区间不一样。

🌗 一元非线性回归

下面读取一组非线性数据,来进行操作。
这个数据部分内容如下:
在这里插入图片描述
因为它是非线性的,所以我们先绘制一个散点图,看看它比较符合哪种非线性的形式。

import pandas as pd
from matplotlib import pyplot as plt

import seaborn as sns
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap5/xydata.csv")
plt.figure(figsize = (10,6))
plt.plot(data.x,data.y,"ro")
plt.grid()
plt.show()

在这里插入图片描述

🌑 第一种分析

仔细一看,好像还挺符合指数关系的,那么我们还是先给出它的非线性预测模型: y = a e − b x + c y=ae^{-bx}+c y=aebx+c。因为这个模型的参数比较多且难以计算,在这我们可以通过curve_fit()函数利用数据对其进行参数估计来获取预测模型的参数值。

import numpy as np
import pandas as pd
from scipy.optimize import curve_fit

import seaborn as sns
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

def func(x,a,b,c):
    return a * np.exp(-b * x) + c

data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap5/xydata.csv")

popt,pcov = curve_fit(func,data.x,data.y)	# 将预测模型的函数传给curve_fit
print("a,b,c的估计值值为:",popt)

⭐️ popt:是一个数组,存有参数的最佳值,以使得平方残差之和最小。
⭐️ pcov:是一个二维阵列,popt的估计协方差。
在这里插入图片描述
于是我们可以得到这个曲线的回归方程: y = − 0.1947 e − 0.1779 x + 0.6524 y=-0.1947e^{-0.1779x}+0.6524 y=0.1947e0.1779x+0.6524
得到回归方程后,我们就可以将其可视化,分析拟合曲线与原始数据之间的关系。
⭐️ plt.hlines():画一条水平线,参数y是控制水平线的位置,参数xmin是水平线的起始位置,参数xmax是水平线的结束位置。

import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
from matplotlib import pyplot as plt

import seaborn as sns
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

def func(x,a,b,c):
    return a * np.exp(-b * x) + c

data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap5/xydata.csv")
popt,pcov = curve_fit(func,data.x,data.y)
a = popt[0]
b = popt[1]
c = popt[2]
fit_y = func(data.x,a,b,c)        # 求得回归方程中的y
res = fit_y - data.y              # 回归方程中的y减去原始数据的y为残差
plt.figure(figsize = (14,6))
plt.subplot(1,2,1)                # 开始画第一个图
plt.plot(data.x,data.y,"ro",label = "原始数据")     # 画原始数据
plt.plot(data.x,fit_y,"b-",linewidth = 3,label = "指数函数")      # 画回归方程
plt.grid()
plt.legend()            # 一个小格子,表明圆点代表原始数据,线条代表指数函数
plt.title("拟合效果")
plt.subplot(1,2,2)      # 开始画第二个图
plt.plot(res,"ro")      # 绘制残差点
plt.hlines(y = 0,xmin = -1,xmax = 41,linewidth = 2) # 画一条水平线
plt.grid()
plt.title("拟合残差大小")
plt.show()

在这里插入图片描述

🌑 第二种分析

同样,针对前面的非线性数据,它的可视化图像如下;
在这里插入图片描述
有没有这样一种可能,它的变化趋势接近于 y = a x 2 + b x + c y=ax^2+bx+c y=ax2+bx+c呢?现在我们就来试一下看。

因为只需改一下func中的内容即可,这里就不放全部代码了。

def func(x,a,b,c):
	return a * x ** 2 + b * x + c

在这里插入图片描述
得到的回归方程为: y = − 0 , 000978 x 2 + 0.02748 x + 0.45396 y=-0,000978x^2+0.02748x+0.45396 y=0,000978x2+0.02748x+0.45396
下面我们再将其可视化来分析拟合曲线与原始数据之间的关系。
在这里插入图片描述
对比两次的可视化图可以发现,使用二次函数的拟合效果没有使用指数函数的拟合效果好。

所以对于一元回归来说,要得到它的回归方程,我们可以先定义一个方程,然后利用curve_fit()函数进行方程的拟合,求得参数的值,最后再带入我们预先考虑好的模型里就能得到回归方程了,这是最简单的一种。当然也可以自己用代码去实现这个功能0.0,不过对于我来说难度就很大了,还需多多努力!!

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

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

相关文章

深度学习笔记:神经网络的学习(1)

机器学习的核心在于从数据中提取规律和特征,并用于分类或预测。对于识别手写数字,如果人工设计一个识别算法逻辑是十分困难的。一种方法是任务在数据中提取更重要的特征量,然后利用机器学习算法如SVM或KNN。而神经网络的方法则是完全由机器自…

ISIS的3级别(level-1、level-2、level-1-2)4大类(IIH、LSP、CSNP、PSNP)9小类与邻接关系建立LSP交互过程介绍

2.2.0 ISIS 4种报文类型IIH、LSP、CSNP、PSNP、邻居建立过程、交互LSP过程 ISIS的3级别4大类9小类 ISIS拥有3种级别的路由器,分别是level-1、level-2、level-1-2。 不同级别之间进行交互的报文也是有所区别的,常规的ISIS报文分有4大类:IIH、…

cubeIDE开发, stm32人工智能开发应用实践(Cube.AI).篇一

一、cube.AI简介及cubeIDE集成 1.1 cube.AI介绍 cube.AI准确来说是STM32Cube.AI,它是ST公司的打造的STM32Cube生态体系的扩展包X-CUBE-AI,专用于帮助开发者实现人工智能开发。确切地说,是将基于各种人工智能开发框架训练出来的算法模型&#…

Vue3商店后台管理系统设计文稿篇(六)

记录使用vscode构建Vue3商店后台管理系统,这是第六篇,从这一篇章开始,所有的预备工作结束,正式进入商店后台管理系统的开发 文章目录一、创建后台管理系统的标题栏二、安装Icon 图标三、创建Menu菜单正文内容: 一、创…

PowerShell 学习笔记:操作JSON文件

JSON文件(字符串)是有一定格式要求的文本文件。百度百科JSON(JavaScriptObject Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制…

初识Linux常见指令汇总

文章目录前言1.对文件或目录的常用指令1.查看当前路径下的文件或目录相关信息2.进入指定路径3.创建删除文件或者目录4.使用nano简单编辑文件查看文件属性5.复制移动重命名文件或目录6.输入输出重定(查看文件内容)向和搜索查找1.输入输出重定向2.搜索查找7.打包压缩文件2.时间相…

如何使用Maven构建Java项目?Maven的使用详细解读

文章目录1. 前言2. Maven 快速入门2.1 Maven 项目模型2.2 Maven 仓库3. Maven的安装配置3.1 安装3.2 配置环境变量3.4 Maven 配置4. Maven 的常用命令4.1 编译4.2 清理4.3 打包4.4 测试4.5 安装5. Maven生命周期6. 总结Java编程基础教程系列:1. 前言 在 Java 开发中…

C++初阶:list类

文章目录1 list介绍2 list的模拟实现2.1 类的定义2.2 默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造2.2.4 赋值重载2.3 迭代器2.3.1 正向迭代器2.3.2 反向迭代器2.4 修改接口2.4.1 任意位置插入2.4.2 任意位置删除2.5 其他接口2.5.1 尾插2.5.2 头插2.5.3 尾删2.5.3 …

3.7-2动态规划--图像压缩(举例子和写代码)

3.7动态规划--图像压缩_昵称什么的不存在的博客-CSDN博客 问题描述(再写一遍) 这篇文章是接着上面这一篇写的,就是写一个例子方便理解,模拟填写数组的过程 l: l[i]存放第i段长度, 表中各项均为8位长,限制了相同位数的…

CGAL 点云精配准之ICP算法

文章目录 一、简介二、相关参数三、实现过程三、举个栗子四、实现效果参考资料一、简介 ICP算法总共分为6个阶段,如下图所示: (1)挑选发生重叠的点云子集,这一步如果原始点云数据量比较巨大,一般会对原始点云进行下采样操作。 (2)匹配特征点。通常是距离最近的两个点,…

如何批量增加视频的音量(ffmpeg)

问题背景 由于之前爷爷的唱戏机充不进去电,过年时给爷爷买了个新的。但这个新买的机子,它的曲目(视频)在U盘里,声音普遍较低,我爷爷的耳朵不好,声音需要比正常的声音调大一些。 在Videolouder这…

【数据结构和算法】认识线性表中的链表,并实现单向链表

本文接着上文,上文我们认识了线性表的概念,并实现了静态、动态顺序表。接下来我们认识一个新概念链表。并实现单向链表的各种操作。顺序表还有不明白的看这一篇文章 (13条消息) 【数据结构和算法】实现线性表中的静态、动态顺序表_小王学代码的博客-CSDN…

leetcode--链表

链表1.链表的基本操作(1)反转链表(206)(2) 合并两个有序链表(21)(3)两两交换链表中的节点(24)2.其它链表技巧(1)相交链表(160)(2)回文链表(234)3.练习&#x…

力扣 2293. 极大极小游戏

题目 给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度,如果 n 1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums ,新数组长度为 n / 2 &…

手把手带初学者快速入门 JAVA Web SSM 框架

博主也是刚开始学习SSM,为了帮大家节省时间,写下SSM快速入门博客 有什么不对的地方还请 私信 或者 评论区 指出 ​只是一个简单的整合项目,让初学者了解一下SSM的大致结构 项目先把框架写好,之后在填写内容 项目压缩包 完整的蓝奏…

浅谈phar反序列化漏洞

目录 基础知识 前言 Phar基础 Phar文件结构 受影响的函数 漏洞实验 实验一 实验二 过滤绕过 补充 基础知识 前言 PHP反序列化常见的是使用unserilize()进行反序列化,除此之外还有其它的反序列化方法,不需要用到unserilize()。就是用到了本文…

C 语言零基础入门教程(十一)

C 数组 C语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量,比如 runoob0、runoob1、…、runoob99&#xf…

【Linux】调试器 - gdb 的使用

目录 一、背景知识 二、debug 与 release 1、生成两种版本的可执行程序 2、debug 与 release 的区别 三、gdb 的使用 1、调试指令与指令集 2、源代码显示、运行与退出调试 3、断点操作 4、逐语句与逐过程 5、调试过程中的数据监视 6、调试过程中快速定位问题 一、背…

吴恩达机器学习笔记(三)逻辑回归

机器学习(三) 学习机器学习过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。 —— 吴恩达机器学习第五章 —— 四、逻辑回归 线性回归局限性 线性回归对于分类问题的局限性:由于离群点…

LeetCode动态规划经典题目(九):入门

学习目标: 了解动态规划 学习内容: 1. LeetCode509. 斐波那契数https://leetcode.cn/problems/fibonacci-number/ 2. LeetCode70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 3. LeetCode746. 使用最小花费爬楼梯https://leetcode.cn/proble…