吴恩达机器学习作业实战指南:无答案版校准+答案版反向工程
简介本资源是面向机器学习初学者与自学者的吴恩达《Machine Learning》课程配套实践套件覆盖课程全部核心算法实验助力系统掌握监督学习、无监督学习与降维等关键内容。压缩包共1028个文件总计202.33MB包含623个MATLAB/Octave脚本.m、61个Jupyter Notebook.ipynb含完整推导与可视化如PCA人脸数据降维、K-means图像压缩、44个PDF文档含合并版作业题、课堂讲义及中文个人笔记另有大量.mat数据文件、.txt说明与.png结果图结构清晰、即开即用。已有2529人学习下载笔记采用中文梳理公式推导与代码逻辑作业提供无答案版用于自主练习、三版有答案版供对比验证Checkpoint文件支持分步调试大幅降低入门门槛与调试成本。1. 吴恩达机器学习作业无答案与有答案各一版与个人笔记.zip不是资源包而是你学透《机器学习》课程的「校准器」如果你正卡在吴恩达《机器学习》课程第3周的逻辑回归梯度下降推导、第6周的正则化代价函数手写实现、或者第8周的异常检测高斯分布参数估计上——别急着翻答案先打开这个.zip文件里的「无答案版」作业。它不是练习册而是一套经过千人实测验证的「认知压力测试工具」所有ex1.m到ex8.mMATLAB或对应 Python 版本如ex1.py都保留原始函数签名、数据加载结构、注释占位符和断言检查但关键计算部分留空% TODO:或pass且配套的submit.m提交脚本仍能运行并返回具体错误码。而「有答案版」并非简单贴出结果而是包含三重校验层① 每个函数内嵌assert对中间变量形状/值域校验如theta.shape (2,1)② 独立test_exX.py脚本用真实数据跑通全流程③ 个人笔记 PDF 中用红蓝双色标注「公式推导链」蓝色与「代码映射点」红色比如在「正规方程求解」旁批注X.T X的维度必须是(n,n)否则np.linalg.inv()报LinAlgError: Singular matrix—— 这正是你调试时最常卡住的黑匣子。它适合两类人刚学完视频但不敢动笔的初学者以及已写过代码却总在cost function收敛异常上反复翻车的老手。这不是抄作业的捷径而是把吴恩达课程从「听懂了」拉到「亲手造出来」的唯一杠杆。2. 用无答案版作业搭建你的最小可验证学习闭环从环境初始化到单步调试2.1 环境初始化MATLAB 与 Python 双轨并行的硬性约束吴恩达原课程使用 MATLAB/Octave但当前主流实践已转向 Python。本压缩包严格区分两条路径不可混用。MATLAB 方向要求 R2018a 及以上因ex5.m中fmincg函数依赖较新优化器Octave 用户需额外安装optim包pkg install -forge optim。Python 方向强制要求numpy1.21.6避免np.matrix废弃导致ex2.py中 sigmoid 计算异常与scipy1.7.3ex4.py的fmin_cg需要该版本的callback参数支持。安装命令如下# Python 环境推荐 conda 创建独立环境 conda create -n ml-ng python3.8 conda activate ml-ng pip install numpy1.21.6 scipy1.7.3 matplotlib3.5.2提示不要用pip install -r requirements.txt—— 压缩包内无requirements.txt。所有依赖版本均经ex7.pyK-means的np.random.seed(42)一致性测试验证高版本scipy会导致聚类中心初始化顺序错乱。2.2 无答案版作业的启动流程以 ex2_logistic_regression 为例进入解压后目录结构为ng-ml-hw/ ├── ex1_linear_regression/ │ ├── ex1.m (MATLAB) / ex1.py (Python) │ ├── submit.m / submit.py │ └── data/ ├── ex2_logistic_regression/ │ ├── ex2.m / ex2.py │ ├── plotDecisionBoundary.m / plot_decision_boundary.py │ └── data/ └── notes/ # 个人笔记 PDF以ex2为例Python 启动步骤如下MATLAB 类似替换为ex2.m# 在 ex2_logistic_regression/ 目录下执行 import numpy as np from ex2 import sigmoid, costFunction, gradientDescent # 注意只导入函数不运行主逻辑 # 1. 加载数据复现原课程 data/ex2data1.txt data np.loadtxt(data/ex2data1.txt, delimiter,) X, y data[:, :2], data[:, 2:3] # X 是 (100,2)y 是 (100,1) # 2. 添加偏置列吴恩达课程要求 X[:,0] 1 X np.hstack([np.ones((X.shape[0], 1)), X]) # 3. 初始化参数theta 必须是 (3,1) 列向量 theta np.zeros((X.shape[1], 1)) # (3,1)非 (3,) 或 (1,3) # 4. 手动调用 costFunction 测试这是你真正理解的第一步 J, grad costFunction(theta, X, y) print(f初始代价 J {J:.6f}) # 应输出约 0.693147这段代码的关键在于不直接运行ex2.py全局脚本而是拆解其核心函数逐个验证。costFunction返回的J值若不等于0.693147说明sigmoid实现有误常见于未用np.exp(-z)而用1/(1np.exp(z))导致数值溢出若grad形状不是(3,1)说明梯度计算未按列向量广播规则处理。2.3 单步调试法用 assert 锁死每个中间变量的数学契约吴恩达作业的精髓在于「数学契约」——每个函数输入输出必须满足明确的维度与值域约束。ex2.py中costFunction的契约如下变量形状值域约束校验方式theta(n1, 1)任意实数assert theta.ndim 2 and theta.shape[1] 1X(m, n1)任意实数assert X.shape[0] y.shape[0]y(m, 1){0,1}assert set(np.unique(y)) {0,1}JscalarJ 0assert J 0grad(n1, 1)任意实数assert grad.shape theta.shape将这些assert插入函数开头是防止后续计算雪崩的后悔药。例如在sigmoid函数中加入def sigmoid(z): # 防止 np.exp 溢出的工程技巧吴恩达原课未提但实际必加 z np.clip(z, -500, 500) # 超出范围则截断 return 1 / (1 np.exp(-z))没有这行clip当z达到-1000时np.exp(-z)会返回inf导致sigmoid输出nan进而使costFunction返回nan—— 这是ex2最隐蔽的翻车点。3. 有答案版作业的正确打开方式不是抄而是做「反向工程审计」3.1 答案版的三层结构函数实现、测试脚本、笔记映射有答案版不是.m或.py文件里直接填好代码而是包含三个协同组件exX_solution.py仅含核心函数costFunction,gradientDescent等无主程序所有TODO已替换为可运行代码test_exX.py独立测试文件加载真实数据、调用exX_solution.py函数、用np.testing.assert_allclose校验输出精度容差1e-6notes/exX_notes.pdf个人笔记扫描件每页左侧为手写公式推导如逻辑回归的对数似然求导过程右侧为对应代码行号与变量名如grad[0]对应∂J/∂θ₀。以ex4_neural_network为例test_ex4.py的关键校验段# test_ex4.py 片段 from ex4_solution import nnCostFunction # 使用课程提供的 theta1, theta2 初始化 theta1 np.loadtxt(data/Theta1.txt, delimiter,) theta2 np.loadtxt(data/Theta2.txt, delimiter,) # 输入X(5000,400), y(5000,1), theta1(25,401), theta2(10,26) J, grad nnCostFunction(np.hstack([theta1.ravel(), theta2.ravel()]), X, y, 25, 10) # 校验代价函数值吴恩达官方给出的基准值 np.testing.assert_allclose(J, 0.287629165161313, atol1e-6)这个assert不是摆设——它强制你理解nnCostFunction的输入nn_params是theta1和theta2的扁平化拼接ravel()而非字典或元组。若你传入(theta1, theta2)函数会因reshape失败而报ValueError。3.2 笔记 PDF 的阅读方法用「红蓝双色」定位知识断点notes/ex4_notes.pdf第12页对应ex4的反向传播采用红蓝双色标注蓝色批注手写体δ² (Θ²)ᵀ δ³ .* g′(z²)→ 推导依据链式法则 sigmoid 导数g′(z)g(z)(1−g(z))红色批注印刷体# line 142 in ex4_solution.py: delta2 delta3 Theta2[:,1:].T * sigmoidGradient(z2)箭头连接从蓝色公式指向红色代码行并标注注意Theta2[:,1:] 去掉偏置列因 δ² 不含偏置项这种映射直击痛点你知道公式但不知道代码里哪一行实现它更不知道为何要切片[:,1:]。笔记用视觉锚点强行建立「数学→代码」的神经链接比看10遍视频有效。3.3 答案版的禁忌用法禁止直接复制粘贴到 submit.pysubmit.py是吴恩达官方提交系统接口它会对函数进行动态符号检查不仅校验输出值还检查函数内部是否调用了np.linalg.pinv正规方程、是否用了for循环梯度下降要求向量化等。若你把ex4_solution.py的nnCostFunction直接复制进ex4.py并运行submit.py大概率触发 Error: Your function uses for loop. Vectorize it.正确做法是用答案版反向推导出自己的实现。例如看到ex4_solution.py中delta2 delta3 Theta2[:,1:].T * sigmoidGradient(z2)你要自己写出等价的向量化表达式而非复制整行。答案版是「参考设计图」不是「成品零件」。4. 个人笔记的实战价值从公式抄写到「错误模式库」的进化4.1 笔记的物理形态A4 纸手写扫描 关键页 OCR 文本层压缩包中的notes/目录下每个exX_notes.pdf均为 A4 纸手写扫描件300dpi并叠加 OCR 文本层可用 Adobe Acrobat 搜索关键词。手写部分包含三类内容公式推导链用不同颜色箭头连接J(θ)定义 → 对θ_j求偏导 → 化简为1/m Σ(h_θ(x^(i))−y^(i))x_j^(i)代码陷阱标注在ex3.py的oneVsAll函数旁批注⚠️ y0 时 label10非 0因 MATLAB 索引从1开始调试日志截图ex5.py的learningCurve函数运行时train_error与cv_error曲线图标出「当 m50 时 cv_error 突增」并分析λ 过小导致过拟合需调大正则化参数。OCR 文本层确保你能搜索sigmoidGradient或lambda快速定位而手写痕迹保留了思考过程的温度——比如ex6.py的gaussianKernel旁画了个大叉旁边写r² 写成 r导致相似度全为0这就是血泪经验。4.2 笔记的进阶用法构建你的「错误模式库」真正的高手不记正确答案而记典型错误。笔记中专门设置「错误模式库」章节notes/error_patterns.md收录 12 类高频翻车场景错误类型触发作业现象根本原因修复指令维度错位ex1, ex2ValueError: operands could not be broadcast togetherX未添加偏置列或theta是(n,)非(n,1)X np.hstack([np.ones((m,1)), X])数值溢出ex2, ex4cost nan或grad infsigmoid(z)中z过大导致exp(-z)溢出z np.clip(z, -500, 500)索引越界ex3IndexError: index 10 is out of boundsMATLAB 数据中y10表示数字0Python 用y[y10] 0修正y y % 10正则化漏项ex3, ex4J值比标准答案小未对theta[0]偏置项排除正则化J (lambda_/(2*m)) * np.sum(theta[1:]**2)这份表格不是理论总结而是你调试时的「故障代码手册」。当ex4报nan不用重读整个反向传播直接查表第2行插入clip即可。4.3 笔记的更新机制每次 debug 后手写补丁页笔记 PDF 支持增量更新。每完成一次作业调试用 A4 纸手写「补丁页」标题为exX_patch_20240520内容包括问题描述ex5.py line 89: polyFeatures 返回 X_poly 形状为 (m, p1)但预期 (m, p)根因分析polyFeatures.m 原始实现包含 bias column但 Python 版未同步导致后续 normalizeFeature 多一列修复代码X_poly X_poly[:, 1:] # remove bias column验证结果learningCurve 正常收敛train_error 从 0.001→0.0003扫描后命名为ex5_patch_20240520.pdf放入notes/目录。一年后回看你会发现自己构建了一套专属的「吴恩达课程 Debug 知识图谱」。5. 避坑指南吴恩达机器学习作业的 5 个致命陷阱与现场急救5.1 现象submit.py提示Your solution is correct!但在线评测失败原因本地submit.py与 Coursera 服务器版本不一致。课程更新后Coursera 后端校验逻辑升级如新增np.isfinite(grad).all()检查但你本地submit.py仍是旧版。解决删除本地submit.py从 Coursera 课程页面重新下载最新版路径Programming Assignment → Download Submission Script。切勿用网盘分享的旧版submit.py。5.2 现象ex4.py中predict函数返回全0预测原因h sigmoid(X theta.T)后未取np.argmax(h, axis1)而是直接h 0.5。神经网络输出是 10 维概率向量需选最大概率索引0~9而非二值化。解决p np.argmax(h, axis1) 11因 MATLAB 索引从1开始p1对应数字0。5.3 现象ex7.pyK-means 聚类中心始终不移动原因findClosestCentroids返回idx是(m,)但computeCentroids中X[idx k]因idx为整型数组返回布尔索引失效。解决强制转布尔X[idx k, :]→X[(idx k).flatten(), :]或改用np.where(idx k)[0]。5.4 现象ex8.py异常检测pval全为0原因multivariateGaussian中协方差矩阵sigma2计算用np.cov(X.T)但np.cov默认除以n-1而吴恩达要求除以n最大似然估计。解决sigma2 np.cov(X.T, biasTrue)或sigma2 (X.T X) / m。5.5 现象ex6.pySVMC1时决策边界完全错误原因svmTrain调用sklearn.svm.SVC时未设kernellinear默认rbf导致非线性边界。解决model SVC(CC, kernellinear, tol1e-3)且tol必须设为1e-3原课程要求。注意所有sklearn版本必须为1.0.2。新版SVC的decision_function返回格式变更会导致plotDecisionBoundary绘图失败。6. 把作业变成你的「机器学习肌肉记忆」一个可落地的每日训练协议6.1 「15分钟真题拆解」用无答案版重建认知回路每天选一个作业模块如ex3的oneVsAll执行以下流程严格计时15分钟闭卷重写函数签名2分钟凭记忆写出def oneVsAll(X, y, num_labels, lambda_):不查资料手推核心公式5分钟在纸上推导J(θ)对θ_j的偏导写出向量化形式伪代码翻译5分钟将公式转为带np.前缀的伪代码如grad (1/m) * X.T (h - y) (lambda_/m) * theta对照答案找断点3分钟打开ex3_solution.py对比自己伪代码与实际实现标记差异点如是否漏theta[0]正则化。坚持21天你会发现ex3的oneVsAll不再是代码而是脑内自动运行的数学流水线。6.2 「错误注入测试」主动制造故障以强化鲁棒性每周选一个已通过的作业如ex2执行「错误注入」将sigmoid中np.exp(-z)改为np.exp(z)将costFunction中np.log(1-h)改为np.log(h)将gradientDescent中theta theta - alpha * grad改为theta theta alpha * grad。然后运行test_ex2.py记录报错信息、J值变化趋势、grad符号反转特征。这种「自虐式训练」让你对每个函数的数学行为形成肌肉记忆——看到J持续上升立刻反应grad符号反了看到Jnan秒判sigmoid溢出。6.3 笔记的终极用法生成你的「个性化考试题库」用notes/中的错误模式库自动生成考题题型示例答案要点维度诊断X.shape(100,2),theta.shape(3,),Xtheta报错如何修复theta theta.reshape(-1,1)或X np.hstack([np.ones((100,1)), X])数值陷阱sigmoid(1000)返回1.0但sigmoid(-1000)返回0.0为何costFunction仍可能nanlog(1-h)中h1.0导致log(0)需clip或np.log(1-h1e-10)索引陷阱y中含10np.unique(y)返回[0,1,2,...,9,10]如何映射为[0,1,2,...,9,0]y[y10] 0我坚持用这套协议训练了14个月现在看到ex5.py的polyFeatures函数脑内自动浮现X_poly的每一列对应x₁,x₂,x₁²,x₁x₂,x₂²… 这不是背诵而是把吴恩达的数学语言编译成了我的神经突触。作业不是终点而是你和机器学习世界握手的第一次触感——希望帮到你。本文还有配套的精品资源点击获取