吴恩达机器学习2022-Jupyter

news2025/1/17 21:42:42

1 可选实验室: Python、 NumPy 和矢量化

简要介绍本课程中使用的一些科学计算。特别是 NumPy 科学计算包及其与 python 的使用。

2 目标

在这个实验室里将回顾课程中使用的 NumPy 和 Python 的特性。

Python 是本课程中使用的编程语言。NumPy 库扩展了 python 的基本功能,添加了更丰富的数据集,包括更多的数值类型、向量、矩阵和许多矩阵函数。NumPy 和 python 相当无缝地协同工作。Python 算术运算符处理 NumPy 数据类型,许多 NumPy 函数将接受 Python 数据类型。

NumPy 的基本数据结构是一个可索引的 n 维数组,其中包含相同类型(dtype)的元素。这里维度指的是数组的索引数。一维数组有一个索引。在课程1中,我们将向量表示为 NumPy 一维数组。一维数组,shape(n,) : 从[0]到[ n-1]索引的 n 个元素。

NumPy 中的数据创建例程通常有一个第一个参数,它是对象的形状。这可以是一维结果的单个值,也可以是指定结果形状的元组(n,m,...)。下面是使用这些例程创建向量的示例。

import numpy as np    # it is an unofficial standard to use np for numpy
import time
# NumPy routines which allocate memory and fill arrays with value
a = np.zeros(4);                print(f"np.zeros(4) :   a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.zeros((4,));             print(f"np.zeros(4,) :  a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.random.random_sample(4); print(f"np.random.random_sample(4): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")

输出为:

np.zeros(4) :   a = [0. 0. 0. 0.], a shape = (4,), a data type = float64
np.zeros(4,) :  a = [0. 0. 0. 0.], a shape = (4,), a data type = float64
np.random.random_sample(4): a = [0.40589302 0.63171453 0.69259702 0.54159911], a shape = (4,), a data type = float64

有些数据创建例程不采用元组形式:

# NumPy routines which allocate memory and fill arrays with value but do not accept shape as input argument
a = np.arange(4.);              print(f"np.arange(4.):     a = {a}, a shape = {a.shape}, a data type = {a.dtype}")
a = np.random.rand(4);          print(f"np.random.rand(4): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")

输出为:

np.arange(4.):     a = [0. 1. 2. 3.], a shape = (4,), a data type = float64
np.random.rand(4): a = [0.54170759 0.00065357 0.46959253 0.09870197], a shape = (4,), a data type = float64

值也可以手动指定:

# NumPy routines which allocate memory and fill with user specified values
a = np.array([5,4,3,2]);  print(f"np.array([5,4,3,2]):  a = {a},     a shape = {a.shape}, a data type = {a.dtype}")
a = np.array([5.,4,3,2]); print(f"np.array([5.,4,3,2]): a = {a}, a shape = {a.shape}, a data type = {a.dtype}")

输出为:

np.array([5,4,3,2]):  a = [5 4 3 2],     a shape = (4,), a data type = int32
np.array([5.,4,3,2]): a = [5. 4. 3. 2.], a shape = (4,), a data type = float64

这些都创建了一个有四个元素的一维向量 a。a.shape返回维度。在这里,我们看到a.shape= (4,)表示一个包含4个元素的一维数组。

3 向量操作

3.1 索引

向量的元素可以通过索引和切片来访问。NumPy 提供了一套非常完整的索引和切片功能。我们将在这里只探索课程所需的基础知识。有关更多详细信息,请参考切片和索引。

索引意味着通过数组中元素的位置来引用数组的元素。

切片意味着根据索引从数组中获取元素的子集。

NumPy 从零开始索引,因此向量 a 的第3个元素是一个[2]。

#vector indexing operations on 1-D vectors
a = np.arange(10)
print(a)

#access an element
print(f"a[2].shape: {a[2].shape} a[2]  = {a[2]}, Accessing an element returns a scalar")

# access the last element, negative indexes count from the end
print(f"a[-1] = {a[-1]}")

#indexs must be within the range of the vector or they will produce and error
try:
    c = a[10]
except Exception as e:
    print("The error message you'll see is:")
    print(e)

输出:

[0 1 2 3 4 5 6 7 8 9]
a[2].shape: () a[2]  = 2, Accessing an element returns a scalar
a[-1] = 9
The error message you'll see is:
index 10 is out of bounds for axis 0 with size 10

3.2 切片

切片使用一组三个值(start: stop: step)创建索引数组。值的子集也是有效的。它的用法可以用一个例子来解释:

#vector slicing operations
a = np.arange(10)
print(f"a         = {a}")

#access 5 consecutive elements (start:stop:step)
c = a[2:7:1];     print("a[2:7:1] = ", c)

# access 3 elements separated by two 
c = a[2:7:2];     print("a[2:7:2] = ", c)

# access all elements index 3 and above
c = a[3:];        print("a[3:]    = ", c)

# access all elements below index 3
c = a[:3];        print("a[:3]    = ", c)

# access all elements
c = a[:];         print("a[:]     = ", c)

输出:

a         = [0 1 2 3 4 5 6 7 8 9]
a[2:7:1] =  [2 3 4 5 6]
a[2:7:2] =  [2 4 6]
a[3:]    =  [3 4 5 6 7 8 9]
a[:3]    =  [0 1 2]
a[:]     =  [0 1 2 3 4 5 6 7 8 9]

3.3 单向量运算

有许多有用的运算涉及对单个向量的运算。

a = np.array([1,2,3,4])
print(f"a             : {a}")
# negate elements of a
b = -a 
print(f"b = -a        : {b}")

# sum all elements of a, returns a scalar
b = np.sum(a) 
print(f"b = np.sum(a) : {b}")

b = np.mean(a)
print(f"b = np.mean(a): {b}")

b = a**2
print(f"b = a**2      : {b}")

输出:

a             : [1 2 3 4]
b = -a        : [-1 -2 -3 -4]
b = np.sum(a) : 10
b = np.mean(a): 2.5
b = a**2      : [ 1  4  9 16]

3.4 向量与向量元素运算

大多数 NumPy 算法、逻辑和比较操作也适用于向量。这些操作符基于元素逐个元素地工作。

a = np.array([ 1, 2, 3, 4])
b = np.array([-1,-2, 3, 4])
print(f"Binary operators work element wise: {a + b}")

输出:

Binary operators work element wise: [0 0 6 8]

当然,为了使其正确工作,向量必须具有相同的大小:

#try a mismatched vector operation
c = np.array([1, 2])
try:
    d = a + c
except Exception as e:
    print("The error message you'll see is:")
    print(e)

输出:

The error message you'll see is:
operands could not be broadcast together with shapes (4,) (2,) 

3.5 标量向量运算

向量可以通过标量值“缩放”。标量值只是一个数字。标量乘以向量的所有元素。

a = np.array([1, 2, 3, 4])

# multiply a by a scalar
b = 5 * a 
print(f"b = 5 * a : {b}")

输出:

b = 5 * a : [ 5 10 15 20]

3.6 矢量向量点积

点积是线性代数和 NumPy 的支柱。这是一个在本课程中广泛使用的操作。点乘将两个向量中的值按元素方式相乘,然后对结果求和。向量点积要求两个向量的尺寸相同。注意,点乘应该返回一个标量值。

def my_dot(a, b): 
    """
   Compute the dot product of two vectors
 
    Args:
      a (ndarray (n,)):  input vector 
      b (ndarray (n,)):  input vector with same dimension as a
    
    Returns:
      x (scalar): 
    """
    x=0
    for i in range(a.shape[0]):
        x = x + a[i] * b[i]
    return x
# test 1-D
a = np.array([1, 2, 3, 4])
b = np.array([-1, 4, 3, 2])
print(f"my_dot(a, b) = {my_dot(a, b)}")

输出为:

my_dot(a, b) = 24
# test 1-D
a = np.array([1, 2, 3, 4])
b = np.array([-1, 4, 3, 2])
c = np.dot(a, b)
print(f"NumPy 1-D np.dot(a, b) = {c}, np.dot(a, b).shape = {c.shape} ") 
c = np.dot(b, a)
print(f"NumPy 1-D np.dot(b, a) = {c}, np.dot(a, b).shape = {c.shape} ")

输出为:

NumPy 1-D np.dot(a, b) = 24, np.dot(a, b).shape = () 
NumPy 1-D np.dot(b, a) = 24, np.dot(a, b).shape = () 

3.7 速度的需要: 矢量与循环

使用NumPy库是因为它提高了速度和内存效率。

np.random.seed(1)
a = np.random.rand(10000000)  # very large arrays
b = np.random.rand(10000000)

tic = time.time()  # capture start time
c = np.dot(a, b)
toc = time.time()  # capture end time

print(f"np.dot(a, b) =  {c:.4f}")
print(f"Vectorized version duration: {1000*(toc-tic):.4f} ms ")

tic = time.time()  # capture start time
c = my_dot(a,b)
toc = time.time()  # capture end time

print(f"my_dot(a, b) =  {c:.4f}")
print(f"loop version duration: {1000*(toc-tic):.4f} ms ")

del(a);del(b)  #remove these big arrays from memory

输出:

np.dot(a, b) =  2501072.5817
Vectorized version duration: 46.8779 ms 
my_dot(a, b) =  2501072.5817
loop version duration: 4033.1399 ms 

因此,矢量化在本例中提供了很大的速度提升。这是因为NumPy更好地利用了底层硬件中可用的数据并行性。GPU和现代CPU实现单指令多数据(SIMD)管道,允许并行发布多个操作。这在机器学习中至关重要,因为机器学习中的数据集通常非常大。

4 矩阵

矩阵,是二维数组。矩阵的元素都是相同的类型。在记谱法中,矩阵用大写字母表示,黑体字母如 X。在这个实验室和其他实验室中,m 通常是行数和列数。矩阵的元素可以用二维索引引用。在数学设置中,索引中的数字通常从1到 n。在计算机科学和这些实验室中,索引将从0运行到 n-1。通用矩阵表示法,第一个索引是行,第二个是列。

 

NumPy 的基本数据结构是一个可索引的 n 维数组,其中包含相同类型(dtype)的元素。这些是之前描述过的。矩阵有一个二维(2-D)索引[ m,n ]。下面你将回顾:

  • 数据创建
  • 切片和索引

4.1 矩阵创建

创建二维向量的函数和创建一维向量的函数一样。注意 NumPy 是如何使用方括号来表示每个维度的。更进一步的是,在打印时,每行将打印一行。

a = np.zeros((1, 5))                                       
print(f"a shape = {a.shape}, a = {a}")                     

a = np.zeros((2, 1))                                                                   
print(f"a shape = {a.shape}, a = {a}") 

a = np.random.random_sample((1, 1))  
print(f"a shape = {a.shape}, a = {a}") 

输出:

a shape = (1, 5), a = [[0. 0. 0. 0. 0.]]
a shape = (2, 1), a = [[0.]
 [0.]]
a shape = (1, 1), a = [[0.44236513]]

也可以手动指定数据。尺寸是用额外的括号指定的,与上面打印的格式相匹配。

# NumPy routines which allocate memory and fill with user specified values
a = np.array([[5], [4], [3]]);   print(f" a shape = {a.shape}, np.array: a = {a}")
a = np.array([[5],   # One can also
              [4],   # separate values
              [3]]); #into separate rows
print(f" a shape = {a.shape}, np.array: a = {a}")

输出:

 a shape = (3, 1), np.array: a = [[5]
 [4]
 [3]]
 a shape = (3, 1), np.array: a = [[5]
 [4]
 [3]]

4.2 矩阵操作

4.2.1 索引

矩阵索引描述[ row,column ]。可以返回元素或行/列。见下文:

#vector indexing operations on matrices
a = np.arange(6).reshape(-1, 2)   #reshape is a convenient way to create matrices
print(f"a.shape: {a.shape}, \na= {a}")

#access an element
print(f"\na[2,0].shape:   {a[2, 0].shape}, a[2,0] = {a[2, 0]},     type(a[2,0]) = {type(a[2, 0])} Accessing an element returns a scalar\n")

#access a row
print(f"a[2].shape:   {a[2].shape}, a[2]   = {a[2]}, type(a[2])   = {type(a[2])}")

输出:

a.shape: (3, 2), 
a= [[0 1]
 [2 3]
 [4 5]]

a[2,0].shape:   (), a[2,0] = 4,     type(a[2,0]) = <class 'numpy.int32'> Accessing an element returns a scalar

a[2].shape:   (2,), a[2]   = [4 5], type(a[2])   = <class 'numpy.ndarray'>

最后一个例子值得注意。通过指定行来访问矩阵将返回一个一维向量。

Reshape:使用重塑形状来设置数组的形状。

A = np.arange (6).reshape(- 1,2)

这行代码首先创建了一个包含6个元素的1-D Vector。然后,它使用重塑命令将该向量重塑为一个二维数组。可以这样写:

A = np.arange (6).reshape(3,2)

到达相同的3行,2列数组。-1参数告诉例程计算给定数组大小和列数的行数。

4.2.2 切片

切片使用一组三个值(start:stop:step)创建一个索引数组。

#vector 2-D slicing operations
a = np.arange(20).reshape(-1, 10)
print(f"a = \n{a}")

#access 5 consecutive elements (start:stop:step)
print("a[0, 2:7:1] = ", a[0, 2:7:1], ",  a[0, 2:7:1].shape =", a[0, 2:7:1].shape, "a 1-D array")

#access 5 consecutive elements (start:stop:step) in two rows
print("a[:, 2:7:1] = \n", a[:, 2:7:1], ",  a[:, 2:7:1].shape =", a[:, 2:7:1].shape, "a 2-D array")

# access all elements
print("a[:,:] = \n", a[:,:], ",  a[:,:].shape =", a[:,:].shape)

# access all elements in one row (very common usage)
print("a[1,:] = ", a[1,:], ",  a[1,:].shape =", a[1,:].shape, "a 1-D array")
# same as
print("a[1]   = ", a[1],   ",  a[1].shape   =", a[1].shape, "a 1-D array")

输出:

a = 
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]]
a[0, 2:7:1] =  [2 3 4 5 6] ,  a[0, 2:7:1].shape = (5,) a 1-D array
a[:, 2:7:1] = 
 [[ 2  3  4  5  6]
 [12 13 14 15 16]] ,  a[:, 2:7:1].shape = (2, 5) a 2-D array
