Files
Iris Series: Visualize Math -- From Arithmetic Basics to Machine Learning 79be5dda7d Add files via upload
2025-02-01 17:06:45 +08:00

363 lines
8.5 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"id": "73bd968b-d970-4a05-94ef-4e7abf990827",
"metadata": {},
"source": [
"Chapter 04\n",
"\n",
"# 广播机制\n",
"Book_4《矩阵力量》 | 鸢尾花书:从加减乘除到机器学习 (第二版)"
]
},
{
"cell_type": "markdown",
"id": "61a42cc1-9923-4983-973d-b03b59d6acc1",
"metadata": {},
"source": [
"这段代码展示了 NumPy 的广播机制,通过定义矩阵、标量、列向量和行向量进行一系列加法操作。代码首先定义了一个 $3 \\times 2$ 的矩阵 $A$、一个标量 $k$、一个列向量 $c$ 和一个行向量 $r$。它们的具体定义如下:\n",
"\n",
"$$\n",
"A = \\begin{bmatrix} 1 & 2 \\\\ 3 & 4 \\\\ 5 & 6 \\end{bmatrix}, \\quad k = 2, \\quad c = \\begin{bmatrix} 3 \\\\ 2 \\\\ 1 \\end{bmatrix}, \\quad r = \\begin{bmatrix} 2 & 1 \\end{bmatrix}\n",
"$$\n",
"\n",
"代码使用 NumPy 广播机制,分别计算以下几种加法操作:\n",
"\n",
"1. **矩阵 $A$ 与标量 $k$ 相加**:标量 $k$ 会广播到矩阵 $A$ 的每个元素,即每个元素都加上 $k$ 值。这种情况下,运算结果为:\n",
"\n",
" $$\n",
" A + k = \\begin{bmatrix} 1+2 & 2+2 \\\\ 3+2 & 4+2 \\\\ 5+2 & 6+2 \\end{bmatrix} = \\begin{bmatrix} 3 & 4 \\\\ 5 & 6 \\\\ 7 & 8 \\end{bmatrix}\n",
" $$\n",
"\n",
"2. **矩阵 $A$ 与列向量 $c$ 相加**:列向量 $c$ 被广播到矩阵 $A$ 的每一列,使得 $c$ 的每个元素与 $A$ 相同行的每个元素相加,得到:\n",
"\n",
" $$\n",
" A + c = \\begin{bmatrix} 1+3 & 2+3 \\\\ 3+2 & 4+2 \\\\ 5+1 & 6+1 \\end{bmatrix} = \\begin{bmatrix} 4 & 5 \\\\ 5 & 6 \\\\ 6 & 7 \\end{bmatrix}\n",
" $$\n",
"\n",
"3. **矩阵 $A$ 与行向量 $r$ 相加**:行向量 $r$ 被广播到矩阵 $A$ 的每一行,使得 $r$ 的每个元素与 $A$ 相同行的每个元素相加,结果为:\n",
"\n",
" $$\n",
" A + r = \\begin{bmatrix} 1+2 & 2+1 \\\\ 3+2 & 4+1 \\\\ 5+2 & 6+1 \\end{bmatrix} = \\begin{bmatrix} 3 & 3 \\\\ 5 & 5 \\\\ 7 & 7 \\end{bmatrix}\n",
" $$\n",
"\n",
"4. **列向量 $c$ 与行向量 $r$ 相加**:通过广播,$c$ 和 $r$ 组合成一个 $3 \\times 2$ 的矩阵。每个 $c$ 的元素加到每一行的 $r$ 上,得到:\n",
"\n",
" $$\n",
" c + r = \\begin{bmatrix} 3+2 & 3+1 \\\\ 2+2 & 2+1 \\\\ 1+2 & 1+1 \\end{bmatrix} = \\begin{bmatrix} 5 & 4 \\\\ 4 & 3 \\\\ 3 & 2 \\end{bmatrix}\n",
" $$\n",
"\n",
"该代码展示了 NumPy 广播机制的灵活性,使得矩阵、向量和标量间的加法运算在不同维度下可以直接进行。"
]
},
{
"cell_type": "markdown",
"id": "dbbb9e8f-480a-4b84-be1c-10299faa79c3",
"metadata": {},
"source": [
"## 导入所需库"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "2da2788b-62a1-4402-bcc8-7c4448392cb3",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np # 导入NumPy库用于数值计算"
]
},
{
"cell_type": "markdown",
"id": "371997be-719d-416d-9e23-6c0c9ae9bc96",
"metadata": {},
"source": [
"## 定义矩阵"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7acefee2-ddb0-4ec5-924e-b15c468f3bda",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"matrix([[1, 2],\n",
" [3, 4],\n",
" [5, 6]])"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = np.matrix([[1, 2], # 定义矩阵A\n",
" [3, 4],\n",
" [5, 6]])\n",
"A"
]
},
{
"cell_type": "markdown",
"id": "6a695575-9a76-41e6-bb17-6d77d1dbca49",
"metadata": {},
"source": [
"## 定义标量"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7b44157d-b5c4-450c-b5a9-8c17ec1fb9fc",
"metadata": {},
"outputs": [],
"source": [
"k = 2 # 定义标量k"
]
},
{
"cell_type": "markdown",
"id": "950972dd-22ff-4a81-9793-2172ba4cc752",
"metadata": {},
"source": [
"## 定义列向量"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "f59ea6bd-d607-48cf-8a7f-80eb5aac438c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[3],\n",
" [2],\n",
" [1]])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c = np.array([[3], # 定义列向量c\n",
" [2],\n",
" [1]])\n",
"c"
]
},
{
"cell_type": "markdown",
"id": "1a4a65e0-ce82-414a-990b-64713bca3913",
"metadata": {},
"source": [
"## 定义行向量"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "c571bb39-d6b7-44ea-b5d7-2b197223eb5f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[2, 1]])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r = np.array([[2, 1]]) # 定义行向量r\n",
"r"
]
},
{
"cell_type": "markdown",
"id": "7a7d2094-3824-4efa-a099-40781551d1ff",
"metadata": {},
"source": [
"## 广播原则"
]
},
{
"cell_type": "markdown",
"id": "82e777a0-142f-4a7d-b3e1-2e38af1fe399",
"metadata": {},
"source": [
"## 矩阵A加标量k"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "c7c158d0-9576-471c-953f-8767f19d9473",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"matrix([[3, 4],\n",
" [5, 6],\n",
" [7, 8]])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A_plus_k = A + k # 矩阵A与标量k相加\n",
"A_plus_k"
]
},
{
"cell_type": "markdown",
"id": "07c8aa0c-d857-4267-a1b7-99c7fc856f6d",
"metadata": {},
"source": [
"## 矩阵A加列向量c"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "919ef4b1-d43d-4c1e-933c-f9c8fde768f1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"matrix([[4, 5],\n",
" [5, 6],\n",
" [6, 7]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A_plus_c = A + c # 矩阵A与列向量c相加\n",
"A_plus_c"
]
},
{
"cell_type": "markdown",
"id": "07bd091a-0642-400a-8fd2-57ea4588875a",
"metadata": {},
"source": [
"## 矩阵A加行向量r"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "3a18f414-460e-452e-808e-47fd9d339345",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"matrix([[3, 3],\n",
" [5, 5],\n",
" [7, 7]])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A_plus_r = A + r # 矩阵A与行向量r相加\n",
"A_plus_r"
]
},
{
"cell_type": "markdown",
"id": "5fd72975-156a-46c3-abce-170467f5d416",
"metadata": {},
"source": [
"## 列向量c加行向量r"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e5ad12d3-b203-4a4e-90c4-20b693dfa4a2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[5, 4],\n",
" [4, 3],\n",
" [3, 2]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c_plus_r = c + r # 列向量c与行向量r相加\n",
"c_plus_r"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}