【机器学习】线性回归

文章目录

  • 前言
  • 一、单变量线性回归
    • 1.导入必要的库
    • 2.读取数据
    • 3.绘制散点图
    • 4.划分数据
    • 5.定义模型函数
    • 6.定义损失函数
    • 7.求权重向量w
      • 7.1 梯度下降函数
      • 7.2 最小二乘法
    • 8.训练模型
    • 9.绘制预测曲线
    • 10.试试正则化
    • 11.绘制预测曲线
    • 12.试试sklearn库
  • 二、多变量线性回归
    • 1.导入库
    • 2.读取数据
    • 3.划分数据
    • 4.定义假设函数
    • 5.定义损失函数
    • 6.定义梯度下降函数
    • 7.训练模型
    • 8.运用sklearn绘图
  • 总结

前言

线性回归:是一种通过属性的线性组合来进行预测的线性模型
其目的是找到一条直线或者一个平面或者更高维的超平面,使得预测值与真实值之间的误差最小化。

一、单变量线性回归

1.导入必要的库

导入pandas、numpy和matplotlib.pyplot库

import pandas as pd  #导入pandas库
import numpy as np   #导入numpy库
import matplotlib.pyplot as plt   #导入matplotlib.pyplot库
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号

2.读取数据

使用pandas库的read_csv()函数读取数据文件,数据文件中包含了人口和收益两列数据

data=pd.read_csv(r"d:线性回归/regress_data1.csv")   #读取数据

3.绘制散点图

使用data.plot()函数绘制散点图,展示人口与收益之间的关系

data.plot(kind="scatter",x="人口",y="收益")    #绘制散点图
plt.xlabel("人口",fontsize=10)                 #横坐标
plt.ylabel("收益",fontsize=10)                 #纵坐标
plt.title("人口与收益之间的关系")              #标题
plt.show()     #画图

人口与收益之间的关系图

4.划分数据

这里是为了方便后面计算,将一列全为1的列插入到数据中
将数据分为训练集和测试集,这里只使用了训练集

data.insert(0,"ones",1)    #插入列,便于后面计算
col_num=data.shape[1]      #训练特征个数
m=data.shape[0]            #训练标签个数
X=data.iloc[:,:col_num-1].values    #训练集的特征
y=data.iloc[:,col_num-1].values     #训练集的标签
y=y.reshape((m,1))                  

5.定义模型函数

定义h(X,w)函数用来计算模型预测值,这里采用的是线性模型

def h(X,w):
    return X@w

6.定义损失函数

定义cost(X,y,w)函数用来计算模型误差

def cost(X,y,w):
    return np.sum(np.power(h(X,w)-y,2))/(2*m)

7.求权重向量w

7.1 梯度下降函数

定义函数gradient_descent(X,y,w,n,a)用来执行梯度下降算法,更新权重向量w,并返回最终的权重向量和误差列表

def gradient_descent(X,y,w,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j][0]=w[j][0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,y,w))
    return w,cost_lst

7.2 最小二乘法

定义函数least_square(X,y)用来执行最小二乘法,直接求出权重向量w,但是当n>10000时由于时间复杂度太大将导致程序运行超时

def least_square(X,y):
    w=np.linalg.inv(X.T@X)@X.T@y
    return w

8.训练模型

调用gradient_descent()函数训练模型,并输出误差随迭代次数变化的图像,用来观察模型的学习效果
其中,迭代次数越大,训练效果越好,学习率适中,既不可太大,也不可过小

n=10000    #迭代次数越多越好
a=0.003    #学习率适中,不能太大,也不能太小
w=np.zeros((col_num-1,1))  #初始化权重向量
w,cost_lst=gradient_descent(X,y,w,n,a)   #调用梯度下降函数
plt.plot(range(n),cost_lst,"r-+")
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()

训练模型图

9.绘制预测曲线

使用训练好的权重向量w绘制预测曲线,并将其与原始数据一起绘制在图像上,用来观察模型的预测效果

x=np.linspace(data["人口"].min(),data["人口"].max(),50)   #预测特征
y1=w[0,0]*1+w[1,0]*x      #预测标签
plt.scatter(data["人口"],data["收益"], label='训练数据')     #训练集
plt.plot(x,y1,"r-+",label="预测线")                         #预测集
plt.xlabel("人口",fontsize=10)
plt.ylabel("收益",fontsize=10)
plt.title("人口与收益之间的关系")
plt.show()

