【Python机器学习】回归——用线性回归找到最佳拟合直线

news2024/11/16 8:31:53

线性回归的优缺点:

优点:结果易于理解,计算上不复杂

缺点:对非线性的数据拟合不好

使用数据类型:数值型和标称型数据。

回归的目的是预测数值型的目标值。最直接的办法是依据输入写出一个目标值的计算公式。例如预测汽车的功率大小,可能会这么计算:

HorsePower=0.0015*annualSalary-0.99*hoursListeningToPublicRadio

这就是所谓的回归方程,其中的0.0015和-0.99称作回归系数,求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了。具体的做法是用回归系数城西输入值,再将结果全部加在一起,就得到了预测值。

回归一般都是指线性回归。线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。

需要注意的是,存在另一种称为分线性回归的回归模型,该模型不认同上面的做法,比如认为输出可能是输入的乘积。这样,上面的功率计算公式也可以写做:

HorsePower=0.0015*annualSalary/hoursListeningToPublicRadio

这就是一个非线性回归的例子。

回归的一般方法:

1、收集数据:采用任意方法收集数据

2、准备数据:回归需要数值型数据,标称型数据将被转成二值型数据

3、分析数据:绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法求得新回归数据之后,可以将新拟合线绘在图上作为对比

4、训练数据:找到回归系数

5、测试算法:使用R^{2}或者预测值和数据的拟合度,来分析模型的效果

6、使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续性数据而不仅仅是离散的类别标签

假定输入数据存放在矩阵X中,而回归系数存放在矩阵w中。那么,对于给定的数据X,预测结果将会通过Y_{1}=X_{1}^{T}w给出。现在的问题是,手里有一些X和对应的y,要找到w。一个常用的方法就是找出使误差最小的w。这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。

平方误差可以写做:

\sum_{i=1}^{m}(y_{i}-x{_{i}}^{T}w)^{2}

用矩阵表示还可以写做(y-Xw)^{T}(y-Xw)。如果对w求导,得到X^{T}(y-Xw),令其等于0,解出w如下:

\widehat{w}=(X^{T}X)^{-1}X^{T}y

w上方的小标记表示,这是当前可以估计出的w的最优解。从现有数据上估计出的w可能并不是数据中的真实w值,所以这里使用了一个“帽”符号来表示它仅仅是w的一个最佳估计。

指的注意的是,上述公式中包含(X^{T}X)^{-1},也就是需要对矩阵求逆,因此这个方程只在逆矩阵存在的时候适用。然而,矩阵的逆可能并不存在,因此必须要在代码中对此做出判断。

上述的最佳w求解是统计学中的常见问题,除了矩阵方法外还有很多其他方法可以解决。通过调用NumPy库里的矩阵方法,我们可以仅使用几行代码就完成所需功能。该方法也称作OLS,意思是“普通最小二乘法”。

针对下面的数据,试验怎样找到最佳拟合直线。

代码实现:

from numpy import *

def loadDataSet(fileName):
    numFeat=len(open(fileName).readline().split('\t'))-1
    dataMat=[]
    labelMat=[]
    fr=open(fileName)
    for line in fr.readlines():
        lineArr=[]
        curLine=line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

def standRegres(xArr,yArr):
    xMat=mat(xArr)
    yMat=mat(yArr).T
    xTx=xMat.T*xMat
    if linalg.det(xTx)==0.0:
        print('行列式为0')
        return
    ws=xTx.I*(xMat.T*yMat)
    return ws

代码中,第一个函数loadDataSet()用于打开一个用tab分隔的文本文件,默认文件每行的最后一个值是目标值。

第二个函数standRegres()用于计算最佳拟合直线。该函数首先读入x和y并将它们保存到矩阵中;然后计算x^{T}x,然后判断它的行列式是否为0,如果行列式为0,那么计算逆矩阵将会出现错误。NumPy提供一个线性代数的库linalg,其中包括很多有用的函数。可以直接调用linalg.det()来计算行列式。最后,如果行列式非零,计算并返回w。如果没有检查行列式是否为零就试图计算矩阵的逆,将会出现错误。

NumPy的线性代数库还提供一个函数来解未知矩阵,如果使用该函数,那么代码ws=xTx.T*(xMat.T*yMat)应该写成ws=linalg.solve(xMat,xMat.T*yMat.T)。

查看实际运行效果:


