吴恩达471机器学习入门课程1第2周——线性回归(单变量)

news2024/11/16 7:50:42

文章目录

  • Linear Regression
    • 1 导包
    • 2 - 问题陈述
    • 3 - 数据集
        • 可视化数据
    • 4 - 线性回归复习
    • 5 - 计算代价
        • 代价函数
        • 模型预测
        • 实现
    • 6 - 梯度下降
      • 批量梯度下降法学习参数

Linear Regression

您将使用一个变量实现线性回归,以预测餐厅特许经营的利润。

1 导包

首先,让我们运行下面的单元格来导入此任务中所需的所有包。

  • numpy 是在 Python 中处理矩阵的基本包。
  • matplotlib 是 Python 中绘制图形的著名库。
  • utils.py 包含此任务的辅助功能。 您不需要修改此文件中的代码。
import numpy as np
import matplotlib.pyplot as plt
from utils import *
import copy
%matplotlib inline

2 - 问题陈述

假设你是一家餐厅连锁店的CEO,正在考虑在不同的城市开设新店。

  • 你希望将业务扩展到可能为餐厅带来更高利润的城市。
  • 该连锁店已经在各个城市有餐厅,你拥有这些城市的利润和人口数据。
  • 你还有一些候选城市的数据。
    • 对于这些城市,你知道其人口。

你能否使用这些数据来帮助你确定哪些城市可能会为你的业务带来更高的利润?

3 - 数据集

你将首先加载此任务的数据集。

  • 下面显示的 load_data() 函数将数据加载到变量 x_trainy_train
    • x_train 是一个城市的人口
    • y_train 是该城市餐厅的利润。 利润的负值表示亏损。
    • X_trainy_train 都是 numpy 数组。
# 加载数据集
x_train, y_train = load_data()

可视化数据

通过可视化了解数据通常很有用。

  • 对于这个数据集,您可以使用散点图来可视化数据,因为它只有两个属性需要绘制(利润和人口)。
  • 许多在现实生活中可能遇到的其他问题具有超过两个属性(例如,人口、平均家庭收入、月利润、月销售额)。当您拥有超过两个属性时,仍然可以使用散点图来查看每对属性之间的关系。
fig = plt.figure(figsize=(20,8))
plt.scatter(x_train,y_train,marker='x',c='r')
plt.rcParams['font.sans-serif']=['SimHei']
plt.title("每个城市的利润与人口")
plt.ylabel("利润(/$10,000)")
plt.xlabel("人口(/10,000s)")
plt.show()

png

你的目标是构建一个线性回归模型来拟合这些数据。

  • 通过这个模型,您可以输入一个新城市的人口,然后让模型估计该城市餐厅的潜在月利润。

4 - 线性回归复习

在这个实验室中,您将拟合线性回归参数**(w,b)**到您的数据集上。

  • 线性回归模型函数是一个从 x(城市人口)映射到 y(该城市餐厅的月利润)的函数,表示为
    f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b(x)=wx+b

  • 要训练线性回归模型,您想找到最适合您的数据集的**(w,b)**参数。

    • 为了比较一个 (w,b) 的选择相对于另一个选择更好或更差,您可以使用代价函数 J(w,b) 进行评估

      • J是关于 **(w,b)**的函数。也就是说,代价 J(w,b) 的值取决于 **(w,b)**的值。
    • 最适合您的数据的 **(w,b)**的选择是具有最小代价 J(w,b) 的那个。

  • 要找到使代价 J(w,b) 最小的值 (w,b),您可以使用一种称为梯度下降的方法。

    • 每次梯度下降的步骤都会使您的参数 (w,b) 接近最优值,这些最优值将实现最低代价 J(w,b)
  • 训练后的线性回归模型可以接受输入特征 x(城市人口)并输出一个预测 f_{w,b}(x)(该城市餐厅的预计月利润)。

5 - 计算代价