a[:,:] = 
 [[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]] ,  a[:,:].shape = (2, 10)
a[1,:] =  [10 11 12 13 14 15 16 17 18 19] ,  a[1,:].shape = (10,) a 1-D array
a[1]   =  [10 11 12 13 14 15 16 17 18 19] ,  a[1].shape   = (10,) a 1-D array

在这个实验室中,我们掌握了 Python 和 NumPy 的特性,这些特性是课程所需要的。

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

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

相关文章

mac 如何批量修改图片名称

mac 如何批量修改图片名称&#xff1f;很多使用mac电脑的小伙伴一直有这样一个疑问&#xff0c;怎么在电脑上一次性的批量修改大量图片的名称&#xff0c;很多小伙伴在电脑上整理图片的时候都需要批量重命名&#xff0c;批量处理的功能可以让我们节省不少的时间和精力&#xff…

抖音seo怎么选择关键词

要查找抖音的关键词&#xff0c;以进行SEO优化&#xff0c;可以按照以下步骤进行&#xff1a; 1. 关键词分析与筛选&#xff1a; 首先&#xff0c;你需要确定你的目标受众和内容类型。了解你的目标用户是谁&#xff0c;他们可能会搜索什么样的内容。然后&#xff0c;使用关键…

虾皮一面:手写一个Strategy模式(策略模式)

