☰
吴恩达机器学习作业全解析:Octave环境配置与八项练习实战指南
2026/10/28 23:33:29 网站建设 项目流程

简介:这是一套面向吴恩达《机器学习》课程学习者的完整课后编程作业与学习资料包,适合正在跟课刷题、需要配套动手实践或系统备考复习的读者。压缩包内含1028个文件,整体约202MB,其中以m脚本、ipynb笔记为主,配合mat数据、pdf讲义、png示意图等,覆盖线性回归、逻辑回归、神经网络、SVM、K-means、PCA等经典实验场景。作业同时提供无答案与有答案两个版本,其中有答案版又细分为三版,便于读者对照验证;另附可打印的作业题目合并版PDF、课堂讲义和中文个人笔记,目录结构清晰,方便离线阅读与按章节整理。目前已有2531人学习下载,内容系统实用,可帮助读者从理论走向实践,加深对算法实现细节的理解。

1. 这个zip不只是一份作业题:拿到手先明确它能帮你解决什么

很多人下载“吴恩达机器学习作业(无答案与有答案各一版)与个人笔记.zip”回来,第一反应是解压、翻目录、然后不知道先碰哪个文件。这个zip对应的正是吴恩达在Coursera上的《Machine Learning》课程配套编程练习,通常叫ex1到ex8,覆盖线性回归、逻辑回归、神经网络、SVM、聚类、异常检测和推荐系统。问题是课程只给框架,核心函数要自己填,填不出来后面的练习根本推不动。这份资源把无答案版、有答案版和个人笔记放在一起,本质上是“练习题库 + 标准答案 + 错题本”三件套。适合三类人:正在准备机器学习期末复习的在校生、跟完视频课但没动手写过代码的自学者,以及想快速判断哪些练习必须精做、哪些可以跳过的人。它不是科普文,是需要你打开终端配好环境、逐题跑通的实战材料。

2. 解压之前先配环境:Octave版本、安装命令与目录结构核对

下载回来的zip第一步不是急着解压,而是先确认手里的Octave版本。这套课程最早用Octave 3.x编写,但新学期的作业框架用到了一些更新的函数写法,4.x和6.x都能跑,5.x偶尔会出现绘图窗口兼容问题。我一般直接装Octave 6.4.0,因为它在Windows、macOS、Linux三端都有完整安装包,而且函数库与课程自带的submit.m脚本兼容性最好。安装之前不要跳过环境检查,否则后面每个练习都会因为找不到函数而浪费时间。

2.1 Octave还是MATLAB:选型理由与最小安装命令

这是个老生常谈的问题。Octave免费开源,语法和MATLAB高度兼容,课程代码拿过来直接跑;MATLAB需要付费授权,但调试器更成熟,变量查看更方便。对于只想完成作业并把机器学习基础打牢的人来说,Octave完全够用。唯一要注意的是,如果用MATLAB,某些脚本里的pkg load命令会报错,需要手动注释;而Octave对classdef这类面向对象语法支持不如MATLAB,但课程作业基本用不到。

最小安装命令按平台给:

# Windows:官网下载 octave-6.4.0-w64-installer.exe,安装时勾选 Add to PATH # Linux (Ubuntu/Debian) sudo apt-get update sudo apt-get install octave octave-dev # macOS(有 Homebrew) brew install octave # 装完验证 octave --version

逻辑说明:octave-dev这个包在Linux端很有必要,因为submit.m脚本会调用urlread和jsonencode等网络函数,缺了dev包可能编译不完全。octave --version输出带6.4.0字样说明PATH配置成功;如果提示找不到命令,Windows用户回到环境变量检查,macOS用户看/usr/local/bin是否在PATH里。装好之后进Octave命令行跑一句pwd,确认当前目录是你准备放作业的目录。

提示:Windows上如果安装到默认路径C:\Program Files\GNU Octave,记得把C:\Program Files\GNU Octave\Octave-6.4.0\mingw64\bin加进系统PATH,否则命令行里找不到octave-cli。这是最常见的环境翻车点。