梯度下降涉及重复的步骤来调整您的参数 ( w , b ) (w,b) (w,b) 的值,以逐渐获得更小的代价 J ( w , b ) J(w,b) J(w,b)

  • 在每个梯度下降的步骤中,通过计算代价 J ( w , b ) J(w,b) J(w,b) 可以帮助您监视您的进展情况,因为 ( w , b ) (w,b) (w,b) 被更新。
  • 在本节中,您将实现一个函数来计算 J ( w , b ) J(w,b) J(w,b),以便您可以检查您的梯度下降实现的进度。

代价函数

正如您在讲座中所记得的那样,对于一个变量,线性回归的代价函数 J ( w , b ) J(w,b) J(w,b) 定义为

J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)})^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2

  • 您可以将 f w , b ( x ( i ) ) f_{w,b}(x^{(i)}) fw,b(x(i)) 视为模型对您餐厅利润的预测,而不是数据中记录的实际利润 y ( i ) y^{(i)} y(i)
  • m m m 是数据集中的训练示例数量。

模型预测

  • 对于一个变量的线性回归模型,模型 f w , b f_{w,b} fw,b 对于示例 x ( i ) x^{(i)} x(i) 的预测表示为:

f w , b ( x ( i ) ) = w x ( i ) + b f_{w,b}(x^{(i)}) = wx^{(i)} + b fw,b(x(i))=wx(i)+b

这是一条直线的方程,具有截距 b b b 和斜率 w w w

实现

请完成下面的 compute_cost() 函数来计算代价 J ( w , b ) J(w,b) J(w,b)

  • 遍历训练示例,并针对每个示例计算:

    • 模型对于该示例的预测值
      f w b ( x ( i ) ) = w x ( i ) + b f_{wb}(x^{(i)}) = wx^{(i)} + b fwb(x(i))=wx(i)+b

    • 该示例的代价 c o s t ( i ) = ( f w b − y ( i ) ) 2 cost^{(i)} = (f_{wb} - y^{(i)})^2 cost(i)=(fwby(i))2

  • 返回所有示例的总代价
    J ( w , b ) = 1 2 m ∑ i = 0 m − 1 c o s t ( i ) J(\mathbf{w},b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} cost^{(i)} J(w,b)=2m1i=0m1cost(i)

    • 这里, m m m 是训练示例的数量, ∑ \sum 是求和运算符

如果您遇到困难,可以在下面的单元格中查看提示,以帮助您进行实现。

def compute_cost(x,y,w,b):
    m = x.shape[0]
    total_cost = 0
    cost = 0
    for i in range(m):
        f_wb = w*x[i]+b
        cost += (f_wb-y[i])**2
    total_cost = cost/(2*m)
    return total_cost

6 - 梯度下降

在本节中,您将实现线性回归参数 w , b w, b w,b 的梯度下降。

如视频讲座中所述,梯度下降算法如下:

重复直到收敛:    {    0000 b : = b − α ∂ J ( w , b ) ∂ b    0000 w : = w − α ∂ J ( w , b ) ∂ w    } \begin{align*}& \text{重复直到收敛:} \; \lbrace \; & \phantom {0000} b := b - \alpha \frac{\partial J(w,b)}{\partial b} \; & \phantom {0000} w := w - \alpha \frac{\partial J(w,b)}{\partial w} \tag{1} \; & & \rbrace\end{align*} 重复直到收敛:{0000b:=bαbJ(w,b)0000w:=wαwJ(w,b)}(1)
在此公式中,参数 w, b 同时更新,其中
∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) (2) \frac{\partial J(w,b)}{\partial b} = \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)}) \tag{2} bJ(w,b)=m1i=0m1(fw,b(x(i))y(i))(2)
∂ J ( w , b ) ∂ w = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) (3) \frac{\partial J(w,b)}{\partial w} = \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) -y^{(i)})x^{(i)} \tag{3} wJ(w,b)=m1i=0m1(fw,b(x(i))y(i))x(i)(3)

  • m 是数据集中的训练示例数量

  • f w , b ( x ( i ) ) f_{w,b}(x^{(i)}) fw,b(x(i))是模型的预测值,而 y ( i ) y^{(i)} y(i) 是目标值

