
把吴恩达机器学习这门课完整刷完我前后花了两个半月。视频、讲义、八个编程作业外加课程里所有小测全部过了一遍笔记本上写满了公式和踩坑记录。今天这篇汇总笔记就是我从零基础到能跑通完整项目的全过程沉淀覆盖课程主线、梯度下降、正则化、Python环境配置、编程作业、真实项目应用以及期末复习方向。无论你是刚开始接触机器学习还是正在准备机器学习期末复习这篇笔记应该都能让你少走不少弯路。先说明白一件事吴恩达这门课虽然老但并不过时。课程里讲的线性回归、逻辑回归、神经网络、SVM、聚类、降维、异常检测、推荐系统至今仍然是工业界用得最频繁的算法底座。我把课程内容按我自己的理解重新组织了一遍不是照着目录复述而是按“这个算法解决什么问题、为什么这样设计、代码里怎么落地”的逻辑重新梳理。1. 学完吴恩达机器学习课先说说这门课的真实分量1.1 课程到底讲了什么吴恩达这门Machine Learning课最早在Coursera上线后来在B站、网易公开课上都有完整搬运。课程结构大致可以分为三大块监督学习线性回归、逻辑回归、神经网络、支持向量机无监督学习K-means聚类、主成分分析PCA、异常检测、推荐系统工程实践偏差方差诊断、学习曲线、正则化、机器学习系统设计、大规模机器学习很多人觉得课程只有11周内容量不大但实际上每个视频都信息密度很高。视频短小精悍5到15分钟一个但配合讲义、课后测验和编程作业整体体量足以撑起一门大学专业课的三倍学分。1.2 为什么它更适合入门而不是进阶我在学这门课前也对比过市面上其他资料。李宏毅的课更偏深度学习更新快、案例新但对于完全没有基础的人上来就接触Transformer和GAN容易一头雾水周志华的西瓜书理论推导扎实偏向学术适合当工具书查阅PRML更是贝叶斯视角的殿堂级教材数学门槛直接劝退大多数人。吴恩达的课强在“用直觉建立全局观”。他不会一上来就扔公式而是先用一个生活场景告诉你这个算法在干嘛再把数学形式慢慢补上。比如讲线性回归他会从房价预测讲起面积和价格的关系、如何画一条线拟合数据、这条线为什么是合理的。等你接受这个直觉之后再引入成本函数和梯度下降。这种“先直觉后数学”的顺序对新手极其友好。1.3 我实际的学习周期安排我的学习节奏是工作日每晚抽1到2小时周末每天3到4小时。第一遍看视频做笔记第二遍做编程作业。视频我不开倍速因为有些推导细节一旦加速就漏过去了。讲义我会完整过一遍特别留意那些“注意”“直观上”的说法这些往往就是课程的重点信号。课程配套资料主要有四类视频B站搜“吴恩达机器学习”完整的中英字幕版本很多讲义PDF格式每章都有配套的阅读材料课后测验每个章节的小测用于检验概念理解编程作业ex1到ex8覆盖线性回归、逻辑回归、多分类神经网络、反向传播、SVM、K-means、PCA、异常检测、推荐系统这些资料如果你只用来看视频那效果会打五折。编程作业才是把知识内化的关键。课程原版作业基于Octave/MATLAB我在学习时全程用Python重写了一遍这个选择后面专门讲。2. 课程主线拆解监督与无监督学习的两条清晰脉络2.1 监督学习分类与回归的完整谱系整门课花了最多篇幅讲监督学习因为这是机器学习里最成熟、应用最广的一块。它的核心逻辑很简单给定一批包含输入和正确答案的数据让模型找到输入到输出的映射关系。在线性回归里输出是连续值课程用房价预测做例子。给定房屋面积、卧室数量等特征预测房价。模型的假设函数长这样hθ(x)θ^T x代价函数用均方误差J(θ)1/(2m)Σ(hθ(x^(i))-y^(i))²注意这里的1/(2m)而不是1/m纯数学上是为了后面求导时消掉2让公式好看。这是吴恩达课程里一个很典型的小设计你没有必要在原理上纠结但推导时要留个心眼。逻辑回归解决的是分类问题输出是0或1。它在线性回归外面套了一层Sigmoid函数把输出压到0到1之间变成概率。分类问题的代价函数用交叉熵而不是均方误差因为均方误差在Sigmoid上函数不是凸的梯度下降会陷入局部最优。这个“为什么分类不能用回归的代价函数”是高频考点期末复习要重点看。课程在讲完这两个基础模型后引入了神经网络的动机当特征特别多、非线性关系特别复杂时手动的多项式特征工程不现实。神经网络通过多层结构自动学习特征组合这就是深度学习的雏形。吴恩达在这门课里讲的神经网络还很基础前向传播、反向传播、梯度检验但足够让你后来衔接深度学习。SVM放在了神经网络之后。它在逻辑回归的基础上引入了“间隔最大化”的思想只关心离决策边界最近的那些样本点也就是支持向量。课程里讲了线性核和高斯核的用法没有深挖数学优化但“核函数如何把低维不可分映射到高维可分”这个概念一定要吃透。2.2 无监督学习没有标准答案的学习无监督学习的核心特点是数据没有标签模型要自己发现结构。课程里讲了四种K-means聚类是其中最直觉的一个。算法流程就四步初始化K个聚类中心、分配每个样本到最近的中心、重新计算中心、重复直到收敛。这里面最经典的问题是“怎么选K”课程推荐了肘部法则但吴恩达也诚实地说这个方法并不总是好用实际项目里往往根据业务需求确定K值。PCA主成分分析用于降维。它的目标是把高维数据投影到低维空间同时尽量保留方差。课程讲的是用协方差矩阵的特征值分解来求主成分方向。PCA可以用来数据可视化、压缩存储也可以用作监督学习前的预处理步骤。有一个常见误区是拿PCA来防止过拟合课程里吴恩达明确不建议这种做法因为PCA会扔掉一些可能对分类有用的信息。异常检测用于发现数据中“不太正常”的点。它的思路是对每个特征拟合一个高斯分布然后计算一个样本在所有特征上的联合概率概率低于阈值就判定为异常。课程里举了飞机引擎质量检测、信用卡欺诈检测的例子。这里是期末复习容易出题的点注意异常检测和逻辑回归的区别异常检测的正例极少且模式未知逻辑回归需要足够的正反例来学决策边界。推荐系统课程里讲的是协同过滤。核心思想是利用用户的评分数据学习两组参数用户的偏好向量和物品的特征向量两者点积就是对评分的预测。协同过滤的一个特点是特征不需要手工设计算法会自己学出来这在当时是很超前的思路。我学到这里的时候最大的感受是推荐系统其实数学没有想象中复杂难的是数据和工程架构。2.3 课程内反复出现的机器学习三大假设吴恩达的课很少直接列“假设清单”但贯穿全课有三个假设你在学的时候会反复撞到训练集和测试集独立同分布模型在训练集上表现好默认在测试集上也会好前提是两边数据的分布一致。如果测试集和训练集的分布差很远模型就废了。这也是为什么真实项目里要重视数据采集的一致性。特征之间相对独立逻辑回归和朴素贝叶斯这类模型对特征独立性比较敏感。课程里没有直接讲朴素贝叶斯但讲了多项式回归时的特征组合隐含的前提就是特征各自携带有效信息。真实数据里特征经常高度相关这时候模型会不稳定需要靠正则化或者特征选择来缓解。误差服从一定的概率分布线性回归推导时课程默认误差是均值为0的高斯分布逻辑回归默认输出服从伯努利分布。这也是为什么代价函数要选平方误差或交叉熵本质上都是最大似然估计的自然结果。理解这一点你就会明白为什么逻辑回归要用Sigmoid而不是别的函数。这三个假设在真实项目里经常被打破但知道它们存在能帮助你理解模型失效的原因而不是盲目地上调学习率或者增加训练轮数。3. 梯度下降为什么是灵魂公式拆解与调参心得3.1 梯度下降的本质是个“下山”过程吴恩达在课程里用下山来比喻梯度下降我后来发现这个类比其实非常准确。想象你站在山上要走到山谷最低点你环顾四周找到最陡的坡往下迈一步重复这个过程最终就能到谷底。梯度就是那个“最陡的方向”学习率α就是你“每一步迈多大”。数学形式如下θ_j:θ_j-α·∂/∂θ_j J(θ)这个公式是整门课出现频率最高的一个线性回归用它逻辑回归用它神经网络的反向传播也是它的链式版本。初次接触的时候一定要手推一遍偏导数线性回归的偏导数推导结果对θ0∂J/∂θ0(1/m)Σ(hθ(x^(i))-y^(i))对θj∂J/∂θj(1/m)Σ(hθ(x^(i))-y^(i))·x_j^(i)逻辑回归的梯度形式上长得和线性回归一模一样但假设函数hθ(x)从线性变成了Sigmoid。很多人会惊讶为什么两个模型的更新公式长得一样这是因为它们在指数族分布上同源都属于广义线性模型的推导结果。期末复习时把这个对应关系讲清楚分数就稳了。3.2 学习率怎么选我的实测记录这是我在学梯度下降时踩的第一个坑。课程里强调学习率太大会震荡、太小会慢但我一开始是用默认值跑的结果损失曲线要么飞出去要么龟速下降。我的实测记录如下α1.0线性回归直接发散损失值变成NaN数据溢出α0.1前50次迭代震得厉害后面才勉强收敛α0.03收敛平稳约300次迭代到达可接受误差α0.01稳定不掉点但500次迭代后损失还比0.03差不少吴恩达课程里推荐的调试方法是先粗粒度试一组数0.001、0.003、0.01、0.03、0.1、0.3、1画损失随迭代次数的曲线看哪条在合理步数内收敛到较低损失。我在实践中的经验是多试两三档找到“损失曲线平滑下降、没有抖动、没有平台期”的那个α再以两三倍的幅度缩小范围精调。3.3 特征缩放这个细节决定收敛速度课程里专门用了一小节讲特征缩放的必要性。如果不做缩放特征的数值范围差太远比如面积范围500到2000卧室数量范围1到5那等高线的形状会非常扁平梯度下降会走出锯齿状的路线收敛极慢。标准做法有两种归一化(x-μ)/σσ是标准差结果均值0方差1归一化到固定区间(x-min)/(max-min)结果落在0到1我用波士顿房价数据集做实验对比过不做特征缩放的线性回归用0.01学习率迭代2000次误差还在高位归一化后同样参数只需要200次就收敛到接近最优值。差别就这么大几乎是课程里最实用也最容易被忽略的一步。3.4 批量梯度下降、随机梯度下降和小批量梯度下降课程在线性回归部分主推批量梯度下降即每次都拿全部样本来算梯度。后面讲大规模机器学习时引入了随机梯度下降每次只拿一个样本来算梯度参数更新更快但路径会很震荡。小批量梯度下降是折中方案每次拿一小批样本兼顾了稳定性和速度。实际项目里绝大多数优化器都是小批量思想比如深度学习里的mini-batch SGD批量大小在16到256之间。吴恩达课程里把这三种方式的优缺点讲得很清楚面试和期末都可能出对比题建议自己列一张表批量梯度下降稳定、精确、计算量大适合小数据随机梯度下降快、易震荡、需要调整学习率适合大数据流小批量梯度下降折中、工程标准做法、需要调批量大小3.5 反向传播是梯度下降的链式延伸神经网络部分的难点在于损失函数到隐藏层参数的梯度不能直接求因为中间隔了好几层。反向传播算法本质就是链式法则的反复运用先做一次前向传播算出预测值再从输出层往输入层方向逐层求导把误差从后往前“传”回去。吴恩达课程里还特别讲了梯度检验gradient checking用数值近似的方法验证反向传播算出的梯度是否正确。这个在实际编码里很有用尤其是你自己动手实现神经网络的时候。数值梯度的做法很简单在θ附近取θε和θ-ε用中心差分近似梯度和反向传播的结果做对比。ε一般取10^-4如果两侧差值小于10^-7级别就算通过。我在实现BP算法时因为维度搞错吃了不少苦头最后是靠梯度检验定位到某一层的矩阵转置写反了。所以这个技巧真的不是课程摆设是保命的。4. 过拟合、正则化与模型诊断这门课最实用的部分4.1 过拟合长什么样用一句话概括过拟合模型在训练集上表现极好但在新数据上一塌糊涂。课程里的例子是房价预测用一阶多项式拟合不够好四阶多项式把每个训练点都穿过去了拟合曲线歪歪扭扭泛化性能反而更差。我在自己的实验里对比过同样的波士顿房价数据集用线性回归和用加了大量多项式特征的模型后者训练集R²能达到0.95测试集却掉到0.6以下典型的过拟合。就像学生死记硬背了练习册的答案看着都会换个题目就不会了。4.2 L1和L2正则化的取舍正则化是抑制过拟合最直接的手段。课程重点讲了L2正则化也就是在成本函数后面加一项λ·Σθ_j²迫使模型参数不要太大让模型平滑一些。更新公式变成θ_j:θ_j(1-αλ/m)-α/mΣ(hθ(x^(i))-y^(i))x_j^(i)注意θ0通常不参与正则化这是约定俗成因为θ0只负责平移决策边界不影响曲线复杂度。L1正则化课程里没有细讲但实际用途也很大它让部分参数直接变为0实现特征选择。给你一个简单的对比L2正则化参数整体向0收缩但不会到0适合“大多数特征都有用但不想让某个特征主导”的场景L1正则化参数趋向稀疏相当于自动选特征适合特征很多但有大量无关特征调λ的方法是用验证集试。λ太小等于没正则化λ太大会把模型压成一条直线偏差急剧上升。课程里没有给一个万能公式但我个人的经验是先按数量级扫0.001、0.01、0.1、1、10找到验证集误差最低的那个区间再细调。4.3 训练集/验证集/测试集的分工很多课程把训练集和测试集讲得很多但很少强调验证集的作用。吴恩达专门强调了三者的分工训练集拟合模型参数验证集选择模型超参数比如多项式阶数、正则化系数λ测试集最终评估泛化能力这里有个容易犯的问题如果你反复用测试集来调参测试集的信息就“泄漏”进你的决策里最终评估结果会比真实表现乐观。正确的流程是训练集训练、验证集选型、测试集只跑一次得到最终指标。4.4 学习曲线一张图判断模型状态学习曲线是调试模型时最有用的工具横轴是训练集大小纵轴是误差。画两条曲线训练误差和验证误差随训练集大小的变化。训练误差很低、验证误差很高两者差距大过拟合解决方向是加正则化、加数据、降模型复杂度训练误差和验证误差都高、差距小欠拟合方向是加特征、加模型复杂度、减少正则化我在实际项目里发现很多人拿到一个模型先调参而吴恩达的诊断方法教你先判断模型是偏差问题还是方差问题。方向对了再调参才有意义这个思路比任何调参技巧都重要。5. 编程作业实操从Octave迁移到Python的完整过程与踩坑5.1 为什么作业推荐Octave但实际工程更建议Python吴恩达当年的课程选Octave是从教学角度出发因为语法简单学生可以把精力放在算法实现而不是语言特性上。但放到现在工业界的主流生态是Python有numpy、pandas、scikit-learn、PyTorch这些库社区和学习资料也几乎全转向Python。我在学完Octave版作业后又把每个作业用Python重新写了一遍这个过程中理解深了不少。建议是这样如果你时间充裕先把Octave版照着课程实现一遍理解算法本身再用Python重写一遍顺手把numpy的向量化操作练熟。如果时间紧直接用Python版社区作业配合本笔记理解每一行在干嘛也行。5.2 Python机器学习环境配置先说我的环境Windows笔记本Anaconda管理Python环境Jupyter Notebook写代码核心库是numpy、pandas、matplotlib、scikit-learn。安装步骤conda create -n ml python3.9 conda activate ml pip install numpy pandas matplotlib scikit-learn jupyter用Anaconda而不是裸装Python的原因自带科学计算库不需要一个个装依赖conda环境隔离干净后面做了深度学习项目不会互相污染Jupyter Notebook对学习阶段的可视化帮助巨大每跑一步都能看到数据形状和图像5.3 ex1线性回归作业逐行解读作业ex1的目标是用单变量线性回归预测餐车的利润。数据是一列人口规模和对应利润读取后先画散点图看分布再用梯度下降求参数。核心代码段是这样的import numpy as np import pandas as pd import matplotlib.pyplot as plt data pd.read_csv(ex1data1.txt, headerNone, names[Population, Profit]) X data.iloc[:, 0].values.reshape(-1, 1) y data.iloc[:, 1].values.reshape(-1, 1) m len(y) X np.concatenate([np.ones((m, 1)), X], axis1) theta np.zeros((2, 1)) def compute_cost(X, y, theta): predictions X theta errors predictions - y return (1 / (2 * m)) * np.sum(errors ** 2) def gradient_descent(X, y, theta, alpha, iterations): for _ in range(iterations): theta theta - (alpha / m) * (X.T (X theta - y)) return theta关键注意点np.concatenate加一列全1相当于把偏置项θ0吸收到矩阵运算里梯度更新用向量化X.T (X theta - y)numpy的是矩阵乘法不用for循环逐条样本算梯度因为向量化既快又接近课程里推导的数学形式我第一次写的时候忘了把X加全1列结果θ0始终是0拟合出来的直线离数据中心很远画图才发现问题。这个错误很典型排查方法很简单打印X的形状应该是(m, 2)而不是(m, 1)。5.4 波士顿房价数据集实验与常见问题除了完成课程作业我还额外用scikit-learn自带的波士顿房价数据集复练了一遍线性回归。这个数据集有506个样本、13个特征非常经典的回归练习数据集。我的实验流程数据探索用pandas查看特征分布、是否有缺失值特征缩放用StandardScaler做标准化划分数据70%训练、30%测试训练模型分别用解析解和梯度下降两种方式求解评估模型计算RMSE和R²这里有一批常见的报错和解决方案值得记录数据维度不匹配numpy报错信息里会标明期望形状和实际形状重点是看两个矩阵能不能做点积运算。最常见的坑是把(m, 1)和(m,)直接相乘结果变成奇特形状需要reshape对齐梯度爆炸特征缩放没做或者学习率过大损失值输出NaN把学习率调到0.01以下基本能解决特征里有缺失值直接用的话scikit-learn报错ValueError需要先用SimpleImputer填充策略通常选mean6. 从课程笔记到真实项目机器学习应用流程与工具链6.1 标准应用流程课程第6周的精髓吴恩达课程最精华的部分其实是第6周讲的是“如何设计一个机器学习系统”。这一部分常被初学者跳过但它是课程从算法课变成工程课的分水岭。标准流程是明确业务问题是分类还是回归指标是什么准确率还是F1收集和清洗数据样本量够不够有没有脏数据分布是否一致特征工程原始特征够不够要不要做组合、归一化、离散化选择模型先跑一个简单的baseline比如线性回归或逻辑回归训练和调参用验证集评估注意偏差方差诊断测试评估测试集只跑一次部署和监控模型上线后持续监控指标变化这里的核心思想是“快速跑通一个简单模型再迭代优化”而不是一上来就追求最好的模型。课程里有一句话我印象很深你要优先弄清楚错误的来源是偏差还是方差再决定下一步动哪里而不是到处乱调。这也是吴恩达这门课与很多快餐教程最大的区别——它在教你怎么科学地做模型迭代而不仅仅是怎么用工具。6.2 特征工程比调参更值得花时间我自己的体会是模型选型只要不出现大错误上限往往取决于特征质量而不是算法复杂度。课程里讲了很多特征相关的细节我把它们归纳成三条原则特征要能反映业务核心逻辑。例如预测房价位置、面积比数据里某些凑数的编号有价值得多特征要注意尺度统一。数值型特征做标准化类别型特征做独热编码特征不能“泄漏”。训练时的任何统计信息比如均值、标准差只能从训练集算不能直接拿全局统计量去归一化测试集否则就是lookahead bias6.3 scikit-learn把课程算法复现一遍学完课程后用scikit-learn复现每个算法是一个极好的收尾练习。代码量都不大但能让你直观对比自己手写的实现和工业库的差别from sklearn.linear_model import LinearRegression, LogisticRegression from sklearn.svm import SVC from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.ensemble import GradientBoostingClassifier每个算法在scikit-learn里都有对应类和默认参数。默认参数在课本场景下表现尚可但真实项目中需要调参。课程里对调参讲得不深因为这是黑盒调参而课程更关注理解原理。实操中我的建议是先理解每个模型的默认选择理由再动手调。GradientBoostingClassifier对应的GBDT在热搜词里排在很前面值得单独说一下。GBDT是集成学习里非常重要的提升树方法课程里没有细讲但它出现在周志华西瓜书和大量面试题里。手写GBDT还是有点难度的但用scikit-learn一行就能跑通进阶阶段值得去读几篇讲残差拟合原理的文章。6.4 从课程到实战的衔接Kaggle入门路线学完吴恩达课程后最顺的实战路径是去Kaggle打入门比赛。推荐路线是先找“House Prices”这种经典回归赛题把课程里学的线性回归、正则化、特征工程全流程刷一遍再去看高分kernel学习别人的特徵处理方式和模型融合方法。我个人不推荐一上来就碰CV或NLP方向的比赛因为那些赛题拼的主要是深度学习框架熟练度和硬件资源课程内容覆盖不足容易打击信心。从表格型数据回归/分类切入是最贴合课程内容的实战路径。7. 期末复习速成把上百页笔记浓缩成一张表7.1 核心算法速查表课程涵盖的算法很多期末复习时最怕一锅粥。我整理了一个速查表每个算法列关键信息考前看这一份就够了算法类型典型应用核心要点评估指标线性回归监督-回归房价预测、销售预测最小二乘、梯度下降、正规方程MSE、RMSE逻辑回归监督-分类垃圾邮件、疾病诊断Sigmoid、决策边界、交叉熵准确率、精确率、召回率神经网络监督图像、语音、文本前向传播、反向传播、梯度检验交叉熵、准确率SVM监督-分类文本分类、小样本场景间隔最大化、核函数准确率、间隔距离K-means无监督-聚类客户分群、图像压缩距离计算、中心点迭代轮廓系数、惯性PCA无监督-降维数据可视化、去相关协方差矩阵、特征值分解保留方差比例异常检测无监督欺诈检测、设备故障高斯分布、概率阈值F1分数推荐系统协同过滤电商推荐、视频推荐用户向量、物品向量、点积预测RMSE、MAE有了这个表你复习的时候就能快速定位“这个算法在哪个章节、核心公式是什么、评估用什么指标”。考前冲刺阶段别再看视频了直接拿这个表逐行过不清楚的再回翻对应章节。7.2 高频考点与常见误解根据课程内容和各种复习资料我把高频考点整理成了一份清单梯度下降的学习率选择和特征缩放的因果关系考概念题必出线性回归和逻辑回归的梯度更新公式对比看起来像但hθ(x)不一样过拟合的诊断用学习曲线判断方差还是偏差问题正则化参数λ的影响λ太大欠拟合、λ太小过拟合SVM核函数的本质低维映射到高维的计算技巧K-means如何选K肘部法则的原理和局限性PCA为什么不用于防止过拟合会丢失标签信息异常检测与监督学习的区别正例极少、分布未知协同过滤如何自动学习特征不需要手工设计特征大规模机器学习的三种梯度下降策略对比7.3 我自己踩过的复习误区第一次复习时我犯过几个错误写在这里希望你别走同样的弯路一是抓小放大把太多时间花在推导局部细节上却没有把每个算法放在同一个框架里去对比。后来我把所有算法按照“模型的假设是什么、损失函数是什么、优化方法是什么”三个维度重新过了一遍整个知识框架才清晰起来。二是只看视频不练题。期末考试光会概念解释是不够的公式推导和计算题占分不低。我当时把课程里的每个小测都重新做了一遍又把八次编程作业的核心代码段在脑海里过了一遍逻辑才算比较有把握。三是忽略“为什么这样设计”的问题。比如为什么要用Sigmoid、为什么交叉熵能配合梯度下降、为什么正则化项不算θ0。期末简答题很喜欢考这类设计动机光背公式答不出所以然。7.4 进阶阅读路线图学完这门课并考完期末之后如果你还想继续往前走我的建议是按这个顺序推进阶段资料目标深度学习入门李宏毅机器学习课程补充深度学习前沿内容理论补全周志华《机器学习》(西瓜书)搞懂推导细节和算法边界贝叶斯视角PRML对概率图模型和贝叶斯方法建立认知工程实战Kaggle入门赛 scikit-learn文档把算法用到真实数据上集成学习GBDT、XGBoost、LightGBM掌握当前表格数据的主流神器我个人在实际操作中的体会是吴恩达这门课打底西瓜书补理论Kaggle练实战这三步走完之后你再回头去看大部分机器学习相关的面试题和论文就基本不存在“看不懂在说什么”的问题了。全流程耗时大概半年周末和晚上抽时间就够了关键在坚持和动手。