2.2 解压后的目录结构:无答案、有答案、笔记怎么排布

拿到zip先别急着双击解压到桌面,我习惯在命令行里操作,方便后续路径管理:

unzip "吴恩达机器学习作业(无答案与有答案各一版)与个人笔记.zip" -d ~/ml-course cd ~/ml-course find . -maxdepth 2 -type d | sort

逻辑说明:-d指定解压目标目录,加引号是因为文件名含中文和括号,不引的话bash会拆词。find按目录深度列出两级结构,目的是先看清zip里有没有README或StartHere这样的入口文件。

常见解压结果大致是三块:

顶层目录内容使用时机
mc-exercise-no/无答案版,每个练习只给框架和数据第一遍动手写
mc-exercise-sol/有答案版,核心函数已填好卡住后对照、复盘
notes/个人笔记,通常是Markdown或PDF随时查阅,动工前先扫一遍

每个练习子目录的结构基本一致:ex1到ex8,里面有主脚本(比如ex1.m)、待补全的函数文件(computeCost.m、gradientDescent.m)、数据文件(ex1data1.txt、ex3data1.mat)以及提交脚本submit.m。如果你解压后看到某个ex目录里只有.m文件没有数据文件,先别慌——部分数据需要从练习说明页单独下载,每个ex子目录的README里会写明数据来源。

有答案版和无答案版的submit.m有个关键区别:有答案版通常已经改掉了提交URL或干脆去掉了网络请求,因为它不需要再往Coursera提交;无答案版里的submit.m会要求输入课程账号邮箱和密码。如果你只想本地验证答案对不对,就用有答案版的验证方式——跑主脚本看图和输出,不上传。

目录结构确认无误后,下一步是把整个目录加进Octave的搜索路径:

addpath(genpath('~/ml-course')); savepath;

这里genpath递归生成所有子目录的路径,addpath把它们加到Octave的搜索路径里,savepath把路径配置写进启动文件,下次打开Octave不用重新加。

2.3 从零到第一次跑通ex1:完整命令序列与验证

环境配好了,目录结构也清楚了,现在跑通第一个练习。ex1是最简单的,正好用来验证从解压到出结果的整条链路。

cd ~/ml-course/mc-exercise-no/ex1 data = load('ex1data1.txt'); % 两列:人口、利润 X = [ones(size(data, 1), 1), data(:, 1)]; y = data(:, 2); theta = zeros(2, 1); % 参数初始化为零 computeCost(X, y, theta) % 预期约 32.07

逻辑说明:load把文本数据读成矩阵,第一列是人口特征,第二列是利润标签。X手动加偏置列,theta必须是2x1列向量,如果初始化为行向量,后面X * theta维度就错了。computeCost在无答案版里是待补全的函数,如果你没写就运行,Octave会报未定义函数——这恰恰说明路径配置正常,问题出在函数本身。

验证通过后再跑梯度下降,确认代价在下降:

[theta, J_history] = gradientDescent(X, y, theta, 0.01, 1500); J_history(1:10) % 前10轮代价应该单调递减

参数说明:0.01是学习率,1500是迭代次数。如果J_history前几轮就在小数值量级,说明函数补对了;如果出现NaN,几乎可以断定是除零、log(0)或学习率过大,优先检查公式里的括号和分母。这次冒烟测试通过后,剩下的练习按同样的套路进入对应目录、加载数据、运行主脚本即可。

3. 八个练习逐个拆解:线性回归、逻辑回归、神经网络到异常检测的实现主线

作业的8个练习不是平铺的,难度阶梯式上升。前两个练习把机器学习核心要素——假设函数、代价函数、梯度下降——完整走了一遍;中间两个从封装好的逻辑回归跳到手写神经网络反向传播,最容易劝退;后四个每个引入新技术点,但代码量和思考深度反而不如ex4。这一章的展开方式就是按这个阶梯来,每个练习段位讲清楚实现要点和参数敏感点。

3.1 ex1-ex2:线性回归与逻辑回归,向量化是这阶段最重要的手感