您将实现一个名为 compute_gradient 的函数,该函数计算 ∂ J ( w ) ∂ w \frac{\partial J(w)}{\partial w} wJ(w) ∂ J ( w ) ∂ b \frac{\partial J(w)}{\partial b} bJ(w)

  • 遍历每个训练样例,并计算:

    • 模型对该样例的预测值
      f w b ( x ( i ) ) = w x ( i ) + b f_{wb}(x^{(i)}) = wx^{(i)} + b fwb(x(i))=wx(i)+b

    • 参数w, b 相对于该样例的梯度
      ∂ J ( w , b ) ∂ b ( i ) = ( f w , b ( x ( i ) ) − y ( i ) ) \frac{\partial J(w,b)}{\partial b}^{(i)} = (f_{w,b}(x^{(i)}) - y^{(i)}) bJ(w,b)(i)=(fw,b(x(i))y(i))
      ∂ J ( w , b ) ∂ w ( i ) = ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) \frac{\partial J(w,b)}{\partial w}^{(i)} = (f_{w,b}(x^{(i)}) -y^{(i)})x^{(i)} wJ(w,b)(i)=(fw,b(x(i))y(i))x(i)

  • 返回所有样例的总梯度更新
    ∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ∂ J ( w , b ) ∂ b ( i ) \frac{\partial J(w,b)}{\partial b} = \frac{1}{m} \sum\limits_{i = 0}^{m-1} \frac{\partial J(w,b)}{\partial b}^{(i)} bJ(w,b)=m1i=0m1bJ(w,b)(i)

    ∂ J ( w , b ) ∂ w = 1 m ∑ i = 0 m − 1 ∂ J ( w , b ) ∂ w ( i ) \frac{\partial J(w,b)}{\partial w} = \frac{1}{m} \sum\limits_{i = 0}^{m-1} \frac{\partial J(w,b)}{\partial w}^{(i)} wJ(w,b)=m1i=0m1wJ(w,b)(i)

    • 这里, m m m是训练样例的数量, ∑ \sum 是求和操作符

如果您遇到困难,可以查看下面单元格中提供的提示来帮助您实现。

def coumpute_gradient(x,y,w,b):
    m = x.shape[0]
    dj_dw = 0
    dj_db = 0
    for i in range(m):
        f_wb = w*x[i]+b
        dj_dw += (f_wb-y[i])*x[i]
        dj_db += f_wb-y[i]
    return dj_dw/m,dj_db/m

批量梯度下降法学习参数

现在,您将使用批量梯度下降法找到线性回归模型的最优参数。批量指运行一次迭代中的所有示例。

  • 对于此部分,您无需实现任何内容。只需运行下面的单元格即可。

  • 验证梯度下降法是否正常工作的好方法是查看 J ( w , b ) J(w,b) J(w,b) 的值并检查它是否随着每个步骤而减小。

  • 假设您已经实现了梯度并正确计算了成本,并且您有合适的学习率 alpha, J ( w , b ) J(w,b) J(w,b) 不应增加,并且应该在算法结束时收敛到稳定值。

def gradient_descent(x,y,w_in,b_in,cost_function,gradient_function,alpha,num):
    m = x.shape[0]
    J_history = []
    w_history = []
    w = copy.deepcopy(w_in)
    b = b_in
    for i in range(num):
        dj_dw,wj_db = gradient_function(x,y,w,b)
        w -= alpha*dj_dw
        b -= alpha*wj_db

        cost = cost_function(x,y,w,b)
        J_history.append(cost)
        w_history.append(w)
    return w,b,J_history,w_history

现在让我们运行上面的梯度下降算法来得出数据集的参数。

init_w = 0
inti_b = 0

number = 10000
alpha = 0.02

w,b,J_history,w_history = gradient_descent(x_train,y_train,init_w,inti_b,compute_cost,coumpute_gradient,alpha,number)
print(f"w:{w},b:{b}")
w:1.1930336441895875,b:-3.8957808783117933
fig,ax = plt.subplots(1,2,figsize=(20,8))
iterations = [j for j in range(number)]
ax[0].plot(iterations,J_history)
ax[0].set_title("J_history vs. ites")
ax[0].set_ylabel("J_history")
ax[0].set_xlabel("iterations")
ax[1].plot(iterations,w_history)
ax[1].set_title("w_history vs. iterations")
ax[1].set_ylabel("w_history")
ax[1].set_xlabel("iterations")
Text(0.5, 0, 'iterations')