说在前面 在40岁老架构师 尼恩的读者交流区(50)中&#xff0c;最近有指导一个小伙伴面试架构师&#xff0c;面试的公司包括虾皮、希音、美团等大厂&#xff0c;目标薪酬50K以上&#xff0c;遇到了一个比较初级的问题&#xff1a; 请手写一个Strategy模式&#xff08;策略模式…

基于物联网技术的养老院管理系统设计与实现_kai

基于物联网技术的养老院管理系统设计与 实现 摘 要 随着我国老年人口数量的逐年增加&#xff0c;人口抚养比也在迅速攀升&#xff0c;越来越多的老年人将走 出家门进入养老院安度自己的晚年。同时国家和地方也相继出台了加快发展老龄事业的政策 方针&#xff0c;作为机构养老…

Shell之循环语句 —— For 实验

循环 循环就是重复执行一段代码的结构&#xff0c;通过循环可在满足一定的条件下&#xff0c;多次执行相同的代码。 循环语句&#xff1a;循环体 —— 代码的总结构 循环条件 —— 当循环条件满足时&#xff0c;循环体代码才会被执行&#xff0c;否则条件不满足…

SpringCloud Alibaba——Nacos中的Distro协议

一、Nacos中的Distro协议 Nacos 每个节点自己负责部分的写请求。每个节点会把自己负责的新增数据同步给其他节点。每个节点定时发送自己负责数据的校验值到其他节点来保持数据一致性每个节点独立处理读请求&#xff0c;及时从本地发出响应。新加入的 Distro 节点会进行全量数据…

