程序员的数学【线性代数高级】(二)

简介: 本文其实值属于:程序员的数学【AIoT阶段二】 的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 线性代数高级

二、特征值分解

2.1 特征值分解定义与操作

🚩特征值分解,就是将矩阵A分解为如下式:

image.png

import numpy as np
A = np.array([[7, 8, 4, 3],
              [2, 9, 6, 8],
              [1, 6, 9, 6],
              [7, 9, 7, 3]])
# w(Σ)表示特征值,v(Q)表示特征向量
w, v = np.linalg.eig(A)
print('矩阵A的特征值和特征向量:')
display(w, v)
# 根据特征值分解公式可得
print('特征值和特征向量运算反推矩阵A:')
display(v.dot(np.diag(w)).dot(np.linalg.inv(v)))

image.png

image.png

# 实对称矩阵
import numpy as np
B = np.array([[1, 2, 3],
              [2, 5, 8],
              [3, 8, 9]])
# w(Σ)表示特征值,v(Q)表示特征向量
w,v = np.linalg.eig(B)
print('矩阵A的特征值和特征向量:')
display(w, v)
print('特征值和特征向量运算反推矩阵A:')
display(v.dot(np.diag(w)).dot(np.linalg.inv(v)))
display(v.dot(np.diag(w)).dot(v.T))
print('Q是正交矩阵:')
display(np.linalg.inv(v), v.T)

6.png

2.2 特征值分解意义

🚩一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。


当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前 N 大特征向量,那么就对应了这个矩阵最主要的 N 个变化方向。我们利用这前 N 个变化方向,就可以近似表达这个矩阵(变换)。也就是说的:提取这个矩阵最重要的特征。


总结一下,特征值分解可以得到特征值与特征向量,特征值大小表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。


不过,特征值分解也有很多的限制,比如说变换的矩阵必须是方阵


三、矩阵和向量求导公式

3.1 常见矩阵求导公式

🚩有六种矩阵求导公式如下:

image.png

3.2 向量求导公式

image.png

3.3 矩阵求导公式

image.png

转置公式如下:

image.png

四、奇异值分解(SVD)

4.1 什么是奇异值分解

🚩特征值分解是一个提取矩阵特征很不错的方法,但是它只适用于方阵。而在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有 m 个学生,每个学生有 n 科成绩,这样形成的一个 m ∗ n  的矩阵就可能不是方阵,我们怎样才能像描述特征值一样描述这样一般矩阵呢的重要特征呢?奇异值分解就是用来干这个事的,奇异值分解是一个能适用于任意的矩阵的一种分解的方法。

image.png

image.png

4.2 奇异值与特征值关系

🚩特征值分解:

image.png

奇异值分解:

image.png

那么奇异值和特征值是怎么对应起来的呢?首先,我们将矩阵 A 的转置 和 A做矩阵乘法,将会得到一个方阵,我们用这个方阵求特征值可以得到:

image.png

对 AAT以及ATA做特征值分解,即可得到奇异值分解的结果。但是样分开求存在一定的问题,由于做特征值分解的时候,特征向量的正负号并不影响结果,比如:

image.png

解决方案:

image.png

五、求解奇异值分解

5.1 方式一

🚩根据上面对应公式,进行奇异值分解:

import numpy as np
A = np.array([[ 3,  4,  5,  5],
              [ 7,  5,  3,  6],
              [ 6,  5,  7,  7],
              [ 4,  9,  8,  9],
              [ 5, 10,  5,  7]])
# 左奇异矩阵
sigma,U = np.linalg.eig(A.dot(A.T))
# 降序排列后,逆序输出
index = np.argsort(sigma)[::-1]
# 将特征值对应的特征向量也对应排好序
sigma = sigma[index]
U = U[:, index]
print('左奇异矩阵如下:')
display(U)
# 计算奇异值矩阵
sigma = np.sqrt([s if s > 0 else 0 for s in sigma])
print('奇异值为:')
display(sigma[:4])
# 计算右奇异矩阵
# 奇异值矩阵特殊,斜对角线有值,其余都是0
# 奇异值矩阵的逆矩阵
sigma_inv = np.diag([1 / s if s > 0 else 0 for s in sigma])
V = sigma_inv.dot((U.T).dot(A))
print('右奇异矩阵如下:')
display(V[:4])
print('使用奇异值分解还原矩阵A:')
U.dot(np.diag(sigma)).dot(V).round(0)

7.png

5.2 方式二

🚩根据,NumPy提供的方法,进行奇异值求解

import numpy as np
A = np.array([[ 3,  4,  5,  5],
              [ 7,  5,  3,  6],
              [ 6,  5,  7,  7],
              [ 4,  9,  8,  9],
              [ 5, 10,  5,  7]])
u, s, v =np.linalg.svd(A) # 奇异值分解
display(u, s, v)

image.png

六、奇异值分解性质

image.png

image.png

右边的三个矩阵相乘的结果将会是一个接近于 A  的矩阵,在这儿,r 越接近于 n ,则相乘的结果越接近于 A 。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵 A ,我们如果想要压缩空间来表示原矩阵 A ,我们存下这里的三个矩阵:U 、Σ 、V 就好了。


