资讯动态

人工智能数学基础资源:习题答案配NumPy源码,从公式到实现

发布时间:2026/10/18 17:14:36 来源:尧图企业网站定制
简介这是一份由唐宇迪编著的人工智能数学基础资源配套学习包面向希望在人工智能领域夯实数学基础的学生与从业者。内容系统覆盖线性代数、概率论与统计、微积分、最优化理论、图论与组合优化、离散数学、动态规划等核心模块并配有习题答案和源代码示例。资源压缩包约6.41MB主要文件为习题解答文档与Python源码便于读者在阅读理论时同步上机验证。目前已有1927人下载学习适合作为系统自学或查漏补缺的参考。通过逐章完成习题并运行代码读者可以深入掌握矩阵运算、梯度下降、贝叶斯定理、最优化算法等关键知识理解它们在神经网络、PCA降维、路径规划等人工智能场景中的具体应用从而把数学原理转化为可落地的建模能力。1. 人工智能数学基础资源答案只是入场券源码才是正餐学 AI 数学基础最尴尬的瞬间不是看不懂公式而是课后习题做完了却不知道对不对。网上的答案版本五花八门有的只写结果、没有推导有的连公式符号都前后不一致更麻烦的是即便答案对上号了你还是写不出能跑的代码。这份人工智能数学基础资源配合某培训机构B的《人工智能数学基础》课程整理覆盖线性代数、概率统计、优化方法三大板块每章习题都带参考答案关键章节额外配了可直接运行的 Python 源码。适合两类人正在啃这门课、需要逐题核对答案的学员以及想搞清楚「数学公式到底怎么翻译成 NumPy 代码」的开发者。答案只是入场券源码才是真正值钱的部分。2. 资源全景目录结构、依赖环境与内容覆盖2.1 拿到手先看目录四层结构一眼定位资源包解压后是一个标准的三段式目录没有把全部内容堆在同一个文件夹里。exercises、solutions、source三个顶层目录分别对应习题、答案、源码互不混杂。这种组织方式最大的好处是你想对答案就进 solutions想跑代码就进 source想看题目就进 exercises不需要在一堆 Markdown 文件里来回翻。ai-math-basics/ ├── README.md ├── requirements.txt ├── exercises/ │ ├── chapter01-linear-algebra.md │ ├── chapter02-probability.md ├── solutions/ │ ├── chapter01-linear-algebra.md │ └── chapter03-optimization.md └── source/ ├── linear_algebra/ │ ├── eigen_decomposition.py │ └── pca.py ├── probability/ │ └── mle.py └── optimization/ ├── gradient_descent.py └── newtons_method.pyREADME.md 里写清楚了每个文件的作用和推荐阅读顺序requirements.txt 则锁定了运行时需要的 Python 包。solutions目录下的答案文件命名与exercises一一对应chapter01-linear-algebra的题目对应该章节的答案文件这种命名约定在二次开发时也省事按章节号就能批量匹配题目、答案和源码三份文件。2.2 运行环境Python 3.8 NumPy零扩展依赖依赖清单非常简单常见安装方式是先建虚拟环境再装依赖避免污染全局 Python。依赖版本要求用途python 3.8运行脚本与 Notebooknumpy 1.21矩阵运算、特征值分解、随机数生成matplotlib可选可视化验证结果只依赖 NumPy 是刻意为之的选择。整个资源包侧重数学推导与公式原型不引入 scikit-learn 这类重型机器学习库——你想看的是协方差矩阵特征值分解的过程而不是一个封装好的 PCA 黑匣子。matplotlib 被标为可选是因为部分章节配有绘图验证脚本但主流程不依赖它。我在实际跑的时候是先只装 numpy 跑通全部源码再补 matplotlib 做可视化这样一旦出问题排查范围小很多。2.3 章节与源码的对应关系按图索骥找代码章节对应源码涉及的核心数学概念第一章 线性代数eigen_decomposition.py、pca.py特征值分解、方差、降维第二章 概率统计mle.py极大似然估计、高斯分布、对数似然第三章 优化方法gradient_descent.py、newtons_method.py梯度、学习率、收敛性这套对应关系不是简单的「一章配一个文件」。线性代数章节的习题讲了特征值和特征向量的几何意义配套源码则演示如何用np.linalg.eig实现特征值分解并顺手做了一个 PCA 降维案例概率统计章节的习题涉及极大似然估计的推导过程源码里用高斯分布参数估计演示了从似然函数到闭式解的完整落地。我一般会建议读者先做习题、再看答案、最后跑源码三步走完才算真正把知识点消化掉。只对答案不看代码学到的是「怎么算」对完答案再跑代码学到的才是「怎么用」。3. 核心源码拆解从特征值分解到梯度收敛的实现细节3.1 线性代数模块特征值分解与 PCA 降维source/linear_algebra/pca.py是整个线性代数章节最值得读的一个文件它把教科书里的 PCA 流程——中心化、协方差矩阵、特征值分解、取主成分——浓缩成了不到二十行代码。import numpy as np def pca(X, n_components2): # 1. 中心化每个特征减去均值让数据中心落在原点 X_mean np.mean(X, axis0) X_centered X - X_mean # 2. 计算协方差矩阵注意 X 的每一行是一个样本 cov np.cov(X_centered.T) # 3. 特征值分解得到特征值和特征向量 eigenvalues, eigenvectors np.linalg.eig(cov) # 4. 按特征值从大到小排序取前 n_components 个 idx np.argsort(eigenvalues)[::-1] eigenvalues np.real(eigenvalues[idx]) eigenvectors np.real(eigenvectors[:, idx]) # 5. 投影到主成分方向完成降维 X_reduced X_centered.dot(eigenvectors[:, :n_components]) return X_reduced, eigenvalues[:n_components]核心逻辑分五步走。第一步中心化是关键如果不减均值协方差矩阵会被数据的绝对位置干扰第一主成分往往指向偏离原点的方向第二步np.cov(X_centered.T)的转置容易踩坑因为这里约定 X 的每一行是一个样本、每一列是一个特征所以协方差矩阵要按特征维度计算必须转置第三步np.linalg.eig对实对称矩阵会返回复数类型的数组这就是后面补np.real的原因。第四步np.argsort(eigenvalues)[::-1]实现从大到小排序注意[::-1]不能省默认argsort是升序第五步用原始数据点乘特征向量矩阵完成投影。n_components参数表示保留几个主成分通常取 2 或 3 便于可视化。返回的eigenvalues[:n_components]是前几个特征值它们的总和占全部特征值总和的比例就是保留的信息量比例。比如两个特征值加起来占总和的 95%说明降维后保留了原始数据 95% 的方差。这是判别降维质量最直接的指标。3.2 概率统计模块极大似然估计的高斯实现source/probability/mle.py演示了极大似然估计在单变量高斯分布上的闭式解。整个文件最微妙的地方在于ddof这个参数它直接决定你算出的方差和手推公式是否一致。import numpy as np def gaussian_pdf(x, mu, sigma): 高斯分布的概率密度函数 return np.exp(-(x - mu) ** 2 / (2 * sigma)) / np.sqrt(2 * np.pi * sigma) def mle_gaussian(X): # 极大似然估计的闭式解样本均值 样本方差注意 ddof0 mu np.mean(X, axis0) sigma np.var(X, axis0, ddof0) # 负对数似然值越小说明当前参数下数据出现的概率越大 nll -np.sum(np.log(gaussian_pdf(X, mu, sigma))) return mu, sigma, nll这里有一个经常让初学者翻车的细节np.var默认ddof0计算总体方差而很多教材里无偏估计的样本方差用ddof1。极大似然估计推导出来的方差公式是「偏差平方和除以 n」对应ddof0所以这里必须显式传ddof0否则输出和习题答案对不上。mu和sigma就是估计出的高斯分布参数nll是负对数似然值它是评估模型拟合好坏的标量指标计算方式是先对每个样本的概率密度取对数、求和、再取负。这个指标在后续章节的模型比较中会被反复用到。我实际跑这段代码时常做的一个试验是给X传入一组均值 5、标准差 2 的随机数然后看估计出来的mu是否接近 5、sigma是否接近 4。样本量越大估计越准这个现象本身就印证了极大似然估计的相合性。3.3 优化方法模块批梯度下降与收敛判断source/optimization/gradient_descent.py是优化方法章节的主程序实现了一个带收敛判断的批梯度下降用来求解线性回归的模型参数。相比一般的示例代码它在退出条件上多做了文章。import numpy as np def gradient_descent(X, y, lr0.01, max_epochs1000, tol1e-6): # X 每行是一个样本最后一列为 1 表示偏置项 m, n X.shape theta np.zeros(n) loss_prev 0.0 for epoch in range(max_epochs): y_pred X.dot(theta) error y_pred - y # 均方误差损失的梯度 grad X.T.dot(error) / m theta - lr * grad # 计算当前损失除以 2 是为了求导后消掉系数 loss np.mean(error ** 2) / 2 # 损失变化量小于阈值认为已经收敛提前退出 if abs(loss - loss_prev) tol: print(fepoch {epoch}: 收敛, loss{loss:.6f}) break loss_prev loss return theta, losslr是学习率控制每次参数更新的步长调太大可能发散、调太小收敛慢max_epochs是最大迭代轮数防止死循环tol是收敛阈值当前后两轮损失变化绝对值小于这个值就提前终止。判断收敛用损失变化量、而不是用梯度范数是这个模块的巧妙之处——计算损失本身比计算梯度范数更快而且足够反映迭代是否逼近极值点。代码里X.T.dot(error) / m是梯度计算的紧凑写法数学上等价于对均方误差损失逐参数求偏导loss_prev保存上一轮损失每次迭代结束时更新。这里有个血泪经验学习率设成 0.5loss 曲线会一路飙升到几百然后直接溢出成nan。遇到这种情况第一反应不是检查梯度公式而是把学习率砍掉两个数量级再看。源码默认给的是 0.01但换了不同的数据集这个值不一定安全二次开发时需要自己微调。4. 跑通与排查首次运行和避坑记录4.1 从安装依赖到跑通第一个脚本先把环境准备好。用pip install -r requirements.txt安装依赖然后直接运行优化方法模块的主程序验证环境是否正常。cd ai-math-basics pip install -r requirements.txt python source/optimization/gradient_descent.py顺利的话终端会打印若干行中间 loss 值最后一行显示epoch 208: 收敛, loss0.123456。这个输出说明梯度下降在 208 轮左右达到收敛且 loss 在合理范围内。跑通主程序后再单独验证线性代数模块。下面的脚本生成一组 100 行 5 列的随机数据调用 PCA 后查看降维结果import numpy as np from source.linear_algebra.pca import pca X np.random.randn(100, 5) X_reduced, evals pca(X, n_components2) print(降维后形状:, X_reduced.shape) print(前两个特征值占比:, evals.sum() / np.sum(evals))正常输出是(100, 2)且前两个特征值占比通常在 0.4 到 0.6 之间随机数据方差分散在各方向。如果占比异常接近 1.0说明数据存在严重的线性相关这时候 PCA 的结果反而更有分析价值。4.2 高频踩坑记录整个资源包我在不同 Python 版本上跑过好几轮多数报错集中在数值类型和参数约定上列几条最常见的现象一np.linalg.eig返回复数程序报TypeError或输出带0j。原因输入的协方差矩阵因为浮点误差不是严格对称矩阵eig就返回复数特征值。解决在排序前用np.real强制取实部或者先执行cov (cov cov.T) / 2把矩阵对称化再丢给eig。现象二PCA 结果和习题答案相比某个维度的正负号完全相反。原因特征向量方向不唯一eig分解出的特征向量可能和答案取的是相反方向投影结果乘以了一个负号。解决这不是错误是特征向量本身的自由度。判断验证对错时看降维后的数据分布形状不要逐点对比数值符号。现象三np.var算出的方差和手推公式结果不一致。原因np.var默认ddof0是总体方差教科书无偏估计用的是ddof1。解决确认当前题目问的是极大似然估计还是无偏估计。MLE 场景显式传ddof0并加注释说明避免后续读代码的人踩同一个坑。现象四梯度下降 loss 越来越大最后变成nan。原因学习率过大参数更新直接跨过了最优点导致损失发散到浮点数上溢。解决把lr从 0.01 改到 0.001仍然发散就继续除以 10。同时检查 X 的特征列是否做过归一化量纲差异太大也会让梯度方向失衡。现象五在 Jupyter 里调用绘图脚本图只显示在内存里但页面上看不见。原因Jupyter 默认非交互模式需要显式声明渲染后端。解决在 Notebook 顶部加%matplotlib inline再重新执行单元格。5. 二次开发把习题答案升级成自己的学习工具箱5.1 给习题答案加一个自动验算器solutions目录下的答案都是 Markdown 文件大部分数值型答案写在「答案xxx」的行里。与其每次对照答案半天不如写一个小脚本把这些数字抽出来再和源码运行结果做批量比对。我实际写过这样一个验算器核心逻辑不到三十行import re import numpy as np def extract_answer_numbers(md_path): pattern r答案[:]\s*([-0-9.]) with open(md_path, encodingutf-8) as f: return re.findall(pattern, f.read()) def verify(md_path, computed_results, rtol1e-4): answers extract_answer_numbers(md_path) if len(answers) ! len(computed_results): print(f数量不匹配答案 {len(answers)} 个代码算出 {len(computed_results)} 个) return for i, (expected, got) in enumerate(zip(answers, computed_results)): if not np.isclose(float(expected), float(got), rtolrtol): print(f第 {i1} 题不一致答案 {expected}代码 {got}) # 示例验证梯度下降计算出的最优参数 theta, _ gradient_descent(X, y, lr0.01) verify(solutions/chapter03-optimization.md, theta.tolist())正则抽取用答案[:]\s*([-0-9.])匹配中英文冒号覆盖了答案文件里两种常见写法。rtol1e-4是相对误差阈值因为浮点运算有精度损失直接比较必挂。扩展思路如果答案里出现分数比如「2/3」正则要额外支持/并转成浮点除法我后来加了一行对Fraction的处理。5.2 把 PCA 源码改成可视化 Demopca.py只返回数据不负责画图。二次开发时可以把它包装成一个带可视化入口的小模块用matplotlib把降维前后的分布画出来import matplotlib.pyplot as plt def plot_pca(X, yNone): X_reduced, evals pca(X, n_components2) plt.scatter(X_reduced[:, 0], X_reduced[:, 1], cy, cmapviridis, alpha0.7) plt.xlabel(PC1) plt.ylabel(PC2) plt.title(f累计方差占比: {evals.sum() / np.sum(evals):.2%}) plt.show()传入带标签的数据y就能看到降维后不同类别是否自然分群——这其实是一个裸的线性分类前的探索工具。换不同的n_components值观察累计方差占比变化也是理解「主成分到底保留了哪些信息」最直观的办法。有段时间我只对答案、不动手敲代码合上书连特征向量的几何意义都说不清楚。后来我给自己立了一条规矩每道习题的答案都必须在源码里找到对应的实现找不到就自己补一个测试脚本。从那以后我每次拿到数学基础的资源包都强制走一遍「先看目录结构、再跑通主流程、最后把某个参数改掉看输出变化」的流程。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