机器学习第一课P1-P41:Jupyter Notebook完整代码实现与梯度下降实战
2026/9/8 10:44:58 网站建设 项目流程

简介:吴恩达机器学习课程配套Jupyter代码包,对应第一课P1-41内容,聚焦监督学习、回归与分类基础,是初学者从零上手机器学习的合适入门资料。压缩包为RAR格式,共371个文件,包含117张png图像、104个ipynb笔记本、47个txt文本、37个py脚本、37个ppt/pptx课件、13个md说明和12个mplstyle样式文件等,整体大小83.12MB,目录按章节组织便于定位。内容覆盖特征缩放与学习率、多项式回归、逻辑回归、一对多分类、过拟合等关键实验;每个Notebook既有理论解释,又有可运行代码示例和练习题,部分章节还提供带解答的Soln版本供核对,适合边看边动手。已有732人浏览/学习,可按吴恩达教学节奏逐行运行代码,观察输出变化以巩固理解,也可结合作者已整理的学习笔记对照复习,让机器学习入门更系统、更扎实,全面提升实践能力。

1. 项目概述:这套“第一课 P1-P41”代码要解决什么

1.1 课程背景与代码定位

先说结论:如果你正在跟吴恩达的 Machine Learning 课程,第一课 P1 到 P41 这段内容,基本覆盖了机器学习最核心的“地基”——监督学习、线性回归、逻辑回归、梯度下降、正则化,以及初级的神经网络概念。很多人卡在这里,不是因为听不懂视频,而是因为课上讲的公式,到了自己动手敲代码时,完全不知道从哪行开始写。

我整理这套 Jupyter 代码的初衷很直接:把 P1-P41 对应的知识点,全部落成可以在浏览器里逐格运行的 Notebook。Notebook 里不只放答案,还会按照视频讲解的顺序,把“概念说明 + 公式推导 + 代码实现 + 可视化”放在同一个文件里。你跟着视频看完 P7 讲梯度下降,回到 Notebook 里就能直接跑一组二维参数的迭代更新,看到损失函数一点点降下来,比自己干等视频里的动画要直观得多。

这套代码适合三类人:一是刚接触机器学习、想把数学公式转成 Python 代码的初学者;二是已经在做数据分析、但没系统过一遍机器学习基础、想快速补课的人;三是准备刷吴恩达作业、但被环境问题搞得头大、想要一份“跑通即可用”的参考实现的同学。

1.2 为什么用 Jupyter Notebook 而不是纯 Python 脚本

我见过很多新手喜欢把代码全部写在一个.py文件里,跑完再看输出。对于这种课程学习场景,这是效率最低的方式,没有之一。

原因在于:机器学习的代码是“分阶段”的。你要先看数据长什么样,再做特征缩放,然后训练参数,最后画图评估。每一步的输出都会影响下一步的写法。如果全塞进脚本里,每次改一点都要从头跑一遍,浪费时间不说,中间数据的形状对不对、数值范围是否合理,全被糊过去了。

Jupyter Notebook 的天然优势是按“单元格”执行。比如我在整理线性回归部分时,第一个单元格只负责加载数据和画出散点图,第二个单元格才写损失函数,第三个单元格再写梯度下降。哪个单元格结果不对劲,就只改那个单元格,再往下跑。这个过程就像你在实验室里做实验,每一步都能停下来观察,而不是一口气把试剂全倒进烧杯。

另外,吴恩达课程里大量涉及公式推导和结果对比。Notebook 支持 Markdown 单元格,我可以在每个代码块上面写清楚“这一步在干什么、对应视频的哪一分哪一秒、为什么这么做”,这种做法在纯脚本里是做不到的。

2. 环境准备:从零搭好 Jupyter 运行环境

2.1 安装 Python 和 Jupyter Notebook 的三种常见方式

很多人在装 Jupyter 这一步就劝退了。其实没那么复杂,选一条适合自己的路就行。我按推荐程度排个序:

安装方式适合人群上手难度优点缺点
Anaconda 全家桶纯新手 / 课程学习自带 Python、Jupyter、numpy、pandas、matplotlib,开箱即用体积大,环境多了容易乱
原生 Python + pip已有 Python 基础干净、可控,内存占用小所有依赖都要自己逐个装
PyCharm 内置 Jupyter习惯用 IDE 写代码的人像写普通 Python 一样写 Notebook,调试方便对新手来说界面有点重

如果你今天就要开始学,就别纠结了,直接装 Anaconda。吴恩达课程里的代码用到的库也就是 numpy、matplotlib、scipy、scikit-learn 这些,Anaconda 装完就已经全带了。我自己早期踩过“漏装 scipy”的坑,后来换到 Anaconda 再没遇过这种破事。

2.2 conda 创建独立环境并启动网页版 Jupyter

先解释一下为什么我要单独建环境。吴恩达课程是老课程了,原版作业代码是 Python 2 时代的写法,现在你电脑里的 Python 大概率是 3.10 或更高版本。如果你直接把作业代码拿过来跑,光是print语法和map函数的返回值就能报一堆错。所以我习惯用 conda 建一个独立的 Python 3.8 环境,专门跑这套课程代码。