【高并发网络通信架构】3.引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

目录 一&#xff0c;往期文章 二&#xff0c;基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select&#xff0c;poll&#xff0c;epoll 三者对比 三&#xff0c;函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_cre…

前端uni-app自定义精美全端复制文本插件,支持全端文本复制插件 可设置复制按钮颜色

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

读数据压缩入门笔记07_自适应统计编码

1. 位置对熵的重要性 1.1. 为了计算概率总需要多遍历一次数据集&#xff0c;而在计算出整个数据集中各符号的出现概率后&#xff0c;还要继续处理这些数值 1.1.1. 如果是相对较小的数据集&#xff0c;那么这些就不是什么问题 1.2. 随着要压缩的数据集变大&#xff0c;统计编…

Python异常值检测——案例分析

目录 1.单个变量异常值检测 2. 双变量关系中的异常值检测 3. 使用线性回归来确定具有重大影响的数据点 4. 使用k最近邻算法找到离群值 5. 使用隔离森林算法查找异常 1.单个变量异常值检测 如果某个值离平均值有多个标准偏差&#xff0c;并且远离近似标准正态分布的值&#…

Office如何通过VSTO进行WORD插件开发?

文章目录 0.引言1.工具准备2.WORD外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO&#xff08;Visual Studio Tools for Office &#xff09;是VBA的替代&#xff0c;是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展…

