ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

[万字博客]机器学习:梯度下降算法(Gradient Descent)与Jupyter的安装、实战[保姆级教程:从安装Acaconda开始手把手教学]

[万字博客]机器学习:梯度下降算法(Gradient Descent)与Jupyter的安装、实战[保姆级教程:从安装Acaconda开始手把手教学] 目录如下1. 问题引入一个蒙着眼下山的人2. 梯度下降的相关概念Review2.1 步长Learning rate2.2 特征Feature2.3 假设函数Hypothesis Function2.4 损失函数Loss Function3. 梯度下降与代价函数结合一元线性回归4. ※很重要求解损失函数的导数5. 梯度下降法的推导流程5.1先决条件确认优化模型的假设函数和损失函数5.2算法相关参数初始化5.3算法过程6. 计算损失函数7. 梯度下降法三兄弟BGD/SGD/MGD7.1 全梯度下降法Full Gradient DescentFG/批量梯度下降 BGD7.2 随机梯度下降法Stochastic Gradient DescentSGD7.3 小批量梯度下降法Mini-batch Gradient DescentMGD7.4 怎么选batch_size7.5 三兄弟对比表7.6 别忘了学习率8. 案例讲解学生成绩预测附录有上机实战从安装Acaconda开始手把手教学8.1 案例背景8.2 数据8.3 步骤分析8.4 数据导入8.5 模型训练和预测9. 总结附录Jupyter的安装与第一个项目实战Anaconda版附1. 选择Anaconda的理由附2. Anaconda与jupyter安装步骤附3. 第一个项目跑通学生成绩预测附4. 跑通验收标准附5. 常见坑速查表Anaconda版1. 问题引入一个蒙着眼下山的人设想一个场景大雾天你被蒙住眼睛站在一座山的半山腰。你的目标是走到山谷最低点——当然你看不见整个山势也看不清谷底在哪里。你能怎么办你只能靠脚下的感觉感受一下脚下哪个方向是下坡然后朝那个方向迈一步到了新位置再感受一下再迈一步……就这么一步、一步地往下走。虽然你全程都看不见全局但只要每一步都在往下走你最终就能到达谷底。这个朴素的想法就是梯度下降Gradient Descent的核心思想。把场景映射到机器学习里下山场景机器学习你的位置模型参数theta山的海拔损失函数Loss Function下坡的方向梯度的负方向最陡下降方向每步迈的步子大小学习率Learning Rate/步长山谷最低点损失函数最小值处最优参数机器学习里的训练模型本质上就是在不断调整参数让损失函数越来越小——和蒙眼下山是同一件事。2. 梯度下降的相关概念Review在正式推导之前先复习四个基础概念。2.1 步长Learning rate步长决定了在梯度下降迭代的过程中每一步沿梯度负方向前进的长度。用下山的例子步长就是你当前这一步沿着最陡峭、最易下山的位置走的那一步的长度。步长太小→走得很慢半天到不了谷底步长太大→一步跨过头可能在山谷两边来回弹跳甚至越走越高发散。2.2 特征Feature特征指的是样本的输入部分。比如有两个单特征样本则第一个样本特征记为第一个样本输出记为即数据集为推广到一般情况其中是样本个数。2.3 假设函数Hypothesis Function在监督学习中为了拟合输入样本而使用的函数记为。比如对于单特征的样本可以采用如下拟合函数其中、就是我们要学习的模型参数。2.4 损失函数Loss Function为了评估模型拟合的好坏我们用损失函数来度量拟合的程度。损失函数极小化意味着拟合程度最好对应的模型参数即为最优参数。在线性回归中损失函数通常为样本输出和假设函数的差取平方后的平均数均方误差为什么是差值的平方因为差可正可负平方后① 全部变成非负方便比较大小② 放大了大误差的惩罚误差 2 的损失是 4误差 1 的损失是 1翻倍不是线性增长。至于前面为什么乘 1/(2m)——m是为了取平均2 是为了后面求导时好约分属于数学上的小体贴。3. 梯度下降与代价函数结合一元线性回归现在我们手里有两样东西梯度下降算法怎么下山不断重复直到收敛线性回归模型山长什么样把两者结合梯度下降负责沿最陡方向下山而这座山就是线性回归的损失函数。每迭代一步和就沿着各自负梯度的方向迈一小步直到损失函数不再下降就得到了最优的拟合直线。这里有一个非常重要的细节参数要同时更新simultaneously update。同时更新的意思是说计算新和计算新时用的都是更新前的旧、而不是先更新、再用新去算。这两者结果完全不同一定要用临时变量把新值都算好再一起赋回去。4. ※很重要求解损失函数的导数有了损失函数梯度下降需要知道每个参数方向上的坡度也就是对损失函数求偏导。我们要分别求和。这里用到的数学工具是链式法则对复合函数求导。回忆所以的系数是 1的系数是 x而对求导是再由链式法则当时2与1/(2m)约分→1/m当时多乘一个把这两个偏导代回梯度下降更新式算法就可以改写成直观理解是预测值与真实值的误差。误差为正预测大了→减去一个正数→θ变小误差为负预测小了→减去一个负数→θ变大。所有样本的误差一起平均决定这一大步往哪走——这就是用数据修正模型。5. 梯度下降法的推导流程把整套算法串起来5.1先决条件确认优化模型的假设函数和损失函数比如对于线性回归假设函数为多元情形用于凑出常数项写成求和与向量形式更简洁对应的损失函数5.2算法相关参数初始化初始化参数比如全0或随机小值、算法终止距离δ和步长学习率。5.3算法过程①确定当前位置损失函数的梯度就是第4节求的东西②当前位置下降一步的距离③判断是否对于所有的参数梯度下降的距离都小于δ——如果小于则算法终止否则进入步骤 ④④更新所有的对于其更新表达式如下更新完毕后再转入步骤①不同参数拆开写就是......每个参数都用自己的那列特征去加权误差方向互不干扰、同时更新。6. 计算损失函数实际上损失函数用NumPy几行就能实现import numpy as np def computeCost(x, y, theta): inner np.power(((x * theta.T) - y), 2) # 每个样本的误差平方 return np.sum(inner) / (2 * len(x)) # 全部加起来取平均再乘 1/2其中x是特征矩阵形状m×(n1)第一列全为1y是真实标签向量是参数行向量。x * theta.T就是m个样本的预测值减去y求平方再平均就得到了。7. 梯度下降法三兄弟BGD/SGD/MGD上面的公式5.3里的④里有一个变量——每次更新用多少个样本 根据这个答案的不同梯度下降分为三兄弟7.1 全梯度下降法Full Gradient DescentFG/批量梯度下降 BGD具体做法更新参数时使用所有的样本。计算训练集所有样本的误差对其求和再取平均值作为目标函数。优点每步方向是全局最准确的loss 平滑单调下降凸函数下能稳定收敛到全局最优。缺点每次更新都要在整个数据集上计算所有梯度速度很慢无法处理超出内存容量限制的数据集不能在线更新模型即运行过程中不能增加新的样本。打个比方BGD像全员大会决策制——每走一步全公司所有员工都要汇报一遍意见方向绝对靠谱但开一次会就要等所有人走得又慢又累。7.2 随机梯度下降法Stochastic Gradient DescentSGD具体做法每次只代入计算一个样本目标函数的梯度来更新权重再取下一个样本重复此过程直到损失函数值停止下降或损失函数值小于某个可以容忍的阈值。优点每步只需算1个样本速度飞快可以边训练边来新样本在线学习由于噪声大反而通常能较好地避免陷入局部最优解。缺点单样本带来的噪声让路线歪歪扭扭若遇上噪声则容易陷入局部最优解最终会在最小值附近来回波动难以精确收敛到最小值。打个比方SGD像个人拍板制——一个人说往东就往东走一步算一步快是真快但方向全凭个人感觉路线歪歪扭扭到了谷底附近还会来回打转。7.3 小批量梯度下降法Mini-batch Gradient DescentMGD具体做法小批量梯度下降是FG和SG的折中方案一定程度上兼顾了两者的优点。每次从训练样本集中随机抽取一个小样本集在这个小样本集上用FG的方式迭代更新权重。被抽出的小样本集所含样本点的个数称为batch_size通常设置为2的幂次方如 64、128、256、512更有利于GPU加速处理。迭代形式为从m个样本中选x个样本进行迭代1xm两个极端若 batch_size 1 →退化为 SGD每个样本就是一个子集共m个子集若 batch_size m →退化为BGD只有一个子集 (X, Y)。打个比方MGD 像小组讨论制——几个代表商量一下方向就走既不像全员大会那么慢又不像一个人拍板那么飘是实际工程中最常用的方案。三种算法的下山路线差异一张图看懂图中蓝色BGD路线平滑稳定直达谷底紫色SGD路线弯弯绕绕但步伐快绿色MGD介于两者之间。关于loss曲线的振荡使用BGD随着迭代次数增加loss是不断减小的而使用MGD随着在不同mini-batch上迭代训练loss不是单调下降而是受类似noise的影响出现振荡——比如可能第一个子集是好子集而第二个子集恰好包含了一些噪声。但整体趋势是下降的最终也能得到较低的loss值出现细微振荡是正常现象7.4 怎么选batch_sizemini-batch size不能设置得太大或太小总体样本不大时比如m≤2000直接使用BGDm很大时推荐的mini-batch size为64、128、256、5122的幂提高运算速度BGD使用所有m个样本会比较平稳地接近全局最小值但每次前进的速度有些慢SGD每次前进速度很快但路线曲折、振荡较大最终会在最小值附近来回波动难以真正达到最小值处。7.5 三兄弟对比表对比项BGD全梯度SGD随机MGD小批量每次更新用样本数全部m个1个一小批batch_size更新速度慢快较快路径稳定性平滑稳定曲折颠簸折中有细微振荡loss 曲线单调下降波动大整体下降带振荡能否在线更新不能能能是否易陷入局部最优凸函数收敛全局最优噪声大通常可跳出局部最优介于两者之间内存友好度差需全量数据好好实际应用小数据集m≤2000在线学习/超大数据集最常用7.6 别忘了学习率不管哪一版梯度下降都躲不开学习率这个步子大小的问题太小稳稳当当但收敛极慢训练时间感人合适几步就到谷底附近效率最高偏大在谷底两边来回震荡loss反复横跳过大一步跨过山谷越跳越远直接发散损失函数爆炸。8. 案例讲解学生成绩预测附录有上机实战从安装Acaconda开始手把手教学理论知识到此为止接下来来看一个完整案例。8.1 案例背景我们想用平时成绩期末成绩预测最终成绩。用sklearn的线性回归APIfrom sklearn.linear_model import LinearRegression # LinearRegression() # LinearRegression.coef_回归系数8.2 数据学生平时成绩期末成绩最终成绩1808684.22828080.63857880.1490905868283.26829087.67788079.48929493.4那么第4位同学的最终成绩是——这就是要预测的目标。8.3 步骤分析机器学习建模的标准五步1. 获取数据集 → 2. 数据基本处理 → 3. 特征工程 → 4. 机器学习 → 5. 模型评估。8.4 数据导入x [[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]] y [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]8.5 模型训练和预测# 实例化 API estimator LinearRegression() # 使用 fit 方法进行训练 estimator.fit(x, y) # 查看回归系数 estimator.coef_ # array([0.3, 0.7]) # 预测平时 100、期末 80 的同学最终成绩 pred estimator.predict([[100, 80]]) print(pred) # [86.]模型的系数是[0.3, 0.7]意味着最终成绩≈0.3×平时成绩0.7×期末成绩。回看第4位同学0.3×90 0.7×90 90与真实值90完全吻合说明拟合得很不错。预测平时100、期末80的同学→0.3×100 0.7×80 86输出正是86.0。9. 总结梯度下降的本质沿着损失函数下降最快的方向负梯度迭代更新参数直到损失不再下降——蒙着眼下山。三个关键角色损失函数要爬的山、学习率步子大小、终止条件δ走多近算到。三兄弟怎么选数据小用BGD数据大用MGDbatch_size取2的幂要在线学习/逃离局部最优可以考虑SGD。两个必须小心的坑学习率太大会发散、太小会龟速参数必须同时更新。最后谢谢恩师陈老师。如果这篇笔记能帮你把梯度下降讲懂哪怕一点点欢迎点赞收藏也欢迎评论区斧正接下来上实战附录Jupyter的安装与第一个项目实战Anaconda版前面把梯度下降的理论和案例都讲完了纸上谈兵不如动手跑一遍。本文附上用Anaconda安装Jupyter并跑通学生成绩预测案例的完整流程Windows。附1. 选择Anaconda的理由Anaconda是一个数据科学全家桶发行版装好它Jupyter、numpy等常用库全送不需要一个一个pip安装对新手最友好。缺点是安装包比较大好几个GB哦但换来的是省心和稳定。附2. Anaconda与jupyter安装步骤第1步下载Anaconda安装包官网https://www.anaconda.com/download国内网络慢的话用清华镜像https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载最新的Windows x86_64 版exe。此处以清华源的Anaconda3-2025.12-2-windows-x86_64.exe为例进行案例讲解。第2步安装双击exe跟着我的截图一路Next注意以下两点以及我图片里标注的项安装路径建议不放C盘不要装在带中文和空格的目录到 Advanced Options 这一步不要勾选 Add Anaconda3 to my PATH。勾了容易和电脑里已有的Python环境抢环境变量。不勾也没关系因为目前我们不用普通CMD启动用专门的Anaconda Prompt。勾选项为Create shortcuts创建开始菜单快捷方式——勾上Register Anaconda3 as the system Python 3.13把 Anaconda 的 Python 注册为系统默认 Python——勾上VSCode/PyCharm能自动识别Clear the package cache upon completion装完后清理安装缓存省磁盘空间——勾上配置环境变量在系统变量里找到Path并双击点击新建我们要新建四个相关acaconda的环境变量请替换成自己的实际路径AnacondaAnaconda\ScriptsAnaconda\Library\binAnaconda\Library\mingw-w64\bin配置完成点击确定退出即可。在应用列表里就可以看到Acaconda的身影了恭喜我们安装好啦但是还要验证有没有真的安装好了第3步验证安装打开开始菜单→找到并打开Anaconda Prompt这是Anaconda自带终端会默认进入它的base环境输入conda --version能显示版本号如conda 25.x.x就说明安装成功。新建虚拟环境conda create -n new_env //new_env更换成你的虚拟环境的名字在创建环境、安装各种库时会有一个确认请求输入y确认即可查看环境列表conda env list切换虚拟环境conda activate new_env退出虚拟环境使用口令conda deactivate。安装jupyterpip install jupyter notebook安装内核pip install ipykernel注册内核python -m ipykernel install --user --namemyenv --display-namePython (myenv)其中myenv替换成自己的kernel内核标识符建议与环境名一致引号内的Python (myenv)是Jupyter界面里显示的名字可以随意改成自己喜欢的名字。输入以下口令可以查看当前所有内核jupyter kernelspec list第4步启动Jupyter在Anaconda Prompt里输入jupyter notebook稍等片刻浏览器会自动打开http://localhost:8888看到文件列表页面你的用户名目录就成功了。注意这个Anaconda Prompt窗口不能关关了网页就打不开了Jupyter服务是跟着终端走的。但是我们发现目前的文件夹有很多乱七八糟的内容我们怎样才能给自己弄一个专门用来放code的空文件夹呢为了方便管理法一切换启动目录专门用一个本地文件夹作为Jupyter根目录目前不建议在C:\Windows\System32运行jupyter这个是系统目录容易有权限问题文件杂乱。操作步骤1.先把当前jupyter服务关掉在 Anaconda Prompt窗口按CtrlC输入y关闭jupyter2.在电脑D盘/桌面新建一个文件夹例如D:\jupyter_code专门存放所有代码3.在Anaconda Prompt现在是study环境输入命令切换到这个目录再重新启动。D: cd D:\jupyter_codejupyter notebook打开网页后根目录就直接是D:\jupyter_code干干净净以后所有代码文件都存在这里。以后每次打开Anaconda Prompt只要先执行cd D:\jupyter_code再启动 jupyter就直接进入这个专属工作区啦。法二但如果不想每次都手动cd切换目录可以修改jupyter配置默认打开就进D盘工作文件夹关闭 jupyter在 Anaconda Prompt 输入jupyter notebook --generate-config找到生成的jupyter_notebook_config.py搜索notebook_dir修改为c.NotebookApp.notebook_dir D:\\jupyter_code注意是双反斜杠去掉前面#注释符号保存。再重启jupyter就默认打开这个文件夹。路径看截图高亮引导你的路径不一定跟我的一样但位置是差不多的找到这个.py文件并打开呀搜索notebook_dir添加指定内容重新启动jupyter notebook可以发现已经是干干净净的了附3. 第一个项目跑通学生成绩预测所有准备工作做好我们开始实战了在Jupyter文件列表页右上角点New→Python 3(ipykernel)新建一个笔记本然后把下面代码逐个复制进格子Cell每个格子输完按ShiftEnter运行。Cell 1验证环境print(Hello, Jupyter!) import numpy as np print(numpy 版本:, np.__version__)Cell 2导入线性回归APIfrom sklearn.linear_model import LinearRegression啊呀报错了报错是因为当前Jupyter选中的study内核对应的Python环境里没有安装scikit-learn库。我们保存当前代码退出重新打开窗口输入使用清华源要快一点哦pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout1000安装完成之后再重新启动jupyter notebook呀重新回到code编译之前记得重启内核Restart Kernelrestart之后所有cell都需要重新运行哦Jupyter的[数字]代表执行顺序不是单元格从上到下的顺序通过啦迈出了具有里程碑的一步Cell 3准备数据平时成绩、期末成绩→最终成绩x [[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]] y [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4] print(样本数:, len(x))Cell 4训练模型estimator LinearRegression() estimator.fit(x, y) print(回归系数 coef_:, estimator.coef_)看到[0.3 0.7]就说明模型学出来——最终成绩 ≈ 0.3×平时 0.7×期末和我们的结论完全一致。Cell 5预测print(第4位同学预测:, estimator.predict([[90, 90]])) # 应接近 90.0 print(新同学预测:, estimator.predict([[100, 80]])) # 应为 86.0Cell 6加餐用numpy手写正文里的损失函数验证参数import numpy as np def computeCost(x, y, theta): pred x theta inner np.power((pred - y), 2) return np.sum(inner) / (2 * len(x)) X np.column_stack([np.ones(len(x)), np.array(x)]) Y np.array(y) theta np.array([0.0, 0.3, 0.7]) print(当前损失 J(θ) , computeCost(X, Y, theta))Cell 7加餐画预测效果图注意要提前下载matplotlib库哦pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout1000由于matplotlib默认字体DejaVu Sans不支持中文编译后会产生很多警告我们提前在绘图代码最开头设置支持中文的字体再加一行解决负号乱码。import matplotlib.pyplot as plt # 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] #黑体 plt.rcParams[axes.unicode_minus] False #负号显示异常问题 pred_all estimator.predict(x) plt.figure(figsize(6, 4)) plt.scatter(y, pred_all, colorsteelblue, s40) #s是散点大小 plt.plot([min(y), max(y)], [min(y), max(y)], r--, linewidth2) #linewidth2红色虚线加粗 plt.xlabel(真实最终成绩, fontsize11) plt.ylabel(预测最终成绩, fontsize11) plt.title(学生成绩预测效果, fontsize12) plt.grid(alpha0.3) #alpha0.3浅灰色网格 plt.show()点越集中在红虚线附近说明预测越准。附4. 跑通验收标准其实同时满足这三点第一个项目就正式跑通了我们的任务圆满完成1、Cell 4输出coef_为[0.3 0.7]2、Cell 5预测输出[86.]3、目录里多出一个.ipynb文件CtrlS保存名字随意如test1_student_score.ipynb。以后每次使用打开Anaconda Prompt→jupyter notebook→打开保存的.ipynb或者新建一个继续写。附5. 常见坑速查表Anaconda版现象原因解决办法conda不是内部或外部命令普通CMD里没进conda 环境改用开始菜单里的Anaconda Prompt网页打开但新建时没有Python 3缺ipykernelAnaconda Prompt里pip install ipykernel后重启 Jupyter8888端口被占用别处已开了一个jupyter notebook --port8889关掉终端网页就打不开正常现象服务随终端退出重新运行jupyter notebook运行代码报ModuleNotFoundError缺某个库Anaconda Prompt里pip install 库名必要时使用清华源后记得在菜单栏Kernel→Restart想用已有Python跑Jupyter与Anaconda 混用不建议混用Anaconda自带Python直接用它的环境即可结语理论配实战才是最快的掌握方式。希望这篇总结能帮助到你如有错误或遗漏欢迎指正交流
返回列表