打开终端(Windows 用 Anaconda Prompt),依次执行:

conda create -n mlcourse python=3.8 -y conda activate mlcourse conda install numpy matplotlib scipy scikit-learn jupyter -y

等它装完,在同一个终端里运行:

jupyter notebook

终端会打印一串网址,浏览器会自动打开网页版 Jupyter。如果你用的是一台云服务器或者远程开发环境,想从本地浏览器访问,需要加参数:

jupyter notebook --ip=0.0.0.0 --port=8888

然后本地浏览器访问http://服务器IP:8888,输入终端里生成的 token 就能进去了。这招在租云服务器跑实验时特别常用。

2.3 PyCharm 里集成 Jupyter 的配置要点

如果你跟我一样,平时主力 IDE 是 PyCharm,那也可以直接在 PyCharm 里面跑 Notebook,不用来回切浏览器。

新建一个.ipynb文件后,PyCharm 会提示你选择 Jupyter 服务器。这里有三种方式:

  • 本地默认:直接选默认的 localhost,PyCharm 会自动启动一个 Jupyter Notebook 服务。
  • 已启动的服务:如果你在终端里已经跑过jupyter notebook,就在配置里填http://localhost:8888加上 token。
  • conda 环境:在 PyCharm 的 Settings 里把 Project Interpreter 切换成刚才建好的mlcourse环境,这样运行单元格时用的解释器就是带齐依赖的那个环境了。

实际操作中我遇到最多的问题是:PyCharm 里单单元格跑出来的变量,在下一个单元格里找不到,提示NameError: name 'X' is not defined。这通常是因为单元格没有按顺序执行,或者 PyCharm 的 kernel 被重启了。解决办法很简单:从第一个单元格开始,按Shift + Enter一路往下跑,不要用“Run All”跳到中间某个位置。

3. 代码结构与核心章节实操

3.1 第一课 P1-P41 的代码逻辑主线

吴恩达的 Machine Learning 第一课 P1-P41,按我自己的理解,可以切四段:

第一段是机器学习绪论和单变量线性回归。重点是搞清楚什么叫训练集、假设函数 h(x)、代价函数 J(θ),以及最核心的梯度下降。我在 Notebook 里用了一组虚构的面积-房价数据,把 θ0 和 θ1 的搜索过程画成了三维曲面图。你转动视角看损失曲面上那个点一路滑到谷底,这个画面比任何公式都让人难忘。

第二段是多变量线性回归和正规方程。这里要特别重视特征缩放,我故意先用未缩放的数据跑了一次梯度下降,损失曲线收敛得很慢;再用标准化后的数据跑一次,收敛速度肉眼可见地提升。两个结果并排放在同一个 Notebook 里对比,你立刻就明白为什么要做 feature scaling 了。

第三段是逻辑回归和正则化。很多人第一次学到这里会晕:明明是分类问题,为什么函数名里还带回归?我在这部分的 Notebook 里画了决策边界,把线性回归和逻辑回归的代价函数放在一起对比,这样你就能看出来,逻辑回归其实就是在线性回归外面套了一层 sigmoid 函数,本质还是回归的思路。

第四段是神经网络入门。P41 差不多讲到神经网络的第一部分,我补了一个用 numpy 手写的前向传播小例子,输入层 2 个节点、隐藏层 3 个节点、输出层 1 个节点,权重随机初始化。虽然代码很简单,但当你看清楚矩阵维度是(3,2)(1,3)这样一层层传下去的时候,后面再看深度学习框架里的 Dense 层,就完全不会觉得神秘了。

3.2 线性回归与梯度下降的 Jupyter 实现细节

以单变量线性回归为例,核心代码就这么几行,但每行都值得细讲:

import numpy as np import matplotlib.pyplot as plt def compute_cost(X, y, theta): m = len(y) predictions = X @ theta cost = (1 / (2 * m)) * np.sum((predictions - y) ** 2) return cost def gradient_descent(X, y, theta, alpha, iterations): m = len(y) cost_history = [] for _ in range(iterations): gradient = (1 / m) * (X.T @ (X @ theta - y)) theta = theta - alpha * gradient cost_history.append(compute_cost(X, y, theta)) return theta, cost_history

这里有两个点是我反复跟初学者强调的。

第一,X的第一列要插一列全 1,对应 θ0 这个偏置项。很多人照着视频抄公式,写到代码里就忘了这个“虚拟列”,结果矩阵乘积的维度对不上,直接报错。我在 Notebook 里特意加了个单元格,打印X.shape,让读者亲眼看到矩阵维度是(97, 2)而不是(97, 1)

第二,学习率alpha的选择是个玄学,但也可以用代码来调。我写了段循环,分别用alpha = 0.001, 0.01, 0.1各跑 1000 次迭代,把三条损失曲线画在同一张图上。曲线像瀑布一样往下掉的那条,就是合适的 alpha;如果损失曲线变成了往上飞的对号,那就是学习率太大,发散了。这种可视化的调参思路,会伴随你整个机器学习生涯。

3.3 练习题作业:Coursera 编程作业与 Notebook 模板对照

