mirror of
https://github.com/Visualize-ML/Book4_Power-of-Matrix.git
synced 2026-02-02 18:21:08 +08:00
243 lines
6.0 KiB
Plaintext
243 lines
6.0 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "73bd968b-d970-4a05-94ef-4e7abf990827",
|
||
"metadata": {},
|
||
"source": [
|
||
"Chapter 14\n",
|
||
"\n",
|
||
"# 矩阵平方根\n",
|
||
"Book_4《矩阵力量》 | 鸢尾花书:从加减乘除到机器学习 (第二版)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c263fc95-881a-49fb-9c6c-a25508996623",
|
||
"metadata": {},
|
||
"source": [
|
||
"该代码的主要任务是通过矩阵分解和重构方法,基于给定的矩阵$A$,验证矩阵重构的正确性。具体流程如下:\n",
|
||
"\n",
|
||
"1. **定义矩阵$A$**: \n",
|
||
" 代码首先创建了一个$2 \\times 2$矩阵 $A = \\begin{bmatrix} 1.25 & -0.75 \\\\ -0.75 & 1.25 \\end{bmatrix}$。矩阵 $A$ 是一个对称矩阵,因此可以进行特征值分解。\n",
|
||
"\n",
|
||
"2. **计算特征值和特征向量**: \n",
|
||
" 代码使用 `np.linalg.eig` 函数对矩阵 $A$ 进行特征值分解,计算出$A$的特征值(存储在 $LAMBDA$ 中)和特征向量(存储在 $V$ 中),满足以下分解公式:\n",
|
||
" $$\n",
|
||
" A = V \\Lambda V^{-1}\n",
|
||
" $$\n",
|
||
" 其中,$\\Lambda$ 是一个包含特征值的对角矩阵,$V$ 是由特征向量组成的矩阵。\n",
|
||
"\n",
|
||
"3. **构建矩阵$B$**: \n",
|
||
" 接下来,代码构建了一个新的矩阵 $B$。它的计算公式为:\n",
|
||
" $$\n",
|
||
" B = V \\sqrt{\\Lambda} V^{-1}\n",
|
||
" $$\n",
|
||
" 其中,$\\sqrt{\\Lambda}$ 是对角矩阵,其对角元素是 $\\Lambda$ 的平方根。也就是说,$B$ 是通过将 $A$ 的特征值取平方根后重新组合得到的矩阵。\n",
|
||
"\n",
|
||
"4. **重构矩阵$A$并验证结果**: \n",
|
||
" 最后,通过矩阵 $B$ 构造了一个新矩阵 $A_{reproduced}$,其计算公式为:\n",
|
||
" $$\n",
|
||
" A_{reproduced} = B B^T\n",
|
||
" $$\n",
|
||
" 这是利用矩阵 $B$ 重构 $A$ 的过程。对称矩阵 $A$ 的特征值平方根分解使得 $B B^T$ 应等于原始矩阵 $A$。因此,通过打印 $A_{reproduced}$,可以验证 $B B^T$ 是否等于 $A$,从而确认重构的正确性。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "2759881c-9e2a-4e4d-a79c-1617f2a4be4f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np # 导入NumPy库"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "a685835a-bcda-40f8-ac57-ff3738c0209f",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 初始化矩阵A"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "a6e9a15c-1d77-4a95-a13c-1c825598e8be",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"A = np.matrix([[1.25, -0.75], # 定义矩阵A\n",
|
||
" [-0.75, 1.25]]) # 矩阵的元素"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "55297e89-757e-4136-a0af-4763d1db3e56",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 计算特征值和特征向量"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "998fa920-5e90-408f-8b70-dd3633c870e9",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"LAMBDA, V = np.linalg.eig(A) # 计算矩阵A的特征值(LAMBDA)和特征向量(V)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "ce8e4f8c-19a0-4392-b1ef-e794dcc5f187",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([2. , 0.5])"
|
||
]
|
||
},
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LAMBDA"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "13196da8-54c0-44bb-ac29-6cf7c6fec408",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"matrix([[ 0.70710678, 0.70710678],\n",
|
||
" [-0.70710678, 0.70710678]])"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"V"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c6bb1a72-57de-4ae9-a2e2-599db3122538",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 构建矩阵B"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "cb92d4fe-8443-473f-a61c-378630468024",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"B = V @ np.diag(np.sqrt(LAMBDA)) @ np.linalg.inv(V) # 根据特征值和特征向量构建矩阵B"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"id": "da0f2576-d262-41cd-8324-208cf3df1c82",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"matrix([[ 1.06066017, -0.35355339],\n",
|
||
" [-0.35355339, 1.06066017]])"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"B"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "d70a4893-0524-47aa-91ad-4ad9863a5c89",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 重构矩阵A并打印"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"id": "d07c6472-787a-44c2-9d20-99e4d070826a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[[ 1.25 -0.75]\n",
|
||
" [-0.75 1.25]]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"A_reproduced = B @ B.T # 通过矩阵B的转置乘积重构矩阵A\n",
|
||
"print(A_reproduced) # 输出重构后的矩阵A"
|
||
]
|
||
},
|
||
{
|
||
"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
|
||
}
|