ex1做的是单变量和多变量线性回归,数据是ex1data1.txt(人口-利润)和ex1data2.txt(面积-房间数-房价)。核心任务是实现computeCost.m和gradientDescent.m。这个练习的隐藏考点是向量化:用矩阵乘法替代循环,代码量直接少一半。我在实际跑这个练习时,一开始用for循环累加代价,能跑但很慢,改成矩阵写法后速度提升明显,也更好调试。

% computeCost.m - 线性回归代价函数,向量化写法 function J = computeCost(X, y, theta) m = length(y); h = X * theta; % 预测值,m x 1 diff = h - y; % 误差向量 J = (1 / (2 * m)) * (diff' * diff); % 转置乘自己 = 平方和 end

逻辑说明:X是设计矩阵,第一列全1对应偏置项,第二列起是特征;theta是参数向量(n+1 x 1)。X * theta一次算出所有样本的预测值,diff' * diff等价于sum(diff .^ 2),但矩阵乘法在Octave里走优化过的BLAS库,比循环快一个量级。1/(2*m)是MSE的一半,目的是让梯度下降求导后系数干净。

参数说明:梯度下降里alpha学习率建议取0.01、0.03、0.1三个档位对比。作业给了alpha=0.01默认值,如果发现代价震荡,降到0.001;如果下降太慢,用0.3。另外,多变量线性回归必须先做特征缩放——每个特征减均值除标准差,否则梯度下降在高维空间里会走之字形,收敛慢到怀疑人生。

ex2切到逻辑回归,数据是两门考试分数加录取结果。任务变成实现sigmoid、costFunction和predict:

% sigmoid.m - 逻辑回归的核心激活函数 function g = sigmoid(z) g = 1 ./ (1 + exp(-z)); % 逐元素运算,z可以是标量、向量或矩阵 end % costFunction.m - 逻辑回归代价与梯度 function [J, grad] = costFunction(theta, X, y) m = length(y); h = sigmoid(X * theta); J = -(1/m) * (y' * log(h) + (1 - y)' * log(1 - h)); grad = (1/m) * (X' * (h - y)); end

逻辑说明:逻辑回归输出是概率,代价函数用对数似然,所以J的公式里log(h)不能换成h。grad表达式和线性回归梯度长得一模一样,原因是对数似然对sigmoid求导后,残差项h - y恰好和线性回归形式一致,这是概率分布推导的结果,不是巧合。写作业时最容易犯的错是sigmoid里用/而不是./,导致向量传进去时维度崩掉。

参数说明:决策边界是theta' * x = 0这条线。ex2第二个任务是用fminunc优化器替代手动梯度下降,调用时options = optimset('GradObj', 'on', 'MaxIter', 400),fminunc(@costFunction, initial_theta, options)。这里initial_theta必须初始化为零向量,否则优化器可能在局部极小附近打转。

3.2 ex3-ex4:多分类与神经网络,反向传播是整份作业最大的坎

ex3做手写数字识别,数据集是5000个20x20像素的图像。第一阶段用one-vs-all逻辑回归,训练10个二元分类器,每个判断是不是数字k,预测时取10个分类器输出概率最大的那个。第二阶段用课程给的前馈神经网络做分类,权重已经训练好,只需要实现预测。这段代码让我第一次感受到“矩阵化处理所有样本”的优雅:

% predictOneVsAll.m function p = predictOneVsAll(all_theta, X) m = size(X, 1); X = [ones(m, 1) X]; % 加偏置列 scores = sigmoid(X * all_theta'); % m x 10,每列是一个分类器的概率 [~, p] = max(scores, [], 2); % 按行找最大概率的下标 end

逻辑说明:all_theta是10x401的矩阵,每行一个分类器的权重。X * all_theta'把m个样本与10个权重矩阵一次性算完,得到m x 10的概率矩阵。max的第二输出是索引,直接对应数字类别。~占位符接收最大值本身,只留索引,这是Octave里常用的取舍写法。

ex4才是把很多人劝退的练习:要求实现神经网络前向传播和反向传播。前向传播容易,每一层算a = sigmoid(Theta * a);反向传播需要理解链式法则在每一层的作用。作业里还留了一个debugInitializeWeights函数,用数值梯度检查验证反向传播正确性。反向传播的核心片段如下:

% nnCostFunction.m 内的反向传播核心 Delta1 = zeros(size(Theta1)); Delta2 = zeros(size(Theta2)); for t = 1:m a1 = [1; X(t, :)']; z2 = Theta1 * a1; a2 = [1; sigmoid(z2)]; z3 = Theta2 * a2; a3 = sigmoid(z3); y_vec = (1:num_labels)' == y(t); % 标签转 one-hot 向量 d3 = a3 - y_vec; d2 = (Theta2' * d3) .* [1; sigmoidGradient(z2)]; d2 = d2(2:end); % 去掉偏置单元误差 Delta2 = Delta2 + d3 * a2'; Delta1 = Delta1 + d2 * a1'; end Theta1_grad = Delta1 / m; Theta2_grad = Delta2 / m;

y_vec的构造是关键,(1:num_labels)' == y(t)生成一个只有第y(t)位为1的列向量,这样输出层误差向量d3和真实标签的one-hot编码对齐。d2(2:end)把偏置单元的误差丢掉,因为偏置项不参与正则化。所有累加结束后除以样本数m得到平均梯度。

参数说明:lambda正则化系数在ex4中取1.0。数值梯度检查时epsilon = 1e-4,如果反向传播实现正确,数值梯度与解析梯度的相对误差应小于1e-9。训练阶段把MaxIter设为50,用fmincg而非fminunc,因为fmincg内存占用更低,对大规模参数更友好。

3.3 ex5-ex8:正则化、SVM、聚类与异常检测,每个练习一个新招

ex5看起来是“回到线性回归”,但主角不是回归本身,而是偏差/方差诊断。任务是把数据集分成训练集、验证集、测试集,画学习曲线——横轴是训练样本数,纵轴是误差。如果训练误差和验证误差都很高且几乎重合,这是高偏差欠拟合,解决办法是加特征;如果训练误差接近0而验证误差很高,这是高方差过拟合,解决办法是加数据或加正则化。这部分不写复杂代码,但要对学习曲线的形状有直觉。

ex6切到SVM,作业提供了svmTrain.m封装,只需要调参数并理解决策边界如何随C变化。C越大对误分类惩罚越重,边界越窄;C越小边界越宽,方差越小。高斯核函数里sigma控制相似度衰减速度。这部分代码量不大,但要在plot图上肉眼判断欠拟合与过拟合,是典型的“会调参比会写代码更重要”的练习。

ex7做了两件事:K-means聚类和PCA。K-means核心是交替执行“分配中心”和“更新中心”;PCA部分需要实现特征值分解:

% pca.m - 主成分分析 function [U, S, V] = pca(X) [m, n] = size(X); Sigma = (1 / m) * (X' * X); [U, S, V] = svd(Sigma); % U 的列是主成分方向 end

逻辑说明:PCA不是直接对原始数据做分解,而是先对数据做均值标准化,再对协方差矩阵Sigma做SVD。U的前k列就是数据方差最大的k个方向,S的对角元是方差占比。作业里用人脸数据集做主成分可视化,要求把前100个主成分画出来,视觉冲击力很强,会直观地理解“降维”在做什么。

ex8分两部分:异常检测和推荐系统。异常检测是在无标签数据上拟合多元高斯分布,根据p(x)是否小于阈值epsilon判定异常;推荐系统用协同过滤,代价函数里同时优化用户参数和物品参数。ex8的代码量不大,但checkCostFunction脚本会对比解析梯度和数值梯度,帮你抓出公式里转置写错的问题。这个练习做完,整套作业的主线就完整了。

4. 有答案版和无答案版怎么搭配:不抄题、看得懂、能复盘的三步走

标题里的“无答案与有答案各一版”是这份资源最值钱的地方。如果只看无答案版,卡住时没有对照;如果只看有答案版,等于买了标准答案直接抄。真正的用法是把它们当成考试卷和标准答案,用一套明确的节奏交替推进。这套节奏的核心是:第一遍裸写,第二遍对照,第三遍重写。每一步都有对应的产出物,而不是“看懂了”就算完。

4.1 先无答案后看答案:一个可复现的作业节奏

我自己的节奏是三遍法,每遍对应不同的学习目标:

第一遍裸写。打开无答案版的某个ex*.m,只看函数签名和注释,不看有答案版。卡住超过两小时,允许偷看一眼答案的对应行,然后关上答案继续写。这一遍的目标是暴露盲点——哪一步是公式不熟,哪一步是Octave语法不会,哪一步是数据维度想不明白。

第二遍对照。第一遍写完后,把有答案版的实现和自己的代码并排打开,用diff命令快速对比:

diff -u ~/ml-course/mc-exercise-no/ex1/computeCost.m \ ~/ml-course/mc-exercise-sol/ex1/computeCost.m

逻辑说明:diff逐行标出两版的不同,-u参数输出带上下文的补丁格式,方便看差异点位置。如果差异集中在变量命名和注释,那是风格问题;如果差异出现在核心公式里,说明第一遍裸写有理解偏差,这一题要标记为需要重写。

第三遍重写。关掉有答案版,把刚才那题从头写一遍。如果第二遍没有差异,直接跳到下一个练习;如果有差异,重写后的代码应该能和自己第一遍的代码形成对比——你会发现重写版更短、更少循环,向量化的手感就是这么练出来的。

这套节奏的前提是有答案版不能“剧透”第一遍的进展。所以zip解压后,我建议把两个版本放不同目录,在工作目录里建一个软链只指向无答案版:

ln -s ~/ml-course/mc-exercise-no ~/ml-work cd ~/ml-work

这样每次打开终端进入的是“考试模式”;只有当明确要对照答案时,才用绝对路径访问有答案版目录。

4.2 从有答案版里能抄走的三种写法:不只是把题做对

有答案版的价值不在“能跑”,而在它的写法透露了原作者的工程习惯。以下三种写法是我看完答案后主动迁移到自己的代码里的:

第一种,用向量化替代显式循环。答案里几乎找不到for i = 1:m累加代价的写法,全是X' * (h - y)这种一行完成累加和乘积的矩阵表达式。迁移到日常工作里,处理时间序列或批量数据时,同样的逻辑用NumPy或Octave矩阵运算,跑批速度快几十倍。

第二种,用max取索引而不是用find。ex3里预测数字类别,答案用的是[~, p] = max(scores, [], 2);初学者常写成for i=1:m, p(i)=find(scores(i,:)==max(scores(i,:))); end。前者一行解决,后者三层嵌套。Octave里max的第二输出直接给索引,这是个很省事的API细节。

第三种,把数据形状检查写进自己的调试脚本。有答案版的主脚本里经常有size(X)、size(y)、size(theta)的打印语句,看起来是调试残留,其实是刻意留下的人肉断言。我后来在每个数据处理脚本的开头都会加一行disp(size(data)),几十秒的打印换来一整天不跟shape错误纠缠。

提示:抄答案的姿势很重要。不要只把computeCost.m复制粘贴到无答案版目录就完事。把答案看懂后,手工默写一遍到自己的文件里,哪怕默写出来的代码和答案一模一样,从理解到写出的这个过程本身才是学习发生的地方。

4.3 做一个“半答案版”:把答案藏起来,给自己留提示

有答案版适合对照,但直接看完整答案会跳过思考。我一般会再做一个半答案版:把答案文件复制一份,用sed把核心公式行隐藏,只保留函数签名、数据加载和绘图部分。这样第二遍重写时,能看到的提示是“这个函数接收什么、返回什么、数据形状是什么样的”,但关键的矩阵运算必须自己补。

cp ~/ml-course/mc-exercise-sol/ex1/computeCost.m ~/ml-work/half-sol/computeCost.m sed -i 's/^h = X \* theta;/% h = X * theta; % 已隐藏,请自行补全/' ~/ml-work/half-sol/computeCost.m

逻辑说明:cp复制答案文件到工作目录,sed -i直接在文件内替换。s/.../.../把匹配到的那一行注释掉。如果这个函数里有多处关键行,可以叠加多条sed -e。这里隐藏的h = X * theta是预测值那一步,隐藏后函数无法运行,但你仍然能读到函数签名和上一行的注释,知道这一步该做什么。

参数说明:-i在Linux和macOS是原地修改,Windows的Git Bash也兼容。先复制整个目录再操作,原始答案仍然完好。这种半答案版的妙处在于:第二遍重写时不会因为完全空白卡住,也不会因为答案完整而直接抄——你处于一个必须有产出才能跑的中间状态,正好符合刻意练习的难度区间。

5. 作业避坑:环境、数据与答案错位的常见翻车现场

资源包做到这一步,剩下的是实战里的坑。这些坑不会写在教程里,但几乎每个做过这套作业的人都会踩一遍。按现象、原因、解决的顺序记录,方便遇到问题时直接检索定位。我按三类归纳:环境与路径坑、数据与维度坑、答案版本错位坑。

5.1 环境与路径坑:函数找不到、submitting提不了交

现象1:进入ex1目录,运行submit(),提示Undefined function or variable 'submitWithConfiguration'。

原因:submit.m脚本依赖同级目录下的submitWithConfiguration.m,而这个文件不在当前Octave的搜索路径里。很多zip解压工具会保留完整目录树,但你有答案版和无答案版各自带一套submit脚本,路径配置互相覆盖,部分依赖文件就丢了。

解决:确认当前目录与依赖文件在同一层,然后把整个课程目录加进路径:

cd ~/ml-course/mc-exercise-no addpath(genpath('.'));

如果还报错,用which submitWithConfiguration看Octave能不能找到这个函数,找不到就从有答案版的对应目录复制一份过来。这是作业翻车里最常见的一种,不是代码问题,是文件路径问题。

现象2:Windows上用WinRAR解压zip后,双击.m文件用记事本打开是乱码。

原因:.m文件编码是UTF-8,记事本默认按ANSI打开,中文注释全部乱码。

解决:用VS Code或Notepad++打开,强制指定UTF-8编码。macOS终端默认UTF-8没有此问题。

现象3:运行主脚本时Octave弹出绘图窗口直接闪退。

原因:Octave 5.x和6.x在Windows上如果显示驱动兼容有问题,plot函数会触发崩溃;旧版本显卡驱动对OpenGL支持不全也会这样。

解决:换用gnuplot后端,在脚本开头加graphics_toolkit('gnuplot'),或者装Octave 7.x/8.x。这个坑在程序设计上不常见,但作业里plot用得很多,提前预防能省很多时间。

5.2 数据与维度坑:偏置项、转置、shape mismatch

现象1:报错error: nonconformant arguments (op1 is 97x1, op2 is 97x2)。

原因:设计矩阵X没有加偏置列——线性回归和逻辑回归都要在特征矩阵最前面加一列1,用来吸收偏置项theta0。作业框架给的数据文件往往已经分好了X和y,但忘记加ones(m,1)的坑几乎每个练习都会遇到。

解决:加载数据后立即检查维度并拼接:

X = [ones(m, 1), data(:, 1)];

参数说明:data(:, 1)取第一列特征,ones(m, 1)生成m行1列的全1列,用逗号拼接。拼接顺序不能反,[ones(m,1), X]和[X, ones(m,1)]对应公式里的参数顺序不同,代价函数公式的写法也要对应调整。

现象2:error: operator *: nonconformant arguments发生在sigmoid(X * theta)。

原因:theta是列向量,X是m x n矩阵,X * theta要求theta行数等于X列数。如果theta初始化为行向量(zeros(1, n+1)),乘出来的结果就是空矩阵或维度错误。

解决:初始化参数时强制指定形态:

theta = zeros(n + 1, 1);

这里的n是特征数,n+1是加偏置后的参数总数,用size(theta)确认。

现象3:数据文件缺失或损坏,加载后变量全空。

原因:zip解压时某个.mat文件因为路径太深或杀毒软件隔离被跳过。failed to copy spatial iop zip这类报错虽然来自数据库场景,但思路一致:zip里文件在复制或解压过程中被污染时,程序会在加载阶段静默失败或抛出IO异常。

解决:解压前用unzip -t测试压缩包完整性,看到OK再解压;解压后核实关键数据文件的存在性,缺了就从有答案版目录补齐。

5.3 答案版本错位坑:无答案版和有答案版对不上

现象1:在无答案版的ex2里写了sigmoid.m,跑到有答案版的ex2时发现对方的sigmoid.m多了一个g = max(g, 0)操作,两种实现结果不一致。

原因:课程在不同学期更新过作业,答案版的某个函数可能用了数值稳定写法(比如sigmoid加max防止溢出),无答案版保留的是旧版接口。

解决:不要混用两版的单个文件。用哪个版本就完整用哪个版本的整套exN目录,跨目录复制函数文件时特别注意函数签名是否变化。最保险的验证方式是跑主脚本后对比两个版本的代价函数数值输出。

现象2:有答案版的ex4主脚本运行到一半报错attempt to index field 'params' of nil。

原因:ex4主脚本在调用nnCostFunction之前必须先执行load('ex4weights.mat')加载预训练权重。如果你直接从无答案版目录跳过来跑,ex4weights.mat不在当前目录,主脚本里取参数就取不到数据。

解决:回到有答案版目录,确认ex4weights.mat和ex4data1.mat都在,再运行主脚本;或者用ls查看当前目录文件清单,缺哪个从数据目录拷贝。

现象3:跑submit()时输入的邮箱密码正确,但返回403 forbidden。

原因:课程早已停止接受新提交,submit.m脚本里的提交服务器域名失效。

解决:不要纠结线上提交。评分逻辑在本地也能跑——Octave工作区里执行submitWithConfiguration('local')可以走本地grader,或者直接跑主脚本对比课程给出的预期输出。近年做这套作业的人几乎都会遇到这个坑,别把时间耗在等服务器响应上。

6. 把作业价值榨干的验证方法:自检清单与笔记记录法

作业做完不等于掌握。我习惯用一张验收清单核对每个练习的完成度,再配合一套两栏笔记方法把“当时怎么想”固化下来。

练习核心函数验收动作
ex1computeCost, gradientDescent代价函数输出与参考值对比,误差小于1e-5
ex2sigmoid, costFunction, predict决策边界正确分类,准确率超过80%
ex3oneVsAll, predictOneVsAll训练集准确率超过95%
ex4nnCostFunction数值梯度检查相对误差小于1e-9
ex5learningCurve学习曲线呈现欠拟合或过拟合典型形状
ex6gaussianKernel, dataset3ParamsSVM交叉验证准确率超过95%
ex7findClosestCentroids, pcaK-means收敛,PCA重构图像清晰可辨
ex8estimateGaussian, selectThreshold异常检测F1分数超过0.6

笔记法:个人笔记不应该是答案的搬运工。我在Markdown里开两个栏目——左栏写“这个练习的核心公式”,右栏写“我当时踩的坑和怎么跳出来的”。每做完一个练习,右栏至少要有三条记录。这样复习时扫一眼右栏就能回想当时的思维过程,期末考前不需要重新翻代码找感觉。和西瓜书这类理论教材对照时,左栏公式正好对应书里的章节,右栏的坑又能提醒你哪些地方书里没写但实践会踩。

这套资源包的使用,关键在于坚持“先动手、再对照”的顺序。我自己第一次做ex4时图省事,直接抄了答案跑通,后来面试被问反向传播时完全答不上来。改成三遍法后每个练习至少写两遍,反而是把梯度推导顺手记住了。希望这些步骤和踩坑记录能帮你把这套作业真正吃透,祝顺利。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询