预测曲线图

10.试试正则化

使用L2正则化(岭回归)防止过拟合

def gradient_descents(X,y,w,n,a,l):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j][0]=w[j][0]-((a/m)*(np.sum(error.ravel()*X[:,j].ravel())+2*l*w[j,0]))
        w=t
        cost_lst.append(cost(X,y,w))
    return w,cost_lst
n=10000    #迭代次数越多越好
a=0.003    #学习率适中,不能太大,也不能太小
l=1        
w=np.zeros((col_num-1,1))
w,cost_lst=gradient_descents(X,y,w,n,a,l)
plt.plot(range(n),cost_lst,"r-+")
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()

岭回归图

11.绘制预测曲线

使用训练好的权重向量w绘制预测曲线,并将其与原始数据一起绘制在图像上,用来观察模型的预测效果

x=np.linspace(data["人口"].min(),data["人口"].max(),50)
y1=w[0,0]*1+w[1,0]*x
plt.scatter(data["人口"],data["收益"], label='训练数据')
plt.plot(x,y1,"r-+",label="预测线")
plt.xlabel("人口",fontsize=10)
plt.ylabel("收益",fontsize=10)
plt.title("人口与收益之间的关系")
plt.show()

预测曲线图

12.试试sklearn库

import pandas as pd  #导入pandas库
import numpy as np   #导入numpy库
import matplotlib.pyplot as plt   #导入matplotlib.pyplot库 
import sklearn       #导入sklearn库
from sklearn import linear_model
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
# 2.读取数据:使用pandas库的read_csv()函数读取数据文件。数据文件中包含了人口和收益两列数据。
data=pd.read_csv(r"d:线性回归/regress_data1.csv")   #读取数据    
data.insert(0,"ones",1)    #插入列
col_num=data.shape[1]      #列数
m=data.shape[0]            #行数
# 5.划分数据:将数据分为训练集和测试集,这里只使用了训练集。
X=data.iloc[:,:col_num-1].values    #训练集的特征
y=data.iloc[:,col_num-1].values     #训练集的标签
y.reshape((m,1))
mod=linear_model.LinearRegression()
mod.fit(X,y)
Y=mod.predict(X)
plt.scatter(X[:,1],y,marker='o',color='b')
plt.plot(X,Y,marker='+',color='r')
plt.xlabel("人口")
plt.ylabel("收益")
plt.show()

人口与收益的关系图2

二、多变量线性回归

1.导入库

import pandas as pd  #导入pandas库
import numpy as np   #导入numpy库
import matplotlib.pyplot as plt   #导入matplotlib.pyplot库
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号

2.读取数据

datas=pd.read_csv(r"d:/线性回归/regress_data2.csv")   #读取数据
datas=(datas-datas.mean())/datas.std()     #正则化

3.划分数据

datas.insert(0,'ones',1)          #插入列
col_num=datas.shape[1]            #训练特征个数
m=datas.shape[0]                  #训练标签
X=datas.iloc[:,:col_num-1].values  #训练特征
y=datas.iloc[:,col_num-1].values   #训练标签
y=y.reshape((m,1))                 

4.定义假设函数

def h(X,w):
    return X@w

5.定义损失函数

def cost(X,y,w):
    return np.sum(np.power(h(X,w)-y,2))/(2*m)

6.定义梯度下降函数

def gradient_descent(X,y,w,n,a):
    t=w
    cost_lst=[]
    for i in range(n):
        error=h(X,w)-y
        for j in range(col_num-1):
            t[j,0]=w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))
        w=t
        cost_lst.append(cost(X,y,w))
    return w,cost_lst

7.训练模型

n=1000           #迭代次数
a=0.01           #学习率
w=np.zeros((col_num-1,1))     #初始化特征向量w
w,cost_lst=gradient_descent(X,y,w,n,a)
plt.plot(range(n),cost_lst,'r+-')
plt.xlabel("迭代次数")
plt.ylabel("误差")
plt.show()

训练模型图

8.运用sklearn绘图

