Victor的魔鬼训练进入第二周。从特征值的”主轴”直觉到矩阵分解三剑客,从推荐系统的矩阵魔法到投资组合的数学优化,这不仅是技术的深入,更是理论与实战的完美融合。当Carol亲手实现SVD压缩,当Bob用PCA提取因子,SigmaX的团队终于开始理解:为什么数学是量化的灵魂。
本期关键词:特征值、特征向量、SVD奇异值分解、PCA主成分分析、LU/QR分解、推荐系统、投资组合优化、数值稳定性
🎯寻找变换的”主轴”
周一下午,Victor准时出现在培训室。
他环顾四周,发现每个人的眼神都比上周更加专注。一周的高强度训练,已经让这群”代码猴子”开始有了一些数学觉悟。
“上周我们学了矩阵是变换机器。今天,我要教你们找到变换的灵魂。”
Victor在白板上画了一个椭圆:
“这个椭圆是由单位圆经过某个矩阵变换得到的。问题是:这个变换最重要的方向是什么?”
Alice举手:“长轴和短轴的方向?”
Victor难得露出赞许的表情:
“对!长轴和短轴就是这个变换的特征方向。沿着这些方向,向量只会被拉伸或压缩,不会被旋转!”
他在白板上写下核心定义:
特征值与特征向量:
给定矩阵A,如果存在非零向量v和标量λ,使得: Av = λv
则v是A的特征向量,λ是对应的特征值。
几何意义:
-
特征向量v:变换后方向不变的向量
-
特征值λ:沿该方向的拉伸倍数
Bob皱眉:“等等,Av应该是矩阵乘向量,结果是另一个向量。怎么会等于λv这种标量乘向量?”
“这正是特征向量的特殊之处!”
Victor用力在白板上画:
“大多数向量经过矩阵变换后,方向会改变。但特征向量是那些只被拉伸不被旋转的特殊向量。找到它们,你就找到了变换的本质!”
Carol问:“那怎么计算特征值和特征向量?”
Victor写下推导:
Av = λv
Av - λv = 0
(A - λI)v = 0
这是一个齐次方程组。
要有非零解v,必须:det(A - λI) = 0
这叫做特征方程。解出λ,再代回去解v。他用一个具体例子演示:
A = [3 1]
[0 2]
特征方程:
det([3-λ 1 ]) = 0
([0 2-λ])
(3-λ)(2-λ) - 0 = 0
λ₁ = 3, λ₂ = 2
对于λ₁=3:
(A - 3I)v = [0 1][v₁] = [0]
[0 -1][v₂] [0]
解得:v₁ = (1, 0)
对于λ₂=2:
(A - 2I)v = [1 1][v₁] = [0]
[0 0][v₂] [0]
解得:v₂ = (1, -1)(归一化后)Eric问:“这在量化中有什么用?”
Victor推了推眼镜,声音变得严肃:
“用处大了。还记得上周那个让你们亏1000万的协方差矩阵吗?协方差矩阵的特征值和特征向量告诉你:投资组合风险的主要来源是什么!”
他在白板上快速写:
# 协方差矩阵的特征分解
cov_matrix = np.cov(returns.T)
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# 特征值 = 各主成分的方差
# 特征向量 = 主成分的方向(即主要风险因子)
# 最大特征值对应的特征向量 = 主要风险方向
# 如果最大特征值占总方差的90%,说明风险高度集中!Alice恍然大悟:“所以如果协方差矩阵的最大特征值特别大,说明所有资产都暴露在同一个风险因子上?”
“孺子可教。”Victor难得夸奖,“这就是为什么2008年金融危机时,所有资产同时崩溃。它们看似分散,但都暴露在同一个系统性风险上。特征分解能提前发现这个隐患。”
🔬PageRank:特征向量的商业奇迹
第二天,Victor一进门就在白板上写了一个名字:
Google PageRank“你们知道Google怎么给网页排名的吗?”
Bob举手:“根据链接数量?链接越多的网页越重要?”
“太天真了。”Victor冷笑,“如果只看链接数量,任何人都可以创建一万个垃圾网页互相链接,刷上排名。Google的天才之处在于:不仅看链接数量,还看链接的质量。”
他在白板上画了一个网页链接图:
“假设有四个网页ABCD。A被B和C链接,B被D链接,C被A链接,D被B和C链接。问题是:哪个网页最重要?”
Victor写下PageRank的核心思想:
PageRank核心思想:
1. 一个网页的重要性 = 所有链接到它的网页的重要性之和
2. 如果一个重要网页链接到你,你也变得重要
3. 重要性会"传递"
数学表达:
PR(A) = Σ PR(i)/L(i) (对所有链接到A的网页i求和)
L(i) = 网页i的出链数量“这个方程有个问题:PR(A)的计算需要PR(B)和PR(C),而PR(B)的计算又需要PR(D),PR(D)的计算需要PR(B)和PR(C)…这是个循环依赖!”
Carol问:“那怎么解?”
Victor露出得意的笑容:
“把它写成矩阵形式!”
定义转移矩阵M:
M[i][j] = 1/L(j) 如果j链接到i
M[i][j] = 0 否则
则:
PR = M × PR
这不就是:Mv = v,即 Mv = 1·v
PageRank向量就是转移矩阵M的特征值为1的特征向量!全场惊叹。
Victor继续说:
“Google每天要对数十亿网页计算PageRank。他们使用的是幂迭代法:从任意初始向量开始,不断乘以M,最终会收敛到主特征向量。”
# 幂迭代法计算PageRank
def pagerank(M, iterations=100):
n = M.shape[0]
pr = np.ones(n) / n # 初始:均匀分布
for _ in range(iterations):
pr = M @ pr # 矩阵乘法
pr = pr / np.sum(pr) # 归一化
return prAlice问:“为什么幂迭代一定会收敛到主特征向量?”
“好问题!”Victor在白板上快速推导:
设A的特征值为λ₁ ≥ λ₂ ≥ ... ≥ λₙ
对应特征向量为v₁, v₂, ..., vₙ
任意初始向量x₀可以分解为:
x₀ = c₁v₁ + c₂v₂ + ... + cₙvₙ
经过k次迭代:
Aᵏx₀ = c₁λ₁ᵏv₁ + c₂λ₂ᵏv₂ + ... + cₙλₙᵏvₙ
= λ₁ᵏ(c₁v₁ + c₂(λ₂/λ₁)ᵏv₂ + ...)
当k→∞,如果|λ₁| > |λ₂|,则(λ₂/λ₁)ᵏ → 0
结果趋近于c₁λ₁ᵏv₁,即主特征向量的方向!“这就是幂法的数学原理。Google每天就是在做这个计算,只不过矩阵规模是数十亿×数十亿。”
🗡矩阵分解三剑客
周三,Victor宣布进入本周的重头戏:
“今天开始,我们学习矩阵分解。这是线性代数最强大的工具,也是机器学习和量化金融的核心技术。”
他在白板上写下三个名字:
矩阵分解三剑客:
1. SVD(奇异值分解):万能分解,任意矩阵都可用
2. PCA(主成分分析):数据降维的标准工具
3. LU/QR分解:数值计算的效率担当SVD:万能的分解器
“SVD是线性代数的瑞士军刀。任何矩阵,不管是方阵还是长方形,不管是满秩还是降秩,都可以做SVD分解。”
Victor写下SVD的定义:
对于任意 m×n 矩阵 A:
A = UΣVᵀ
其中:
- U:m×m 正交矩阵(左奇异向量)
- Σ:m×n 对角矩阵(奇异值,从大到小排列)
- V:n×n 正交矩阵(右奇异向量)
几何意义:
任何线性变换 = 旋转 × 拉伸 × 旋转
= V旋转 × Σ拉伸 × U旋转Bob问:“SVD和特征分解有什么区别?”
“好问题。特征分解只能用于方阵,而且必须是可对角化的。SVD适用于任意矩阵,这才是它强大的地方。”
Victor展示了SVD的一个经典应用——图像压缩:
# SVD图像压缩
from PIL import Image
import numpy as np
# 读取灰度图像
img = np.array(Image.open('photo.jpg').convert('L'))
# SVD分解
U, S, Vt = np.linalg.svd(img, full_matrices=False)
# 只保留前k个奇异值
k = 50
compressed = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
# 压缩比 = k(m+n+1) / (m×n)
# 对于1000×1000的图像,k=50时压缩比约为10%“奇异值从大到小排列,前面几个奇异值包含了图像的主要信息,后面的只是噪声和细节。保留前k个奇异值,就能用很少的数据重建图像!”
Alice问:“在量化中,SVD怎么用?”
Victor露出神秘的笑容:
“推荐系统。Netflix用SVD来预测用户对电影的评分。用户-电影评分矩阵做SVD分解,低秩近似就能填补缺失的评分,这就是协同过滤的核心!”
PCA:降维的艺术
“PCA和SVD关系密切,但目的不同。SVD是分解矩阵,PCA是降维。”
Victor在白板上画了一个点云:
“给定一堆高维数据点,PCA找到方差最大的方向作为第一主成分,然后找垂直于它且方差第二大的方向作为第二主成分…以此类推。”
PCA的步骤:
1. 数据中心化(减去均值)
2. 计算协方差矩阵
3. 对协方差矩阵做特征分解
4. 按特征值大小排序特征向量
5. 选取前k个特征向量作为主成分
6. 将数据投影到主成分上
数学上:PCA就是对中心化数据矩阵做SVD!Eric问:“PCA在量化中怎么用?”
“因子模型!”Victor提高了音量,“假设你有100只股票的收益率序列,直接分析100维太复杂。用PCA降到5维,这5个主成分就是隐含的风险因子——可能对应市场因子、行业因子、规模因子等。”
# PCA提取因子
from sklearn.decomposition import PCA
returns = load_stock_returns() # (T, 100) 100只股票的收益率
pca = PCA(n_components=5)
factors = pca.fit_transform(returns) # (T, 5) 5个因子
# 解释方差比例
print(pca.explained_variance_ratio_)
# 例如:[0.45, 0.20, 0.10, 0.08, 0.05]
# 前5个因子解释了88%的方差!Carol若有所思:“所以上周说的协方差矩阵降秩问题,也可以用PCA来解决?”
“对!”Victor赞许地点头,“如果你的100×100协方差矩阵秩只有50,可以用PCA提取前50个主成分,在这个低维空间做风险分析,既稳定又有意义。”
LU/QR分解:效率之选
“最后说说LU和QR分解。这两个在理论上不如SVD优雅,但在数值计算中至关重要。”
LU分解:A = LU
- L:下三角矩阵
- U:上三角矩阵
- 用途:快速解线性方程组
为什么快?
直接求逆:O(n³)
LU分解后解方程:O(n²)
如果要解多个方程组Ax₁=b₁, Ax₂=b₂, ...
只需分解一次A,然后每次O(n²)求解QR分解:A = QR
- Q:正交矩阵(列向量相互垂直)
- R:上三角矩阵
- 用途:最小二乘法、特征值计算
为什么用QR不用直接求逆?
数值稳定性!正交矩阵的条件数为1,不会放大误差Bob问:“什么时候用LU,什么时候用QR?”
“规则很简单:解方程组用LU,最小二乘用QR,一般分析用SVD。记住这三个就够了, 你还没能耐研究它们底层原理呢。”
💼实战专题1:推荐系统
周四,Victor宣布进入实战环节:
“今天我们用矩阵分解实现一个推荐系统。别只会调库,要理解底层原理!”
他在白板上画了一个用户-商品评分矩阵:
“这个矩阵是稀疏的,大部分位置是空的。我们假设这个矩阵是低秩的——用户的喜好可以用少数几个隐含因子来描述。”
Victor写下矩阵分解的目标:
设评分矩阵 R ≈ P × Qᵀ 其中:
- R:m×n 评分矩阵(m个用户,n个商品)
- P:m×k 用户因子矩阵
- Q:n×k 商品因子矩阵
- k:隐含因子数量(通常很小,如10-50) 预测评分:r̂ᵢⱼ = pᵢ · qⱼ(用户i的向量与商品j的向量的点积)
“这就是为什么上周我们要学点积!推荐系统的核心就是:找到用户和商品的隐含向量表示,用点积计算相似度。”
Alice问:“怎么训练P和Q?”
Victor写下优化目标:
# 损失函数:预测评分与真实评分的均方误差
def loss(P, Q, R, mask):
pred = P @ Q.T
diff = (pred - R) * mask # mask标记哪些位置有真实评分
return np.sum(diff ** 2)
# 加上正则化防止过拟合
def regularized_loss(P, Q, R, mask, lambda_reg):
return loss(P, Q, R, mask) + lambda_reg * (np.sum(P**2) + np.sum(Q**2))“训练方法有很多:梯度下降、交替最小二乘(ALS)、随机梯度下降(SGD)…Netflix Prize比赛的冠军方案就是基于矩阵分解的。”
他给出了一个简化的实现:
def matrix_factorization(R, k=10, steps=1000, alpha=0.01, lambda_reg=0.1):
m, n = R.shape
P = np.random.randn(m, k) * 0.1
Q = np.random.randn(n, k) * 0.1
mask = (R > 0).astype(float) # 只在有评分的位置计算损失
for step in range(steps):
# 计算梯度
pred = P @ Q.T
error = (pred - R) * mask
P_grad = error @ Q + lambda_reg * P
Q_grad = error.T @ P + lambda_reg * Q
# 更新参数
P -= alpha * P_grad
Q -= alpha * Q_grad
if step % 100 == 0:
print(f"Step{step}, Loss:{loss(P, Q, R, mask):.4f}")
return P, QBob兴奋地说:“所以Netflix知道我喜欢什么电影,是因为它把我和电影都映射到了同一个向量空间?”
“对!如果你喜欢科幻片,你的用户向量在’科幻’这个维度上的值就会很高。如果一部电影是科幻片,它的商品向量在’科幻’维度上也很高。点积大,推荐概率就高。”
💰实战专题2:投资组合优化
同一天下午,Victor切换到金融主题:
“现在我们用线性代数解决一个真正的金融问题:Markowitz投资组合优化。”
他在白板上写下问题定义:
给定n只股票:
- 预期收益向量 μ = (μ₁, μ₂, …, μₙ)
- 协方差矩阵 Σ(n×n) 投资组合权重向量 w = (w₁, w₂, …, wₙ) 约束:Σwᵢ = 1(权重之和为1) 目标:在给定收益水平下,最小化风险 组合收益:E[r] = wᵀμ 组合风险(方差):Var[r] = wᵀΣw
“这是一个二次规划问题。用拉格朗日乘数法可以得到解析解,但关键是理解里面的矩阵运算。”
Carol问:“wᵀΣw这个形式代表什么?”
Victor详细解释:
wᵀΣw 叫做二次型(quadratic form) 展开: wᵀΣw = Σᵢ Σⱼ wᵢ wⱼ σᵢⱼ 其中σᵢⱼ是资产i和j的协方差 几何意义:
- 权重向量w定义了一个方向
- Σw是协方差矩阵对w的变换
- wᵀΣw是w和Σw的点积
- 结果是一个标量,表示该方向上的”风险强度”
“还记得特征分解吗?协方差矩阵的特征向量就是风险的主轴。如果你的投资组合权重w正好等于最大特征值对应的特征向量,那你承担的风险最大!”
Alice问:“那最小方差组合怎么求?”
Victor写下推导:
最小化:wᵀΣw
约束:wᵀ1 = 1(权重之和为1)
拉格朗日函数:
L = wᵀΣw - λ(wᵀ1 - 1)
对w求导令其为0:
2Σw - λ1 = 0
w = (λ/2)Σ⁻¹1
代入约束条件:
wᵀ1 = (λ/2)1ᵀΣ⁻¹1 = 1
λ = 2 / (1ᵀΣ⁻¹1)
最终解:
w* = Σ⁻¹1 / (1ᵀΣ⁻¹1)“看到了吗?最小方差组合的权重与协方差矩阵的逆有关。这就是为什么我们上周强调矩阵可逆性——如果协方差矩阵奇异,这个公式就失效了!”
他给出Python实现:
def minimum_variance_portfolio(cov_matrix):
"""计算最小方差组合权重"""
n = cov_matrix.shape[0]
ones = np.ones(n)
# 检查矩阵是否可逆
if np.linalg.matrix_rank(cov_matrix) < n:
print("警告:协方差矩阵降秩,使用伪逆")
cov_inv = np.linalg.pinv(cov_matrix)
else:
cov_inv = np.linalg.inv(cov_matrix)
# w* = Σ⁻¹1 / (1ᵀΣ⁻¹1)
weights = cov_inv @ ones
weights = weights / np.sum(weights)
return weights
def efficient_frontier(returns, cov_matrix, n_points=100):
"""计算有效前沿"""
n = len(returns)
# 目标收益从最小到最大
min_ret = np.min(returns)
max_ret = np.max(returns)
target_returns = np.linspace(min_ret, max_ret, n_points)
frontier_risk = []
frontier_weights = []
for target in target_returns:
# 这里需要解带等式约束的二次规划
# 简化起见,使用scipy.optimize
from scipy.optimize import minimize
def portfolio_var(w):
return w @ cov_matrix @ w
constraints = [
{'type': 'eq', 'fun': lambda w: np.sum(w) - 1},
{'type': 'eq', 'fun': lambda w: w @ returns - target}
]
result = minimize(portfolio_var, np.ones(n)/n,
constraints=constraints)
frontier_risk.append(np.sqrt(result.fun))
frontier_weights.append(result.x)
return target_returns, frontier_risk, frontier_weightsEric感叹:“原来投资组合优化就是在协方差矩阵定义的’风险空间’里找最优方向…”
“现在你开始理解了。”Victor难得露出满意的表情,“数学不是抽象的符号游戏,它描述的是真实世界的结构。投资组合优化、推荐系统、图像压缩…本质上都是在高维空间里找最优方向。”
⚠️数值稳定性:工程师的必修课
周五,最后一天的课程。
Victor表情严肃:
“今天讲的内容,可能会救你们的命——至少会救你们的钱。”
他在白板上写下:
为什么不要直接求逆矩阵?“你们的代码里,我看到大量的np.linalg.inv()调用。这是危险的。”
Bob不服:“求逆有什么问题?数学上不是很自然吗?”
Victor冷笑:
“数学上自然,数值上灾难。来,我给你们演示。”
import numpy as np
# 创建一个接近奇异的矩阵
A = np.array([
[1.0, 1.0],
[1.0, 1.0001]
])
b = np.array([2.0, 2.0001])
# 方法1:直接求逆
x_inv = np.linalg.inv(A) @ b
print(f"直接求逆:{x_inv}")
# 方法2:用solve(内部用LU分解)
x_solve = np.linalg.solve(A, b)
print(f"用solve:{x_solve}")
# 引入微小扰动
b_perturbed = np.array([2.0, 2.0002]) # 只变了0.0001
x_inv_perturbed = np.linalg.inv(A) @ b_perturbed
print(f"扰动后直接求逆:{x_inv_perturbed}")
print(f"结果变化:{x_inv_perturbed - x_inv}")“看,b只变了0.0001,结果却变了几个数量级!这就是条件数的问题。”
Victor解释条件数:
条件数(Condition Number): κ(A) = ||A|| × ||A⁻¹|| 对于对称矩阵: κ(A) = |λmax| / |λmin| 条件数的意义:
- κ ≈ 1:矩阵良态(well-conditioned),数值稳定
- κ >> 1:矩阵病态(ill-conditioned),误差会被放大
- κ = ∞:矩阵奇异,不可逆 经验法则: 如果κ(A) ≈ 10ᵏ,结果会损失约k位有效数字
“那个接近奇异的矩阵,条件数大约是10⁴。这意味着输入误差会被放大一万倍!”
Carol问:“那怎么避免这个问题?”
Victor给出规则:
工程实践守则:
1. 永远不要直接求逆
✗ x = inv(A) @ b
✓ x = solve(A, b) # 内部用LU/QR分解
2. 检查条件数
cond = np.linalg.cond(A)
if cond > 1e10:
print("警告:矩阵病态!")
3. 使用SVD处理病态矩阵
U, S, Vt = np.linalg.svd(A)
# 截断小奇异值
S[S < threshold] = 0
4. 正则化
# 不是 inv(XᵀX) @ Xᵀy
# 而是 inv(XᵀX + λI) @ Xᵀy(Ridge回归)最后,Victor讲解了稀疏矩阵:
“大规模数据分析中,矩阵往往是稀疏的——大部分元素是0。如果你用稠密矩阵存储,浪费内存不说,计算也慢得要死。”
from scipy import sparse
# 稠密矩阵:1000×1000 = 100万个元素
dense = np.zeros((1000, 1000))
# 假设只有1万个非零元素
# 稀疏矩阵:只存储非零元素
rows = [...] # 非零元素的行索引
cols = [...] # 非零元素的列索引
data = [...] # 非零元素的值
sparse_matrix = sparse.csr_matrix((data, (rows, cols)), shape=(1000, 1000))
# 内存对比
print(f"稠密矩阵:{dense.nbytes / 1e6:.2f} MB")
print(f"稀疏矩阵:{sparse_matrix.data.nbytes / 1e3:.2f} KB")“在推荐系统中,用户-商品评分矩阵通常99%都是0。用稀疏矩阵,千万级用户的系统才能跑得动。”
🎓结业与展望
课程结束后,黑犬把大家召集在一起。
“两周的培训结束了。张总,你觉得他们进步如何?”
Victor推了推眼镜,难得地露出了一丝笑意:
“从文盲进步到了小学生。”
全场哄笑。
“但是,”Victor话锋一转,“有几个人让我印象深刻。Alice对数学的直觉很好,已经能自己推导PCA和因子模型的关系了。Carol的工程能力配合数学思维,实现的SVD压缩代码效率很高。Bob虽然基础差,但学习速度快,从三层循环优化到矩阵运算只用了两天。”
黑犬满意地点头:“那Victor,你愿意继续留下来吗?”
Victor沉默了几秒:
“我考虑考虑。这群人虽然蠢,但比普林斯顿的学生有趣。他们会把数学用到真实的金融产品里,而不是发表论文后束之高阁。况且这里比起学校,工资高多了哈哈哈。”
他收拾东西准备离开,走到门口又回头:
“下周开始,我要测试你们能不能把这两周学的东西用到实际项目中。谁能用SVD把上个月的推荐系统效果提升10%,我请他吃饭。”
Bob喊道:“Victor,你请客的话是去哪里吃?”
“食堂。”
全场爆笑。
Victor离开后,Carol看着白板上密密麻麻的公式,对Alice说:
“这两周学的东西,比我大学四年学的都多。”
Alice点头:“因为Victor不只是在教公式,他在教思维方式。从几何直觉出发,理解每个公式背后的意义,然后才是计算。”
Bob插嘴:“我现在看到矩阵乘法,脑子里自动浮现的是空间变换,不再是行乘列了。”
Carol笑了:“这大概就是Victor说的’从代码猴子进化到量化研究员’的第一步吧。”
📒本周总结
本周是线性代数的进阶篇,也是最后一周的线代内容。文章任务虚拟且真实的量化工作人员也不会搞不懂文中的知识,这样写只是提供一种有趣的方式来理解线性代数的基本知识。
🚨一个重要说明:一些读者问我说原来week9-10不是C++模板编程的主题么,是不是搞错了。其实不是,因为我发现原来计划的是讲完模板编程,插入一个月的线代再讲STL的内容,然而STL库本身就需要模板编程的基础更好理解,把模板和STL放在一起讲反而连贯性会更好,因此在C++基础语法之后把线代提前了。
本周我们跟随Victor完成了线性代数的深入学习:
- 特征值与特征向量
- 核心概念:Av = λv,找到变换的”主轴”
- 几何意义:特征向量是只被拉伸不被旋转的方向
- 应用:PageRank、协方差矩阵分析、风险因子识别
- 矩阵分解三剑客
- SVD:万能分解,A = UΣVᵀ,用于降维、压缩、推荐系统
- PCA:找方差最大的方向,提取主成分和隐含因子
- LU/QR:高效解方程组,保证数值稳定性
- 实战应用
- 推荐系统:用户-商品矩阵分解,点积计算相似度
- 投资组合优化:Markowitz模型,最小方差组合
- 因子模型:用PCA提取风险因子
- 数值稳定性
- 条件数:衡量矩阵的”健康程度”
- 永远不要直接求逆,用solve或SVD
- 大规模数据必须用稀疏矩阵
正如Victor所说:数学不是抽象的符号游戏,它描述的是真实世界的结构。投资组合优化、推荐系统、图像压缩…本质上都是在高维空间里找最优方向。理解了这一点,你就不再是调用API的程序猿,而是真正可以着手做量化研究的人了。
本周的代码实现和练习已上传至Github仓库:https://github.com/shuheng-mo/qd-study-plan-104wk.git
下周预告:W11 - 线性代数进阶(上)
线性代数基本原理告一段落,下周我们将更深入的探讨线性代数在量化中的运用。
各位下周五见!👋