在 3ds max 中创建逼真的镜像材质

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 选项 1.平面镜面材料 步骤 1 首先&#xff0c;我们需要包含镜像对象和一个或多个镜像对象的场景。您可以在此处下载本教程中使用的场景&#xff0c;也可以使用您自己的场景和对象。对于第一个镜像选项&…

Unreal Engine 与 Blender - 比较指南

虚幻引擎和 Blender 是游戏开发人员中最常用的两种软件&#xff0c;它们在游戏开发工作流程中都有自己的用途和地位。作为进入视频游戏行业的初学者&#xff0c;可能很难从数十种软件中筛选找到最适合您需求的一款。希望本指南能够缓解这一困难并帮助您决定选择哪个软件。 虚幻…

【c++源码】瑞佳飞飞彩虹端分享老飞飞源码

里面功能包含。离线摆摊&#xff0c;内挂&#xff0c;宠物系统&#xff0c;宠物进阶&#xff0c;任意商店&#xff0c;回收装备&#xff0c;模型查看&#xff0c;个人排行榜&#xff0c;物品分解&#xff0c;全物品升级&#xff0c;钥匙开箱子&#xff0c;外观变更&#xff0c;…

电商数据采集方式有哪些

不管是做渠道管控、还是价格监测&#xff0c;数据采集都是基础&#xff0c;只有数据准确了&#xff0c;品牌才能更好的管控乱价、治理渠道。同时当品牌有数据分析需求时&#xff0c;对数据采集的要求也会越高。 力维网络有自主开发的数据采集监测系统&#xff0c;可为品牌提供多…

SpringCloud整合Sentinel

文章目录 1、Sentinel介绍2、安装Sentinel控制台3、微服务整合Sentinel 1、Sentinel介绍 阿里开源的流量控制组件官网&#xff1a;https://sentinelguard.io/zh-cn/index.html承接了阿里双十一大促流量的核心场景&#xff0c;如秒杀、消息削峰填谷、集群流量控制、实时熔断下游…

关于Java的网络编程

网络的一些了解 网络通信协议 链路层&#xff1a;链路层是用于定义物理传输通道&#xff0c;通常是对某些网络连接设备的驱动协议&#xff0c;例如针对光纤、网线提供的驱动。网络层&#xff1a;网络层是整个TCP/IP协议的核心&#xff0c;它主要用于将传输的数据进行分组&…

【EXCEL】数据录入的快捷键和正确格式

目录 0.环境 1.内容概述 2.具体内容 2.1数据录入换行换列的快捷键&#xff08;标准的数据输入方式&#xff09; 2.2日期的正确格式和使用&#xff08;标准日期格式与长日期&#xff09; 2.2.1 标准日期 2.2.2 长日期 2.2.3 显示当前日期和时间的快捷键 2.3百分比的正确…

华为Mate60 Pro曝光:麒麟芯片9100 or 骁龙8Gen2+5G,7699元起,你觉得如何?

最近网上关于华为Mate60系列的爆料逐渐增多&#xff0c;尤其是对于新机到底支不支持5G&#xff0c;众说纷纭&#xff0c;而且老是变动。7月14日&#xff0c;有数码博主爆料称&#xff0c;华为Mate60系列确实分前期和后期版本&#xff0c;前期为了秀肌肉&#xff0c;会展示新的成…

更改el-select-dropdown_item selected选中颜色

更改el-select-dropdown_item selected选中颜色 默认为element主题色 在修改element select下拉框选中颜色时会发现不生效&#xff0c;原因是&#xff1a;el-select下拉框插入到了body中 解决办法&#xff1a; 在select标签里填写:popper-append-to-body"false"属性…