xArr,yArr=loadDataSet('ex0.txt')
print(xArr[0:2])
ws=standRegres(xArr,yArr)
print(ws)

变量ws存放的就是回归系数。在用内积来预测y的时候,第一维将乘以前面的常数X0,第二维将乘以输入变量X1.因为前面假定了X0=1,所以最终会得到y=ws[0]+ws[1]*X1。这里的y实际是预测出的,为了和真实的y值区分开来,我们将它记为yHat。下面使用新的ws值计算yHat:

xMat=mat(xArr)
yMat=mat(yArr)
yHat=xMat*ws

绘出数据集散点图和最佳拟合直线图:

import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])
xCopy=xMat.copy()
xCopy.sort(0)
yHat=xCopy*ws
ax.plot(xCopy[:,1],yHat)
plt.show()

几乎任意数据集都可以用上述方法建立模型。

为了评估模型的好坏,有一种方法可以计算预测值yHat序列和真实值y序列的匹配程度,那就是计算这两个序列的相关系数。

在Python中,NumPy库提供了相关系数的计算方法:可以通过命令corrcoef(yEstimate,yActual)来计算预测值和真实值的相关性:

yHat=xMat*ws
print(corrcoef(yHat.T,yMat))

该矩阵包含所有两两组合的相关系数。可以看到对角线上的数据为1.0,因为yMat和自己的匹配是最完美的,而yHat和yMat的相关系数为0.985。

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

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

相关文章

【C语言】预处理详解(上)

文章目录 前言1. 预定义符号2. #define 定义常量3. #define定义宏4. 带有副作用的宏参数5. 宏替换的规则 前言 在讲解编译和链接的知识点中,我提到过翻译环境中主要由编译和链接两大部分所组成。 其中,编译又包括了预处理、编译和汇编。当时&#xff0c…

【Windows系统开机后识别不到屏幕适配的分辨率导致屏幕无法点亮的解决办法】

问题原因分析: 屏幕驱动板出现故障,驱动出现缺失,未对主板系统进行适配兼容。使用的屏幕分辨率非常小众,系统中没有这个分辨率,识别不到屏幕适配的分辨率后导致屏幕无法点亮。 解决方法: 找主板厂家增加…

CVE-2022-33891漏洞复现

简介 Spark 是用于大规模数据处理的统一分析引擎。它提供了 Scala、Java、Python 和 R 中的高级 API,以及支持用于数据分析的通用计算图的优化引擎。它还支持一组丰富的高级工具,包括用于 SQL 和 DataFrames 的 Spark SQL、用于 Pandas 工作负载的 Spar…

【每日刷题】Day94

【每日刷题】Day94 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 33. 搜索旋转排序数组 - 力扣(LeetCode) 2. 1290. 二进制链表转整数 - 力扣…

科普文:微服务之万字详解分布式事务原理、协议及其框架

一、分布式事务 首先奉上一张关于事务的相关概念图,给大家做个总览: 1.1 名词解释 事务:事务是由一组操作构成的可靠的独立的工作单元,事务具备ACID的特性,即原子性、一致性、隔离性和持久性。本地事务:当…

树莓派4B部署及测试llamafile

llamafile项目简介 很多初学者学习大语言模型的时候,都会被模型文件中一大堆复杂的python文件或者cuda配置劝退,为了方便更多的零基础的初学者体验大语言模型,llamafile 提出了单文件运行大模型的方案。 GitHub - Mozilla-Ocho/llamafile: Distribute and run LLMs with a…

网络原理(1)——基本概念

1. 网络互连 随着时代的发展,越来越需要计算机之间相互通信,共享软件和数据,以多个计算机协同工作来完成业务,就有了网络互连 网络互连:将多台计算机连接在一起,完成数据共享 数据共享本质是网络数据传输…

中空板式陶瓷膜的高可靠性

中空板式陶瓷膜是一种先进的液固分离材料,具有诸多优点和广泛的应用领域。以下是对中空板式陶瓷膜的详细介绍: 一、产品特点 物理特性优越:中空板式陶瓷膜通常采用刚玉等无机材料为原材料,经过高温烧制而成,具有高强度…

数据结构实验:树和二叉树(附c++源码:实现树有关算法)