import pandas as pd  
import numpy as np   
import matplotlib.pyplot as plt   
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
plt.rcParams['font.sans-serif'] = ['SimHei']   
plt.rcParams['axes.unicode_minus'] = False    
# 读取数据
datas = pd.read_csv(r"d:线性回归/regress_data2.csv")
datas = (datas - datas.mean()) / datas.std()
X = datas.iloc[:, :-1].values
y = datas.iloc[:, -1].values.reshape(-1, 1)
# 多项式回归
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
mod = linear_model.LinearRegression()
mod.fit(X_poly, y)
# 绘制拟合曲线
x1 = np.linspace(datas["面积"].min(), datas["面积"].max(), 50)
x2 = np.linspace(datas["房间数"].min(), datas["房间数"].max(), 50)
x1, x2 = np.meshgrid(x1, x2)
X_grid = np.column_stack((x1.flatten(), x2.flatten()))
X_grid_poly = poly.fit_transform(X_grid)
y_pred = mod.predict(X_grid_poly)
fig=plt.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(X[:,0], X[:,1], y, marker='o', color='b')
ax.plot_surface(x1, x2, y_pred.reshape(x1.shape), cmap='coolwarm')
ax.set_title("价格随面积与房间数的变化曲面")
ax.set_xlabel("面积")
ax.set_ylabel("房间数")
ax.set_zlabel("价格")
plt.show()

价格随面积以及房间数的变化曲面图

总结

线性回归三大要素

  1. 假设函数 h(X,w)
  2. 损失函数 cost(X,y,w)
  3. 梯度下降/最小二乘函数(求解权重向量w的函数)

普通线性回归步骤

  1. 导入库
  2. 读取数据
  3. 划分数据
  4. 假设函数(模型函数)
  5. 损失函数
  6. 梯度下降/最小二乘
  7. 训练模型
  8. 绘图预测

调用sklearn库进行线性回归的步骤

  1. 导入库
  2. 读取数据
  3. 调用sklearn库
  4. 绘图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux--抓包-连接状态

目录 一、TCP: 1.抓包: 2.工具: 3.状态: 4.命令: 三次握手: 应答确认: 四次挥手 一、TCP: 面向连接、可靠的、流式服务 1.抓包: 三次握手、四次挥手 2.工具&…

数据库:Redis数据库

目录 一、数据库类型 1、关系型数据库 2、非关系型数据库 3、关系型非关系型区别 二、Redis数据库 1、什么是Redis 3、Redis特点 4、Redis为什么读写快 5、部署Redis数据库 6、redis管理 7、Redis数据库五大类型 8、Redis数据库基础使用 9、redis五大类型增删查 …

数据库管理-第六十三期 烦(20230327)

数据库管理 2023-03-27第六十三期 烦1 跨版本PDB迁移补遗2 BUGs3 就低不就高总结第六十三期 烦 上个周末呢,因为一些客户的事情整的一个周末都在干活,其中两天还搞到的晚上12点,几乎没咋休息,现在感觉贼累,继续写文章…

为什么我们认为GPT是一个技术爆炸

从23年初,ChatGPT火遍全球,通过其高拟人化的回答模式,大幅提升了人机对话的体验和效率,让用户拥有了一个拥有海量知识的虚拟助手,根据UBS发布的研究报告显示,ChatGPT在1月份的月活跃用户数已达1亿&#xff…

Java实习生------Redis哨兵机制详解⭐⭐⭐

“无数的我们被世界碾压成一缩黑团,无数的我们试图与世界抗争到底”🌹 参考资料:图解redis 目录 什么是哨兵机制? 哨兵机制主要干了哪三件事? 哨兵监控主节点的过程是怎样的? 判断主节点故障之后&…

Servlet---服务端小应用程序(服务器端的小组件)

零.前置知识 1.tomcat—服务器容器 tomcat就是一个服务器容器,通常说的将项目部署到服务器,就是将项目部署到tomcat中(将项目放到tomcat容器中)。 浏览器向服务器发送一个HTTP请求,请求访问demo09.html页面&#xf…

【Linux】进程相关笔记

文章目录查看进程方式批量化注释fork进程状态R状态S状态D状态T状态t状态退出码问题X&&Z状态僵尸进程的危害makefile 新知识孤儿进程查看进程方式 ls /proc ls /proc/13045 (可以查看到之情进程的属性) ps axj | head -1 && ps ajx | grep myprocess(文件名) |…

