吴恩达机器学习--线性回归

news2024/10/4 0:31:53

文章目录

  • 前言
  • 一、单变量线性回归
    • 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. 绘图

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

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

相关文章

掌握高效绘制地图的利器——LeafletJs

文章目录前言一、leafletJs是什么?二、快速入门1、安装2、快速入门三、进阶学习1、Map 控件2、Marker 标记3、Popup 弹出窗口4、图层四、项目实战封装文件4.1 基础点位图4.2 行驶轨迹图前言 GIS 作为获取、存储、分析和管理地理空间数据的重要工具,用 G…

数据结构与算法一览(树、图、排序算法、搜索算法等)- Review

算法基础简介 - OI Wiki (oi-wiki.org) 文章目录1. 数据结构介绍1.1 什么是数据结构1.2 数据结构分类2. 链表、栈、队列:略3. 哈希表:略4. 树4.1 二叉树4.2 B 树与 B 树4.3 哈夫曼(霍夫曼)树:Huffman Tree4.4 线段树&a…

编辑文件/文件夹权限 - Win系统

前言 我们经常会遇到由于权限不够无法删除文件/文件夹的情况,解决方案一般是编辑文件/文件夹的权限,使当前账户拥有文件的完全控制权限,然后再进行删除,下文介绍操作步骤。 修改权限 查看用户权限 右键文件/文件夹,…

(函数指针) 指向函数的指针

函数指针- 指向函数的指针函数指针的声明和使用通过函数指针调用函数函数指针做参数函数指针数组函数指针的声明和使用 函数指针的声明格式: 返回值类型 (*函数指针名)(参数列表); 其中: *函数指针名 表示函数指针的名称返回值类型 则表示该指针所指向…

【Kubernetes】StatefulSet对象详解

文章目录简介1. StatefulSet对象的概述、作用及优点1.1 对比Deployment对象和StatefulSet对象1.2 以下是比较Deployment对象和StatefulSet对象的优缺点:2. StatefulSet对象的基础知识2.1 StatefulSet对象的定义2.1.1 下表为StatefulSet对象的定义及其属性&#xff1…

上岸川大网安院

一些感慨 一年多没写过啥玩意了,因为考研去了嘿嘿。拟录取名单已出,经历一年多的考研之路也可以顺利打上句号了。 我的初试成绩是380,政治65,英语81,数学119,专业课115。 回顾这一路,考研似乎也…

分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测

分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测分类效果基本介绍模型描述程序设计参考资料分类效果 基本介绍 MATLAB实现CNN-BiLSTM-Attention多输入分类预测,CNN-BiLSTM结合注意力机制多输…

Vue3使用Vant组件库避坑总结

文章目录前言一、问题二、解决方法三、问题出现原因总结经验教训前言 本片文章主要写了,Vue3开发时运用Vant UI库的一些避坑点。让有问题的小伙伴可以快速了解是为什么。也是给自己做一个记录。 一、问题 vue3版本使用vant失败,具体是在使用组件时失效…

IPBX系统快速部署和Freeswitch 1.10.7自动安装

IPBX系统部署文档 IPPBX系统 1.10.7版本Freeswitch ,手机互联互通,SIP协议,分机互相拨打免费通话清晰,支持wifi或4G网络互相拨打电话,可以对接OLT设备,系统可以部署到本地物理机,也可以部署到阿…

工程质量之研发过程管理需要关注的点

一、背景 作为程序猿,工程质量是我们逃不开的一个话题,工程质量高带来的好处多多,我在写这篇文章的时候问了一下CHATGPT,就当娱乐一下,以下是ChatGPT的回答: 1、提高产品或服务的可靠性和稳定性。高质量的系…

光时域反射仪那个品牌的好用

光时域反射仪 哪个品牌好用 光时域反射仪要怎么选到合适自己的,这些问题 可能一直在困扰这一线的工作人员,下面小编就为大家一一解答下 首先光时域域反射仪是一款检测光纤线路的损耗 长度 以及 事件点的一款设备,在诊断 光纤线路 故障点的情…

从零开始学架构——CAP理论

CAP定理 CAP 定理(CAP theorem)又被称作布鲁尔定理(Brewer’s theorem),是加州大学伯克利分校的计算机科学家埃里克布鲁尔(Eric Brewer)在 2000 年的 ACM PODC 上提出的一个猜想。2002 年&…

Web前端 HTML、CSS

HTML与CSSHTML、CSS思维导图一、HTML1.1、HTML基础文本标签1.2、图片、音频、视频标签1.3、超链接、表格标签1.4、布局1.5、表单标签1.6、表单项标签综合使用1.7、HTML小结二、CSS(简介)2.1、引入方式2.2、选择器2.3、CSS属性Web前端开发总览 Html&…

案例拆解丨ChatGPT+塔罗牌,批量起号、暴利引流,小白也能轻松月入10000+

ChatGPT 的出现,大大拉低了很多行业的门槛,比如客服、教育、翻译、自媒体……而塔罗牌占卜,肯定也是其中之一。 塔罗牌是一种占卜工具,由78张牌组成。可以用于占卜、灵性探索、个人成长和自我发现。 这是一个相对小众&#xff0c…

LinuxGUI自动化测试框架搭建(十三)-创建工具集目录tools并封装文件复制方法cpoyFile.py

(十三)-创建工具集目录tools并封装文件复制方法cpoyFile.py 1 tools的作用2 创建tools目录3 创建文件复制方法cpoyFile.py4 设计cpoyFile.py4.1 安装shutil4.2 导入模块4.3 脚本设计5 目前框架目录1 tools的作用 为了存放框架需要用到的一些常用工具或方法,比如文件复制功能…

OJ系统刷题 第九篇(难篇)

13441 - 求小数的某一位(难题,二刷、三刷!) 时间限制 : 1 秒 内存限制 : 128 MB 分数\tfrac {a}{b}ba​化为小数后,小数点后第n位的数字是多少? 输入 三个正整数a,b,n&#xff0…

使用jni-rs实现Rust与Android代码互相调用

本篇主要是介绍如何使用jni-rs。有关jni-rs内容基于版本0.20.0,新版本写法有所不同。 入门用法 在Rust库交叉编译以及在Android与iOS中使用中我简单说明了jni-rs及demo代码,现在接着补充一些详细内容。 首先贴上之前的示例代码: use std:…

嘉靖王朝最大的一出闹剧和惨剧——大礼仪之争

大礼仪之争 大礼议是指发生在正德十六年(1521年)到嘉靖三年(1524年)间的一场皇统问题上的政治争论。 原因是明世宗以地方藩王入主皇位,为其改换父母的问题所引起,是明朝历史第二次小宗入大宗的事件。 “…

罗丹明荧光染料标记叶酸,FA-PEG-RB,叶酸-聚乙二醇-罗丹明;Folic acid-PEG-RB

FA-PEG-RB,叶酸-聚乙二醇-罗丹明 中文名称:叶酸-聚乙二醇-罗丹明 英文名称:FA-PEG-RB, Folic acid-PEG-RB 性状:粉红色固体或液体,取决于分子量 溶剂:溶于水和DMSO、DMF等常规性有机溶剂 保存条件:-2…

【Python】【进阶篇】二十一、Python爬虫的多线程爬虫

目录二十一、Python爬虫的多线程爬虫21.1 多线程使用流程21.2 Queue队列模型21.3 多线程爬虫案例1) 案例分析​2) 完整程序二十一、Python爬虫的多线程爬虫 网络爬虫程序是一种 IO 密集型程序,程序中涉及了很多网络 和 本地磁盘的 IO 操作,这会消耗大量…