目录 一、实验目的 二、问题分析及数据结构设计 三、算法设计(伪代码表示) 1. 输入字符序列 创建二叉链表 2. 递归前序遍历 3. 递归中序遍历 4. 递归后序遍历 5. 非递归前序遍历 6. 非递归中序遍历 7. 非递归后序遍历 8. 层次遍历 9. 求二叉…

阿里云镜像站,提供了各种第三方镜像地址

阿里云提供了各项镜像缓存地址,对于很多国外服务的地址,通过阿里云缓存的地址去下载,速度会非常快。 如下,打开阿里云官方网站: 进入“镜像站”,如下图所示: 有我们常用的 npm、maven、操作系统…

武汉流星汇聚:互联网+跨境购物新风尚,消费者深度依赖跨境电商

在21世纪的数字时代,跨境电商平台以其独特的魅力,正逐步成为连接全球消费者与优质商品的桥梁。随着消费者对优质产品需求的日益增长、全球互联网使用量的不断扩大、跨境物流技术的飞速进步以及全球供应链能力的显著提升,跨境电商平台不仅为消…

uniapp——列表选择样式

案例 代码 <view class"list"><block v-for"(item,index) in 8" :key"index"><view class"item" click"choosePackage(item)" :class"{active:item current}"><view class"i_money&q…

【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 前言 今天给大家带来一篇有关Java顺序表和链表的文章&#xff0c;顺序表和链表我之前的专栏也是写过的&#xff0c;是用C语言实现的&#xff0c;也是模仿实现了顺序表和链表里的方法了。 下面是传送门&#xff…

新一代AI技术的发展

人工智能技术正处于迈向全新阶段的关键转折点&#xff0c;从传统的NLP(自然语言处理)迅速迈向更开 放、更通用、多模态的AGI(通用人工智能),AGI的兴起为各行业带来了前所未有的机遇。AGI突破了传 统AI的局限&#xff0c;具备跨领域的广泛应用能力和自主学习能力&#xff0c;在自…

CTFHUB | web进阶 | PHP | Bypass disable_function | PHP-FPM

开启题目 查看源码&#xff0c;发现可以蚁剑连接 连接成功发现无任何发现&#xff0c;所以我们使用 Fastcgi/PHP-FPM 插件&#xff0c;配置如下 刷新目录发现插件上传了一个 php 文件&#xff0c;复制文件名拼接到后面再次连接 发现直接进入终端了&#xff0c;最后发现了 flag

MySQL数据库基础:增删查改

&#x1f48e;所属专栏&#xff1a; MySQL &#x1f48e;1. 常用数据类型 &#x1f48e;1.1 数值类型 数值类型可以指定无符号类型&#xff0c;默认为有符号类型&#xff0c;例如身高体重这种&#xff0c;只可能是正数的&#xff0c;可以指定为无符号 CREATE TABLE example (…

Linux PCI和PCIe总线

1 PCIe中断 - PCI/PCIe设备中断都是level触发&#xff0c;并且请求信号为低电平有效 - PCI总线一般只有INTA#到INTD#的4个中断引脚&#xff0c;所以PCI多功能设备的func一般不会超过4个&#xff0c;但是共享中断除外 2 IOMMU 2.1 ARM SMMU v2 Refer to my blog ARM SMMU v2. 2.…

糟糕界面集锦-控件篇 01

iarchitect 整理&#xff0c;bucher 译 在图形界面中&#xff0c;控件就是程序与用户之间沟通的桥梁&#xff0c;而这座桥梁的好坏则取决于如下两个方面&#xff1a; 控件是否符合需求控件之间是否风格一致 《Visual Basic Programmers Journal 101 Tech Tips for VB Develop…

网络工具(Netcat、iPerf)

目录 1. Netcat2. iPerf 1. Netcat Netcat 是一款简单的 Unix 工具&#xff0c;常用于测试 UDP 和 TCP 连接。 https://www.cnblogs.com/yywf/p/18154209 https://eternallybored.org/misc/netcat/ https://nmap.org/download.html 创建UDP监听端 nc -u -l localPort 创建UDP…

并行程序设计基础——Hello world

目录 一、Fortran 90 MPI实现 二、C MPI实现 三、MPI程序的一些惯例 四、小结 相信许多编程初学者的入门程序都是“Hello World”&#xff0c;我们同样来编写MPI的第一个程序“Hello World”。 一、Fortran 90 MPI实现 我们先给出代码&#xff0c;然后进行代码分析。 pro…