垃圾回收之CMS、G1、ZGC对比

ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括: 停顿时间不超过10ms;停顿时间不会随着堆的大小,或者活跃对象的大小而增加;支持8MB~4TB级别的堆&#x…

【C++】string类的模拟实现

目录 一、前言 二、模拟实现 1、构造函数 2、拷贝构造函数 3、operator 4、operator[] 5、迭代器 6、string类的比较 7、string类的扩容 7.1、reserve 7.2、resize 8、string类的尾插 8.1、push_back 与 append 8.2、operator 9、string类的insert 9.1、插入字符…

deepin15.11无法正常输入汉字问题的解决

1,起因 本来是sougou输入法 但是由于自己突发奇想 在那瞎折腾 一不小心把配置给弄坏了 就再也回不到之前可以正常打印汉字的状态 历经两个小时的折腾 总算是又能输入汉字啦 耗费两个多小时 对当下的我来说时间成本着实有点高 但是把问题给解决了 总算还是有点收获 平时的学习过…

注意力机制 | CNN-BiLSTM-Attention基于卷积-双向长短期记忆网络结合注意力机制多输入单输出回归预测(Matlab程序)

注意力机制 | CNN-BiLSTM-Attention基于卷积-双向长短期记忆网络结合注意力机制多输入单输出回归预测(Matlab程序) 目录 注意力机制 | CNN-BiLSTM-Attention基于卷积-双向长短期记忆网络结合注意力机制多输入单输出回归预测(Matlab程序)预测结果评价指标基本介绍程序设计参…

qt 编译器 调试器

电脑版本:win10 64位 qt版本:based on Qt 5.14.0(msvc 2017, 32位) Qt Creator 4.11.0 qt安装包:qt-opensource-windows-x86-5.9.9.exe 安装过程一路next,安装完成后,默认使用的…

Spring IoC循环依赖问题

什么是循环依赖 循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环。⽐如A依赖于B,B依赖于C,C⼜依赖于A。 注意,这⾥不是函数的循环调⽤,是对象的相互依赖关系。循环调…

一个服务端同学的Vue框架入门及实践

做为服务端同学,接触前端代码较少,刚毕业的时候用过 jQuery Bootstrap2/3,当时的感觉就是,容易上手,学习门槛相对较低,另外就是有一个非常成熟的 jQuery 插件库,在这里,几乎可以找到…

vue集成tui.calendar日历组件

vue集成tui.calendar日历组件前言一、简介、效果图二、vue简单集成(集成js版本,没有使用官方的vue2版本)1.引包2.简单示例三、自定义功能1.需求分析、效果展示2.实现思路前言 vue2的集成在git上官方已经给出了demo这里就不贴代码了。本次主要是vue3集成 最近有个功能需要一个日…

重发布实验

基础配置: [r1]int l0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip ad 192.168.12.1 24 [r1-GigabitEthernet0/0/0]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 192.168.123.1 24 [r1]ospf 1 router-id 1.1.1.1 [r1-o…

自学大数据第12天~Hbase

先留个问题~ERROR: KeeperErrorCode ConnectionLoss for /hbase/master 稍后解决 找到了问题的根因: 查看报错日志 事关tmp文件夹的配置,所以去找一下hbase配置文件中关于这个文件夹的配置项 我的策略是将这个配置项注销掉 然后启动hbase ,之后hmaster就成功启动了; 接着s…

熟练Redis之无处不在的锁

为了保证并发访问的正确性,Redis提供了两种方法,分别是加锁和原子操作 Redis加锁两个问题:一个是,如果加锁操作多,会降低系统的并发访问性能;第二个是,Redis客户端要加锁时,需要用到分布式锁,而分布式锁实…

Coremail奇安信发布2022中国企业邮箱安全性研究:应对ChatGPT带来的安全挑战

日前,广东盈世科技计算机有限公司与奇安信集团联合编写发布《2022中国企业邮箱安全性研究报告》。 报告数据显示:2022年,全国企业邮箱用户共收到各类钓鱼邮件约425.9亿封,相比2021年收到各类钓鱼邮件的342.2亿封增加了24.5%。 一…

华为OD机试用java实现 -【RSA 加密算法】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:RSA 加密算法 题目 RSA 加密…