png

我们现在将使用梯度下降的最终参数来绘制线性拟合图。

回想一下,我们可以得到单个样本的预测值 f ( x ( i ) ) = w x ( i ) + b f(x^{(i)})= wx^{(i)}+b f(x(i))=wx(i)+b

为了计算整个数据集上的预测值,我们可以循环遍历所有训练样本,并计算每个样本的预测值。以下代码块展示了这一过程。

m = x_train.shape[0]
predicted = np.zeros(m)

for i in range(m):
    predicted[i] = w * x_train[i] + b

绘制拟合曲线

fig = plt.figure(figsize=(20,8))
plt.plot(x_train, predicted, c = "b")
plt.scatter(x_train, y_train, marker='x', c='r')
plt.title("Profits vs. Population per city")
plt.ylabel('Profit in $10,000')
plt.xlabel('Population of City in 10,000s')
Text(0.5, 0, 'Population of City in 10,000s')


png

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

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

相关文章

【电路】电路与电子技术基础 课堂笔记 第12章 集成逻辑门电路

12.4 正逻辑与负逻辑 正负逻辑转换规则 正负逻辑符号

2023 华为 Datacom-HCIE 真题题库 (6月11新增部分)--含解析

单项选择题 1.[试题编号:263143] (单选题)华为CloudCampus位置服务(wifi方案),获取基于在wifi的位置数据,并上报至开发者的LBS应用。开发者可以使用数据,计算范围内的wi-fi终端位置信息。对于LBS位置应用和iMaster NCE的交互流程,以下哪项是错误的?(单选)单选 A、LBS…

Vue中如何进行Markdown编辑与渲染?

Vue中如何进行Markdown编辑与渲染? Markdown是一种轻量级的标记语言,广泛用于编写技术文档、博客、论坛等。Vue.js是一款流行的JavaScript框架,它提供了一些有用的工具来处理DOM元素和用户界面。在Vue中,我们可以使用一些库和组件…

除了Midjourney和Stable Diffusion,还有哪些AI模型可以使用

Midjourney是一款广受设计师和艺术家欢迎的人工智能图像生成器。然而,最近它停止提供免费试用,让许多用户开始寻找替代品。在本文中,我们为您编制了一个2023年可尝试的十大Midjourney替代品列表。我们包括了免费和付费选项,让您可…

Hutool工具类库之图片验证码

文章目录 一、介绍二、示例1、LineCaptcha 线段干扰的验证码2、CircleCaptcha 圆圈干扰验证码3、ShearCaptcha 扭曲干扰验证码4、GifCaptcha 验证码5、写出到浏览器(Servlet输出)6、自定义验证码 一、介绍 验证码功能位于 cn.hutool.captcha 包中&#x…

【电路】电路与电子技术基础 课堂笔记 第13章 组合逻辑电路的分析与设计

组合逻辑电路:任意时刻的输出稳定状态仅仅取决于该时刻的输入信号,而与输入信号作用前电路所处的状态无关。 13.1 组合逻辑电路分析 13.1.2 加法器电路分析 S就是Sum,CO 就是Carry-Over(进位)。 算术运算是数字系统的…

ROS学习——通信机制(参数服务器)

一、引言 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场…

【c++】组合类+继承情况下构造顺序

组合类继承情况下构造顺序 构造顺序同普通继承&#xff0c;先父后子&#xff0c;内部类是最老的&#xff08;最先调用构造的&#xff09;。 示例代码 class A { public:A(int a 0):_a(a){cout << "A()" << endl;}~A(){cout << "~A()" …

如何将本地python项目部署到阿里云服务器上(完整版)

一、准备阿里云服务器 首先在阿里云服务器免费试用网站中选择相应的服务器&#xff0c;本次搭建选择的服务器是适合入门级开发者的服务器。在阿里云控制台上创建一个云服务器&#xff08; ECS 实例&#xff09;并获取访问凭证&#xff0c;包括主机 IP 地址、用户名和密码。在服…

K Shortest Paths算法之Eppstein algorithm