说句大白话,称作「奇异值」可能无法顾名思义迅速理解其本质,那咱们换个说法,称作「主特征值」,你可能就迅速了然了。


对于非奇异(满秩)矩阵,对应着特征值;对于奇异矩阵,就需要进行奇异值分解,对应着奇异值。对于奇异矩阵,将A与其转置相乘ATA将会得到一个方阵,再求特征值。值得注意的是,对于非奇异矩阵进行奇异值分解(S V D ),得到的奇异值,其实就是特征值。

import numpy as np
A = np.array([[ 3,  4,  5,  5],
              [ 7,  5,  3,  6],
              [ 6,  5,  7,  7],
              [ 4,  9,  8,  9],
              [ 5, 10,  5,  7]])
u, s, v =np.linalg.svd(A)
m, n = A.shape
Σ = np.concatenate([np.diag(s), np.full(shape = (m - n,n), fill_value = 0)])
print('通过奇异值分解还原原数据:')
display(u.dot(Σ).dot(v))
# 抽取一部分奇异值,近似表示
print('用前r大的奇异值来近似描述矩阵:')
r = 2
display(u[:, :r].dot(Σ[:r, :r]).dot(v[:r]).round(1))

8.png









目录
相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
归一化技术比较研究:Batch Norm, Layer Norm, Group Norm
本文将使用合成数据集对三种归一化技术进行比较,并在每种配置下分别训练模型。记录训练损失,并比较模型的性能。
1506 2
|
2月前
|
算法 编译器 C语言
【2026最新】MinGW64官网下载安装保姆级教程(附安装包+图文并茂)
MinGW-w64 是 Windows 下的轻量级 GNU 编译器集合,支持 C/C++ 编译,无需虚拟机即可生成独立 exe 文件。它体积小、免安装、静态链接运行库,兼容 Win10/11 与旧系统,配置简单,广泛用于算法开发、刷题及教学场景。
2684 4
|
IDE 数据可视化 Java
5款经典代码阅读器的使用方案对比
代码阅读是技术人的必备技能之一,高效地梳理代码能够极大程度上提高开发人员的工作效率,进一步为业务创造新价值。
14346 0
5款经典代码阅读器的使用方案对比
|
2月前
|
数据采集 自然语言处理 数据可视化
微调完怎么判断好不好?大模型效果评估入门指南(附代码)
本文详解大模型微调后如何科学评估效果,涵盖文本分类、生成与语言建模三类任务的核心指标(如F1、BLEU、ROUGE、PPL),结合Python代码实操演示,并强调需结合业务场景、微调前后对比及稳定性验证,避免“指标虚高”。附实用工具推荐,助力新手高效完成评估闭环。
微调完怎么判断好不好?大模型效果评估入门指南(附代码)
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
782 2
|
1月前
|
数据采集 人工智能 监控
大模型微调完全指南:从“通用学霸”到“领域专家”的进化之路
本文是大模型微调的实战指南,详解P-Tuning、LoRA与QLoRA三大轻量化方法原理及应用,覆盖目标定义、数据准备、环境搭建、参数调优、效果评估到部署上线全流程,助你将通用大模型高效定制为懂业务、说行话、可落地的领域专家。(239字)
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型应用:概率驱动:大模型文字预测的核心机制与理论基础.5
本文深入浅出地解析大模型文字预测原理:将文本编码为向量,通过Transformer自注意力机制建模上下文,输出下一字/词的概率分布;详述预训练(海量文本填空学习)与微调过程,并以PyTorch代码实例展示字符级RNN/Transformer预测全流程。
175 7
|
2月前
|
物联网 开发者 异构计算
从入门到精通:大模型微调实战全攻略
本文系统讲解大模型微调实战:涵盖环境搭建、数据准备、主流方法(LoRA/QLoRA)、完整训练流程及过拟合、显存不足等常见问题解决方案,并分享数据质量、混合精度、评估体系等进阶技巧,助力开发者快速定制专属大模型。
从入门到精通:大模型微调实战全攻略
|
2月前
|
数据采集 人工智能 自然语言处理
一文读懂LLM微调:新手必知的原理、误区与场景化应用方案
本文深入浅出讲解LLM微调原理与实操,涵盖新手必知的核心概念、常见误区及场景化应用方案。通过类比“学霸特训”,解析微调与提示词区别,推荐轻量级LoRA方法,提供从数据准备、环境搭建到模型训练、效果评估的完整步骤,并附实用工具与避坑指南,助力AI初学者快速掌握定制化模型技能,实现个人或企业级AI应用落地。
|
Ubuntu 机器人 开发工具
具身智能干货|ROS2理论与实践系列(一):ROS2概述与环境搭建
《ROS2理论与实践》系列课程主要由基础篇、核心篇、应用篇、进阶篇以及项目库五部分组成。本阶段为《ROS2理论与实践——核心篇》课程,核心篇课程设计以官方内容为标准,主要介绍ROS2中的通信机制与开发者工具,其中前者是整个ROS2框架中的核心构成,而后者则为开发者能够高效的构建应用程序提供有力支持。本阶段课程目的是帮助大家快速上手ROS2,为后续进阶奠定基础。
1826 12
具身智能干货|ROS2理论与实践系列(一):ROS2概述与环境搭建