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

article/2025/9/19 14:23:28

文章目录

  • 前言
  • 一、单变量线性回归
    • 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=wcost_lst=[]for i in range(n):error=h(X,w)-yfor j in range(col_num-1):t[j][0]=w[j][0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))w=tcost_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@yreturn 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=wcost_lst=[]for i in range(n):error=h(X,w)-yfor 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=tcost_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=wcost_lst=[]for i in range(n):error=h(X,w)-yfor j in range(col_num-1):t[j,0]=w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))w=tcost_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://chatgpt.dhexx.cn/article/51yniQV0.shtml

相关文章

吴恩达《机器学习》笔记

引言:个人当前研究倾向是智慧医疗,旨在通过信息科技的数据处理手段,解决当前医学界的问题。 学习初步思路:在师兄的指导下,初步的学习计划为理论与竞赛并行,即一方面补充基础知识,另一方面竞赛实…

吴恩达机器学习课程笔记一

吴恩达机器学习课程笔记 前言监督学习---Supervised learning无监督学习---Unsupervised learning聚类异常检测降维 增强学习---Reinforcement learning Linear regression一些机器学习的名词参考博客损失函数参考博客梯度下降的实现学习率alpha的选择学习率过小学习率过大 线性…

吴恩达机器学习--学习笔记

1. Introduction 1.1 Welcome 如今机器学习被大规模应用于: 数据挖掘(网站点击,医学记录,生物学,工程)一些无法通过编程实现的功能(自动驾驶,手写识别,NLP&#xff0c…

【吴恩达机器学习2022学习笔记】课程1 -- 机器学习基础

吴恩达大佬又重新录了机器学习视频,借此机会重温并做笔记简单记录一下。课程共分成三门,首先是机器学习基础。 课程链接:https://www.bilibili.com/video/BV19B4y1W76i/?spm_id_from333.788.recommend_more_video.1&vd_source337295bc6e…

机器学习(吴恩达)

定义:计算机程序从经验E中学习,解决某一任务T,进行某一性能度量P,通过P测定在T上的表现因经验E而提高,以跳棋游戏为例,经验E就是程序与自己下几万次跳棋,任务T就是玩跳棋,性能度量P就…

【机器学习】吴恩达机器学习Deeplearning.ai

机器学习已经强大到可以独立成为人工智能的一个子领域。 可以通过对机器编程实现比如执行网络搜索、理解人类语言、通过x光诊断疾病,或制造自动驾驶汽车。 机器学习定义 一般来说,给一个算法学习的机会越多,它的表现就越好。 机器学习的两种…

吴恩达机器学习(一)—— 简介

机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的…

吴恩达机器学习课后作业

目录 01-linear regression线性回归预备知识单变量线性回归( 一个特征值)单变量线性回归( 多个特征值)单变量线性回归( 正规方程) 01-linear regression 线性回归预备知识 假设函数与损失函数&#xff1a…

【吴恩达机器学习笔记】七、神经网络

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为学习吴恩达机器学习视频的同学提供的随堂笔记。 📚专栏简介:在这个专栏,我将整理吴恩达机器学习视频的所有内容的笔记&…

吴恩达机器学习 2022新版

2022吴恩达机器学习 第一周 一. 机器学习的定义二. 机器学习的分类2.1. 监督学习【回归算法】【分类算法】 三. loss function3.1.损失函数公式 四. 梯度下降4.1.梯度下降算法4.2.理解梯度下降4.3.学习率的选择4.5.如何计算导数项? 一. 机器学习的定义 Arthur Samu…

【经典】吴恩达《机器学习》课程

如果要推荐《机器学习》的学习课程,那必然首选吴恩达的《机器学习》课程,无论是国内还是国外,这是最火的机器学习入门课程,没有之一。吴恩达老师用易于理解、逻辑清晰的语言对机器学习算法进行介绍,无数新手正是通过这…

吴恩达机器学习系列课程笔记——第一章:什么是机器学习(Machine Learning)

1.1 欢迎 https://www.bilibili.com/video/BV164411b7dx?p1 第一节主要讲了什么是机器学习,机器学习能做些什么事情。 机器学习是目前信息技术中最激动人心的方向之一。在这门课中,你将学习到这门技术的前沿,并可以自己实现学习机器学习的…

机器学习——吴恩达

机器学习——吴恩达 inductionSupervised learningUnsupervised learning modelexamplehow to workdefine cost functiongradient descent for minimizing the cost functionGradient descent for linear regression Matrix and Vector定义运算multiple feature linear regress…

吴恩达—机器学习的六个核心算法

吴恩达,华裔美国人,是斯坦福大学计算机科学系和电子工程系副教授,人工智能实验室主任。吴恩达是人工智能和机器学习领域国际上最权威的学者之一。他是百度的前副总裁兼首席科学家,最受欢迎的机器学习在线课程之一的创建者&#xf…

【机器学习】机器学习笔记(吴恩达)

文章目录 中文笔记地址视频地址第1章 引言1.1 欢迎1.2 机器学习是什么1.3 监督学习1.4 无监督学习 第2章2.1 模型展示单变量线性回归 2.2 代价函数2.3-2.4 代价函数理解2.5-2.6 梯度下降算法,梯度下降算法理解 第3章第4章4.2 多元(多变量)梯度…

python编码无法使用turtle库_使用Turtle库教Python

Python是一种流行的基于文本的编程语言,程序员每天都在使用它。使用Turtle库(Turtle Library)教Python可以激发对STEM的兴趣。 Turtle库是用于控制机器人Turtle的功能的集合。这些命令可以与Python结合使用,以构建精美作品和原创游戏的程序。The Turtle …

turtle库的介绍

一、turtle库概述: turtle(海龟)库是turtle绘图体系python的实现; turtle绘图体系:1969年诞生,主要用于程序设计入门; turtle库是python的标准库之一;属于入门级的图形绘制函数库…

python turtle库下载_python3中安装turtle库

开始在网上找资料安装的时候踩了一点坑,来总结一下经验 直接安装 安装 pip install turtle 会提示错误:Command "python setup.py egg_info" failed with error code 1 解决方法 1.直接找到turtle 0.0.2(地址是这个),把turtle…

python基础之 turtle 库总结

python基础之 turtle 库总结 文章目录 python基础之 turtle 库总结1. 准备工作1.1 准备画布1.2 画笔设置 2. 画笔运动函数2.1 向前:forward() | fd()2.2 向后:backward() | bk() | back()2.3 向右:right() | rt()2.4 向左:left() …

turtle库的精讲

大家好,我是Python领域的博主。 如果你是编程爱好者可以小编一起学习,在这里我每天都会发Python的基础知识,以及相关的代码。 如果文章有什么错误的地方,请不吝赐教。 觉得博主文章写的还错的话,请三连支持一下博主哦 …