Eppstein的算法是David Eppstein于1998年提出的一种高效且易于实现的k条最短路径寻找方法。它的时间复杂度为O(m n log n k)&#xff0c;其中m是边的数量&#xff0c;n是节点的数量&#xff0c;k是要寻找的路径数。相较于其他方法&#xff0c;它具有较好的性能和实用性。 Epp…

路漫漫其修远兮

其实不仅是专业&#xff0c;AI冲击波才刚刚开启&#xff0c;包括博客、自媒体作用也在大幅度下降呢。 很多人看过如下这幅图&#xff1a; 提示工程师确实是在当前大型语言模型不够完善的情况下&#xff0c;通过微调输入的方式来提高模型的性能。随着模型的迭代&#xff0c;这些…

算法模板(8):网络流(1):最大流

算法模板&#xff08;8&#xff09;&#xff1a;网络流&#xff08;1&#xff09;&#xff1a;最大流 网络流基本概念 基本概念 流网络&#xff0c;不考虑反向边可行流&#xff0c;不考虑反向边 两个条件&#xff08;根据《算法导论》&#xff0c;这两个条件可以看作可行流的充…

mapbox实现线要素的文字标注功能

效果图 操作步骤 首先查看mapbox自己的api里面有没有&#xff0c;好像里面并没有类似于line-text的属性 然后打开mapbox studio&#xff0c;发现里面确实是有这种样式的&#xff0c;他的图层名字叫 然后我们下载下来这个样式 打开style.json文件之后&#xff0c;找到这个图…

【数据可视化】Plotly Express绘图库使用

Plotly Express是一个基于Plotly库的高级Python可视化库。它旨在使绘图变得简单且直观&#xff0c;无需繁琐的设置和配置。通过使用Plotly Express&#xff0c;您可以使用少量的代码创建具有丰富交互性和专业外观的各种图表。以下是Plotly Express的一些主要特点和优势&#xf…

Maven教学--上

Maven教程–上 先看一个问题&#xff0c;引出Maven 需求说明/图解 编写一个类, 有一个方法sum&#xff0c;可以返回两个数的和编写测试类TestSum, 可以测试sum 是否正确. 使用传统方式完成 创建传统的java 项目java-hello 创建Hello.java public class Hello {public S…

【30天熟悉Go语言】5 Go 基本数据类型

文章目录 一、前言二、数据类型总览1、基本数据类型1&#xff09;数值型-整数类型1> 有符号整数类型&#xff1a;2> 无符号整数类型&#xff1a;3> 其他整数类型&#xff1a;4> PS:Go的整数类型&#xff0c;默认声明为int类型&#xff1a;5> 变量占用的字节数 2…

PowerShell系列(六):PowerShell脚本执行策略梳理

目录 1、执行策略等级 2、执行策略范围 3、执行策略命令语法格式 4、执行策略常用命令 PowerShell 是一种用于操作 系统的命令行界面&#xff0c;支持跨平台&#xff0c;它提供了许多功能来自动化和优化各种任务。PowerShell 是由微软官方开发的&#xff0c;并作为 Windows Ser…

教培行业的“智能GPT私教”?WorkPlusAI助理帮助教培机构实现十倍人效!

从横空出世到掀起高潮&#xff0c;当下&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;模式下的ChatGPT它正以惊人的速度席卷各个领域&#xff0c;在线教培行业也不例外。那么&#xff0c;正式进入落地期的ChatGPT&#xff0c;在在线教培行业有那些应用前景呢&#…

QT中信号和槽的概念

信号就是发生什么事件&#xff0c;槽就是触发什么函数&#xff0c;所以信号与槽就是发生什么事件(比如点击某个按钮)然后就会触发某个函数 connect(信号的发送者&#xff0c;发送的具体信号&#xff0c;信号的接受者&#xff0c;信号的处理&#xff09; connect(myButton , &a…

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象&#xff0c;虽然Java有垃圾回收机制&#xff08;GC&#xff09;&#xff0c;但是对于还保持着引用&#xff0c; 该内存不能再被分配使用&#xff0c;逻辑上却已经不会再用到的对象&#xff0c;垃圾回…