整理这套代码时,我用户目标是把它和吴恩达在 Coursera 上的编程作业对接起来。第一课对应的编程作业是 ex1 线性回归和 ex2 逻辑回归。官方作业本来是一堆.m后缀的 Octave 脚本,国内大多数学习者会把它改成 Python 版。我参考了作业里的ex1.mex1_multi.m这些文件结构,把其中“填空”的部分保留成# START CODE HERE# END CODE HERE,再在旁边给出参考实现,方便你对照检查。

举个例子,ex1 里有一个填空是计算代价函数,我在 Notebook 里的写法是这样的:

def warmUpExercise(): return np.identity(5) def computeCost(X, y, theta): # START CODE HERE m = len(y) h = X @ theta J = (1 / (2 * m)) * np.sum((h - y) ** 2) # END CODE HERE return J

你可以在自己的 Notebook 里先不看答案,照着作业描述自己写一遍,跑出来的 J 值如果能跟官方给出的参考值对上,说明你理解对了。一遍不对就对照我的实现看看差在哪,这种“先思考再验证”的方式,比直接把答案复制上去有用得多。

4. 常见问题与排查实录

4.1 Jupyter Notebook 打不开 / 运行代码报错

这是新手问得最多的一类问题。症状大多是:终端里输入jupyter notebook之后,浏览器没反应,或者在网页里点某个.ipynb文件,一直在转圈。

按我的排查顺序来,基本都能解决:

  1. 看终端有没有报错信息。如果提示'jupyter' 不是内部或外部命令,说明 Jupyter 没装好,用pip install jupyterconda install jupyter重装一遍。
  2. 确认端口是否被占用。运行jupyter notebook --port=9999换一个端口试试。我之前遇到过 VS Code 的 notebook 和浏览器抢 8888 端口的情况,换个端口立刻就好了。
  3. 如果是打不开.ipynb文件,检查文件路径里有没有中文和空格。Jupyter 对中文路径支持不好,最好把整个课程文件夹放到纯英文路径下,比如D:\CourseraML\

4.2 subprocess-exited-with-error 这类环境问题怎么破

热词里专门提到jupyter notebook error: subprocess-exited-with-error,我遇到过很多次,大多数场景是用户用 pip 安装某些包时,编译过程出了错。比如装scikit-learn需要编译 C 扩展,Windows 上没装 Microsoft C++ Build Tools,就会报这个。

解决思路分三步:

先看报错日志的最后几行。如果是error: Microsoft Visual C++ 14.0 or greater is required,那直接去微软官网装 Visual Studio Build Tools,勾选 C++ 桌面开发组件,装完重试。如果不想装这么重的组件,换用 conda 安装,因为 conda 的包是预编译好的,不需要本地编译:

conda install scikit-learn -c conda-forge

如果 conda 安装也报错,大概率是 conda 源的问题。换清华镜像源,再把.condarc配置文件里的默认源替换掉。这一步做完,绝大多数包都能顺利装上。

4.3 Matplotlib 中文乱码、numpy 版本差异等学习期高频坑

这一节分享几个我实际初始化环境时踩过的坑,都是官网文档不会写但网上天天有人问的。

第一个坑是 Matplotlib 画图时中文变方框。原因是默认字体不支持中文。我一般直接在 Notebook 最前面加一段全局配置:

import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False

Windows 上用 SimHei,macOS 上用'Arial Unicode MS',Linux 上需要先安装中文字体。如果你不想折腾字体,更稳妥的办法是图里全部用英文标签,比如x label: size而不是“面积”。英文标签永远不会乱码,学习阶段没必要跟自己过不去。

第二个坑是 numpy 版本差异。吴恩达课程里有一行代码是X = np.matrix(X),但新版本 numpy 对matrix类的支持越来越边缘化,很多操作如A * B在 matrix 和 ndarray 里的含义完全不同。我在整理代码时统一改成了ndarray写法,用@做矩阵乘法,用*做逐元素乘法。你如果拿到的是网上流传的旧代码,看到np.matrix就手动改成np.array,然后注意乘法符号,基本不会有问题。

第三个坑是画图弹不出窗口。在 Jupyter 里用plt.show()有时候没有反应,这不一定是代码错了,而是没开启内联显示。在 Notebook 开头加一句魔法命令:

%matplotlib inline

加了之后,图片会直接嵌在单元格下方,方便截图和存档。如果你在 PyCharm 里用 Jupyter,需要在设置里把 Plotting 工具窗口打开,或者仍然使用%matplotlib inline

我实际跑完这一整套 P1-P41 的 Notebook,最大的感触是:机器学习入门拼的不是智力,而是有没有一个“代码能跑起来、随时能验证想法”的环境。环境通了,后面的路就顺了一大半。如果你手里有一套现成的 P1-P41 笔记或代码,别只当收藏夹吃灰,按我上面说的方法,一边看视频一边在 Jupyter 里跑通每个单元格,再顺手把每一个数学公式都对照代码“翻译”一遍。等这 41 个 Notebook 全部跑完,你对线性回归、逻辑回归、神经网络这些底层概念的理解,就已经超过大多数只刷视频不写代码的学习者了。

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

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

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

立即咨询