机器学习核心知识:从基础概念到关键算法

news2025/4/16 18:38:57

摘要

本文深度剖析机器学习知识体系,从基本概念、学习方式,到分类算法、逻辑回归等关键内容均有涉及。详细阐述各知识点原理与应用场景,并对比多种算法的优劣。
关键词:机器学习;监督学习;分类算法;逻辑回归;梯度下降法

一、引言

机器学习作为人工智能的核心领域,近年来发展迅猛,广泛应用于图像识别、自然语言处理、数据分析等诸多方面。1959年,Arthur Samuel设计的下棋程序标志着机器学习概念的诞生,自此,这一领域结合概率论、优化理论、统计学等多学科知识,不断发展演进。本文将系统地介绍机器学习的基本概念、学习方式、重要算法以及相关的评估方法等内容,帮助读者深入理解机器学习的奥秘。

二、机器学习基础概念

2.1 机器学习本质

机器学习,简单来说,就是让计算机通过算法从数据中提取规律。这里的“机器”通常指计算机,算法则是实现学习的工具。依据数据是否带有标签,机器学习可分为监督学习和无监督学习。若数据有标签,算法学习的是输入数据与标签之间的映射关系,此为监督学习;若数据无标签,算法则致力于挖掘数据的内在结构,即无监督学习。

2.2 神经网络

神经网络是由多个神经元按照特定规则连接而成的网络。以全连接神经网络为例,它包含输入层、隐含层和输出层。输入层负责接收数据,如一张猫的图片;输出层展示对输入数据的判断结果,比如判断图片中的物体是否为猫;隐含层则承担数据的传递和加工处理工作。其特点包括同一层神经元之间无连接,且每个连接都有权值。

2.3 常见算法图示

在实际应用中,机器学习包含多种算法,如支持向量机、决策树、随机森林等。这些算法各自具有独特的特点和适用场景,通过图示可以更直观地理解它们的工作原理和差异。但因篇幅限制,本文暂无法详细展示所有算法图示,感兴趣的读者可查阅相关资料进一步了解。

2.4 计算图的导数计算

计算图的导数计算采用反向传播方法,该方法基于链式法则和隐式函数求导。例如,对于函数 z = f ( u , v ) z = f(u, v) z=f(u,v),若其在点 ( u , v ) (u, v) (u,v)处的偏导数连续,且 u u u v v v是关于 t t t的函数,在 t t t点可导,则根据链式法则, z z z t t t点的导数为:
d z d t = ∂ z ∂ u d u d t + ∂ z ∂ v d v d t \frac{dz}{dt}=\frac{\partial z}{\partial u}\frac{du}{dt}+\frac{\partial z}{\partial v}\frac{dv}{dt} dtdz=uzdtdu+vzdtdv
链式法则可以理解为,复合函数的导数等于里边函数代入外边函数的值之导数,乘以里边函数的导数。比如,对于函数 f ( x ) = x 2 f(x) = x^2 f(x)=x2 g ( x ) = 2 x + 1 g(x) = 2x + 1 g(x)=2x+1,则 f [ g ( x ) ] f[g(x)] f[g(x)]的导数为:
f [ g ( x ) ] ′ = 2 [ g ( x ) ] × g ′ ( x ) = 2 ( 2 x + 1 ) × 2 = 8 x + 4 f[g(x)]' = 2[g(x)]×g'(x)=2(2x + 1)×2 = 8x + 4 f[g(x)]=2[g(x)]×g(x)=2(2x+1)×2=8x+4

2.5 局部最优与全局最优

在优化问题中,常常需要寻找函数的最优解,这分为局部最优解和全局最优解。局部最优解是在函数值空间的一个有限区域内的最小值,而全局最优解是在整个函数值空间内的最小值。可以通过柏拉图与苏格拉底关于爱情和婚姻的故事来理解这两个概念。寻找全局最优解往往较为困难,甚至可能不存在,因此在实际应用中,通常会设定一些条件,寻找局部最优解。

2.6 大数据与深度学习的关系

大数据通常指超出常用软件工具处理能力的数据集。机器学习关注计算机如何模拟人类学习行为以获取新知识和技能,而数据挖掘是应用特定算法从数据中提取模式的过程,机器学习算法在其中作为工具使用。深度学习则是模拟大脑行为,从多个方面学习对象的机制和行为。深度学习对大数据的分析、挖掘和建模都有帮助,还转变了解决问题的思维方式。同时,大数据的深度学习需要一个框架来支撑。

三、机器学习的学习方式

3.1 监督学习

监督学习使用已知正确答案的示例来训练网络。在训练过程中,算法学习输入数据与标签之间的映射关系,常见的应用场景包括分类和回归。比如,通过大量已标注的图片训练模型,使其能够识别不同的物体,这就是分类任务;预测房价随时间的变化趋势则属于回归任务。支持向量机、朴素贝叶斯、逻辑回归等都是常见的监督学习算法。

3.2 非监督学习

非监督学习适用于处理无标签的数据。在这种情况下,算法的目标是推断数据的内在结构,比如数据的分布模式、聚类情况等。关联规则学习和聚类是其常见的应用场景。Apriori算法用于挖掘数据中的关联规则,k-Means算法则是经典的聚类算法。

3.3 半监督学习

半监督学习处理的是部分数据有标签、部分无标签的情况。算法先对已标记的数据进行建模,然后在此基础上预测未标记数据的标签。在图像识别领域,由于存在大量未标注的数据,半监督学习具有重要的应用价值。图论推理算法、拉普拉斯支持向量机等是半监督学习的常用算法。

3.4 弱监督学习

弱监督学习面对的数据标签存在不可靠的情况,如标记不正确、多种标记、标记不充分等。其学习过程是利用已知的弱标签数据训练智能算法,将输入数据映射到更强的标签。例如,在图像分割任务中,给定一张包含气球的图片,需要从弱标签(如仅知道图片中有气球)学习得到强标签(如气球在图片中的具体位置及与背景的分割线)。

3.5 监督学习模型的搭建步骤

搭建监督学习模型一般包含以下几个关键步骤:

  1. 数据集的创建和分类:首先要确定数据集,并对其中的目标数据进行标注。然后将数据集划分为训练集和验证集,比如在识别气球照片的任务中,要标注出包含气球的照片,并合理划分训练集和验证集。
  2. 数据增强:原始数据可能无法涵盖目标在各种扰动下的信息,为了提升模型的泛化能力,通常会进行数据增强。对于图像数据,常见的数据增强方式包括图像旋转、平移、颜色变换、裁剪、仿射变换等。
  3. 特征工程:特征工程包括特征提取和特征选择。常见的手工特征有尺度不变特征变换(SIFT)、方向梯度直方图(HOG)等。在深度学习中,卷积神经网络(CNN)本身就具备特征提取和选择的能力,不同的网络结构、正则化和归一化方法也可看作是深度学习背景下的特征工程。
  4. 构建预测模型和损失函数:将原始数据映射到特征空间后,构建合适的预测模型。为了保证模型输出与标签的一致性,需要定义损失函数,如交叉熵、均方差等。通过优化方法不断迭代,使模型从初始化状态逐渐具备预测能力。
  5. 训练:选择合适的模型和超参数进行初始化,如支持向量机中的核函数、误差项惩罚权重等。将处理好的特征数据输入模型,使用梯度下降法等优化方法不断缩小输出与标签之间的差距,当迭代结果满足截止条件时,得到训练好的模型。
  6. 验证和模型选择:利用验证集对训练好的模型进行测试,评估模型的性能。在此过程中,通常会调整模型的超参数,如节点数量、层数、激活函数和损失函数等,以优化模型性能。
  7. 测试及应用:当模型性能达到要求后,将其部署到应用程序中,如将预测功能发布为API调用,以便在实际场景中进行推理和应用。

四、分类算法

4.1 常用分类算法的优缺点

常用的分类算法各有优劣,具体如下表所示:

算 法优 点缺 点
Bayes(贝叶斯分类法)1. 所需估计的参数少,对于缺失数据不敏感。
2. 有着坚实的数学基础,以及稳定的分类效率。
1. 需要假设属性之间相互独立,这往往并不成立。
2. 需要知道先验概率。
3. 分类决策存在错误率。
Decision Tree(决策树)1. 不需要任何领域知识或参数假设。
2. 适合高维数据。
3. 简单、易于理解。
4. 能够在短时间内处理大量数据,得到可行且效果较好的结果。
5. 能够同时处理数据型和常规性属性。
1. 对于各类别样本数量不一致的数据,信息增益偏向于那些具有更多数量的样本。
2. 容易发生过拟合。
3. 忽略属性之间的相关性。
4. 不支持在线学习。
SVM(支持向量机)1. 可以解决小样本下机器学习的问题。
2. 提高泛化性能。
3. 可以解决高维、非线性问题,在超高维文本分类中仍受欢迎。
4. 避免神经网络构造选择和局部极小的问题。
1. 对缺失数据敏感。
2. 内存消耗大,难以解释。
3. 运行速度较慢,调参复杂。
KNN(K近邻)1. 核心思路简单,理论成熟,既可以用来做分类也可以用来做回归。
2. 可用于非线性分类。
3. 训练时间复杂度为 O ( n ) O(n) O(n)
4. 准确度高,对数据没有假设,对离群值不敏感。
1. 计算量太大。
2. 对于样本分类不均的问题,会产生误判。
3. 需要大量的内存。
4. 输出的可解释性不强。
Logistic Regression(逻辑回归)1. 速度快。
2. 简单、易于理解,能直接看到各个特征的权重。
3. 能容易地更新模型,吸收新的数据,适用于需要概率框架,能够动态调整分类阈值的场景。
特征处理过程复杂,需要进行归一化等特征工程。
Neural Network(神经网络)1. 分类准确率高。
2. 并行处理能力强。
3. 分布式存储和学习能力强。
4. 鲁棒性较强,不易受噪声影响。
1. 需要大量参数(网络拓扑、阈值等)。
2. 结果难以解释。
3. 训练时间过长。
Adaboosting(自适应增强算法)1. 有很高精度。
2. 可以使用各种方法构建子分类器,提供了一个通用框架。
3. 当使用简单分类器时,计算出的结果是可以理解的,而且子分类器构造极其简单。
4. 流程简单,不用做特征选择。
5. 不用担心过拟合。
对离群值比较敏感。

4.2 分类算法的评估方法

4.2.1 常用术语

在评估分类算法时,有几个常用的术语。假设分类目标只有两类,即正例(Positive)和负例(Negative):

  • True Positives(TP):被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数。
  • False Positives(FP):被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数。
  • False Negatives(FN):被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数。
  • True Negatives(TN):被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。

这四个术语可以通过混淆矩阵来表示:

预测类别
实际类别YesNo
YesTPFN
NoFPTN
总计P’(被划分为Yes)N’(被划分为No)

其中, P = T P + F N P = TP + FN P=TP+FN表示实际为正例的样本个数;True、False描述的是分类器是否判断正确;Positive、Negative是分类器的分类结果,若正例计为1、负例计为 -1,则实际的类标 = TF×PN,TF为True或False,PN为Positive或Negative。

4.2.2 二分类算法评价指标
  • 正确率(accuracy):正确率是最常见的评价指标,计算公式为 a c c u r a c y = T P + T N P + N accuracy = \frac{TP + TN}{P + N} accuracy=P+NTP+TN。它表示被分对的样本数在所有样本数中的占比,通常正确率越高,分类器越好。
  • 错误率(error rate):错误率与正确率相反,描述被分类器错分的比例, e r r o r r a t e = F P + F N P + N error rate = \frac{FP + FN}{P + N} errorrate=P+NFP+FN。对于某一个实例来说,分对与分错是互斥事件,所以 a c c u r a c y = 1 − e r r o r r a t e accuracy = 1 - error rate accuracy=1errorrate
  • 灵敏度(sensitivity) s e n s i t i v i t y = T P P sensitivity = \frac{TP}{P} sensitivity=PTP,表示所有正例中被分对的比例,衡量了分类器对正例的识别能力。
  • 特异性(specificity) s p e c i f i c i t y = T N N specificity = \frac{TN}{N} specificity=NTN,表示所有负例中被分对的比例,衡量了分类器对负例的识别能力。
  • 精度(precision) p r e c i s i o n = T P T P + F P precision = \frac{TP}{TP + FP} precision=TP+FPTP,精度是精确性的度量,表示被分为正例的实例中实际为正例的比例。
  • 召回率(recall):召回率是对覆盖面的度量, r e c a l l = T P T P + F N = T P P = s e n s i t i v i t y recall = \frac{TP}{TP + FN} = \frac{TP}{P} = sensitivity recall=TP+FNTP=PTP=sensitivity,可以看到召回率与灵敏度是一样的。
  • 其他评价指标:除了上述指标,还可以从计算速度、鲁棒性、可扩展性、可解释性等方面评估分类器。计算速度指分类器训练和预测需要的时间;鲁棒性反映处理缺失值和异常值的能力;可扩展性衡量处理大数据集的能力;可解释性关注分类器预测标准的可理解性,如决策树产生的规则容易理解,而神经网络的参数则较难解释。
  • F1分数:精度和召回率反映了分类器分类性能的两个方面。综合考虑精度与召回率,可以得到F1分数,也称为综合分类率。为了综合多个类别的分类情况,评测系统整体性能,经常采用微平均F1(micro-averaging)和宏平均F1(macro-averaging)两种指标。宏平均F1先对每个类别单独计算F1值,再取这些F1值的算术平均值作为全局指标;微平均F1先累加计算各个类别的值,再由这些值求出F1值。宏平均F1平等对待每一个类别,其值主要受到稀有类别的影响;微平均F1平等考虑样本集中的每一个样本,其值受到常见类别的影响比较大。
  • ROC曲线和PR曲线:ROC曲线(Receiver Operating Characteristic Curve,受试者工作特征曲线)是以灵敏度(真正例率)为纵坐标,以1减去特异性(假正例率)为横坐标绘制的性能评价曲线。ROC曲线越靠近左上角,说明其对应的模型越可靠,也可以通过ROC曲线下面的面积(Area Under Curve,AUC)来评价模型,AUC越大,模型越可靠。PR曲线(Precision Recall Curve)
  • 描述的是precision和recall之间的关系,以recall为横坐标,precision为纵坐标。该曲线所对应的面积(AUC)实际上是目标检测中常用的评价指标平均精度(Average Precision,AP),AP越高,说明模型性能越好。

4.3 正确率能否很好地评估分类算法

不同的分类算法在不同的数据集上表现各异,因此选择合适的评估指标至关重要。正确率虽然是一个直观的评价指标,但它并不总是能全面反映算法的优劣。例如,在地震预测场景中,由于地震发生的概率极低,如果分类器简单地将所有测试样例都划分为“不发生地震”,可能会获得很高的正确率,但在实际发生地震时却毫无作用。这是因为数据分布不均衡,少数类别的数据被忽视,导致正确率高但实际效果不佳。

4.4 什么样的分类器是最好的

对于特定任务,没有一个分类器能同时优化所有评价指标。理想情况下,分类器能正确分对所有实例,但在实际中这种完美的分类器很少存在。以地震预测为例,虽然无法做到百分百准确预测,但在保证一定正确率的前提下,提高召回率更为重要,即尽量避免错过真实发生的地震情况。

五、逻辑回归

5.1 回归的种类

回归问题根据因变量的不同可分为多种类型。若因变量是连续的,则为多重线性回归;若因变量服从二项分布,就是逻辑回归;若服从泊松(Poisson)分布,为泊松回归;若服从负二项分布,则是负二项回归。在实际应用中,二分类的逻辑回归最为常用,因为它更易解释。

5.2 逻辑回归适用性

逻辑回归具有广泛的应用场景:

  • 概率预测:可以根据模型预测在不同自变量情况下,发生某事或某种情况的概率,且结果具有可比性。
  • 分类:与概率预测类似,通过设定阈值,将可能性高于阈值的划分为一类,低于阈值的划分为另一类。
  • 寻找危险因素:例如寻找某一疾病的危险因素等。
  • 线性问题:逻辑回归仅适用于目标和特征是线性关系的情况。在使用时需注意,若模型是非线性的,则不适合用逻辑回归;并且要选择与目标呈线性关系的特征。
  • 特征独立性:各特征之间不需要满足条件独立假设,但各个特征的贡献独立计算。

5.3 逻辑回归与朴素贝叶斯的区别

逻辑回归与朴素贝叶斯在本质上有所不同:

  • 模型类型:逻辑回归是判别模型,侧重于寻找分类决策边界;朴素贝叶斯是生成模型,关注数据的生成过程。
  • 核心原理:朴素贝叶斯的核心是贝叶斯法则,通过计算后验概率进行分类;逻辑回归的本质是极大似然估计,通过最大化似然函数来确定模型参数。
  • 假设条件:朴素贝叶斯需要假设各个自变量之间满足条件独立;逻辑回归要求特征参数间的关系是线性的。

5.4 线性回归与逻辑回归的区别

线性回归与逻辑回归也存在明显差异:

  • 输出范围:线性回归的样本输出是连续值, y ∈ ( − ∞ , + ∞ ) y \in (-\infty, +\infty) y(,+);而逻辑回归中 y ∈ ( 0 , 1 ) y \in (0, 1) y(0,1),只能取0和1。
  • 拟合函数:线性回归的拟合函数为 f ( x ) = θ T x = θ 1 x 1 + θ 2 x 2 + . . . + θ n x n f(x)=\theta^{T}x=\theta_{1}x_{1}+\theta_{2}x_{2}+...+\theta_{n}x_{n} f(x)=θTx=θ1x1+θ2x2+...+θnxn,是对输出变量 y y y的直接拟合;逻辑回归的拟合函数是 f ( x ) = P ( y = 1 ∣ x ; θ ) = g ( θ T x ) f(x)=P(y = 1|x;\theta)=g(\theta^{T}x) f(x)=P(y=1∣x;θ)=g(θTx),其中 g ( z ) = 1 1 + e − z g(z)=\frac{1}{1 + e^{-z}} g(z)=1+ez1 ,是对1类样本概率的拟合。并且在线性回归中, θ T x \theta^{T}x θTx为预测值的拟合函数;在逻辑回归中, θ T x \theta^{T}x θTx为决策边界。
  • 参数计算方式:线性回归通常使用最小二乘法来估计参数,使模型能最好地拟合样本数据,即估计值和观测值之差的平方和最小;逻辑回归采用极大似然估计,最合理的参数估计量应该使得从模型中抽取该 n n n组样本观测值的概率最大。

具体区别如下表所示:

线性回归逻辑回归
用途预测分类
y y y的取值范围 ( − ∞ , + ∞ ) (-\infty, +\infty) (,+) ( 0 , 1 ) (0, 1) (0,1)
函数性质拟合函数预测函数
参数计算方式最小二乘法极大似然估计

六、代价函数

6.1 为什么需要代价函数

在训练逻辑回归模型等机器学习模型时,需要确定模型的参数。代价函数的作用就是通过对其进行训练,找到最优的参数解,以最小化模型的误差,使模型能更好地拟合数据。

6.2 代价函数作用原理

以回归问题为例,常用平方误差代价函数来求解最优解。假设要拟合一些离散数据点,通过调整模型的参数,使拟合曲线尽可能接近这些数据点。平方误差代价函数的主要思想是计算实际数据值与拟合曲线对应值的差值的平方和,为了减小个别极端数据的影响,通常会采用类似方差再取 1 2 \frac{1}{2} 21的方式。例如,对于假设函数 h ( x ) = θ 0 x h(x)=\theta_{0}x h(x)=θ0x,代价函数可表示为:
J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 J(\theta_{0}, \theta_{1})=\frac{1}{m}\sum_{i = 1}^{m}(h(x^{(i)}) - y^{(i)})^{2} J(θ0,θ1)=m1i=1m(h(x(i))y(i))2
其中, m m m为样本数量, x ( i ) x^{(i)} x(i) y ( i ) y^{(i)} y(i)分别为第 i i i个样本的特征值和真实值。最优解即为代价函数的最小值。当参数较少时,可以通过二维或三维图像直观地观察代价函数的变化;参数越多,情况越复杂。

6.3 常见代价函数

  • 二次代价函数(Quadratic Cost):公式为 J = 1 2 n ∑ x ∥ y ( x ) − a L ( x ) ∥ 2 J=\frac{1}{2n}\sum_{x}\left\| y(x)-a^{L}(x)\right\| ^{2} J=2n1x y(x)aL(x) 2,其中 J J J表示代价函数, x x x表示样本, y y y表示实际值, a a a表示输出值, n n n表示样本的总数, L L L表示整个神经网络的层数。
    以单个样本为例,二次代价函数为 J = ( y − a ) 2 2 J=\frac{(y - a)^{2}}{2} J=2(ya)2。在使用梯度下降法调整权值参数时,权值 w w w和偏置 b b b的梯度推导为 ∂ J ∂ w = ( a − y ) σ ′ ( z ) x \frac{\partial J}{\partial w}=(a - y)\sigma'(z)x wJ=(ay)σ(z)x ∂ J ∂ b = ( a − y ) σ ′ ( z ) \frac{\partial J}{\partial b}=(a - y)\sigma'(z) bJ=(ay)σ(z) ,其中 Z Z Z表示神经元的输入, σ \sigma σ表示激活函数。但在使用sigmoid函数作为激活函数时,会出现初始代价(误差)越大,训练越慢的问题。
  • 交叉熵代价函数(Cross - Entropy):公式为 J = − 1 n ∑ x [ y ln ⁡ a + ( 1 − y ) ln ⁡ ( 1 − a ) ] J=-\frac{1}{n}\sum_{x}[y\ln a+(1 - y)\ln (1 - a)] J=n1x[ylna+(1y)ln(1a)] 。其权值 w w w和偏置 b b b的梯度推导为 ∂ J ∂ w j = 1 n ∑ x x j ( σ ( z ) − y ) \frac{\partial J}{\partial w_{j}}=\frac{1}{n}\sum_{x}x_{j}(\sigma(z)-y) wjJ=n1xxj(σ(z)y) ∂ J ∂ b = 1 n ∑ x ( σ ( z ) − y ) \frac{\partial J}{\partial b}=\frac{1}{n}\sum_{x}(\sigma(z)-y) bJ=n1x(σ(z)y) 。当误差越大时,梯度就越大,权值 w w w和偏置 b b b调整就越快,训练速度也就越快。交叉熵代价函数适合输出神经元是S型函数的情况。
  • 对数似然代价函数(Log - likelihood Cost):常作为softmax回归的代价函数,在深度学习中,将softmax作为最后一层时常用该代价函数。对数似然代价函数与softmax的组合和交叉熵与sigmoid函数的组合非常相似,在二分类时可以化简为交叉熵代价函数的形式。在不同的深度学习框架中,与sigmoid和softmax搭配使用的交叉熵函数有所不同,如在TensorFlow中,与sigmoid搭配使用的交叉熵函数是tf.nn.sigmoid_cross_entropy_with_logits(),与softmax搭配使用的交叉熵函数是tf.nn.softmax_cross_entropy_with_logits();在PyTorch中,与sigmoid搭配使用的交叉熵函数是torch.nn.BCEWithLogitsLoss(),与softmax搭配使用的交叉熵函数是torch.nn.CrossEntropyLoss()

6.4 为什么代价函数要非负

目标函数存在下界是优化算法收敛的重要条件。当代价函数非负时,优化算法能够使目标函数不断减小,根据单调有界准则,可证明优化算法是收敛有效的,从而更方便地进行模型训练和参数优化。

6.5 为什么用交叉熵代替二次代价函数

  • 不用二次方代价函数的原因:二次方代价函数的权值 w w w和偏置 b b b的偏导数受激活函数的导数影响,sigmoid函数导数在输出接近0和1时非常小,这会导致一些实例在刚开始训练时学习得非常慢。
  • 使用交叉熵的原因:交叉熵函数权值 w w w和偏置 b b b的梯度推导表明,权重学习的速度受到 σ ( z ) − y \sigma(z)-y σ(z)y影响,误差更大时,学习速度更快,避免了二次代价函数中因 σ ′ ( z ) \sigma'(z) σ(z)导致的学习缓慢的情况。

七、损失函数

7.1 什么是损失函数

损失函数又称误差函数,用于衡量算法运行时模型预测值与真实值的不一致程度,通常用 L ( Y , f ( x ) ) L(Y, f(x)) L(Y,f(x))表示,是一个非负实值函数。损失函数越小,说明模型的预测值与真实值越接近,模型的鲁棒性也就越好。

7.2 常见的损失函数

  • 0 - 1损失函数:如果预测值和目标值相等,值为0;如果不相等,值为1,即 L ( Y , f ( x ) ) = { 1 , Y ≠ f ( x ) 0 , Y = f ( x ) L(Y, f(x))=\begin{cases}1, & Y \neq f(x) \\ 0, & Y = f(x)\end{cases} L(Y,f(x))={1,0,Y=f(x)Y=f(x)。在实际使用中,可适当放宽相等的条件,如 L ( Y , f ( x ) ) = { 1 , ∣ Y − f ( x ) ∣ ≥ T 0 , ∣ Y − f ( x ) ∣ < T L(Y, f(x))=\begin{cases}1, & |Y - f(x)| \geq T \\ 0, & |Y - f(x)| < T\end{cases} L(Y,f(x))={1,0,Yf(x)TYf(x)<T
  • 绝对值损失函数:与0 - 1损失函数相似,绝对值损失函数表示为 L ( Y , f ( x ) ) = ∣ Y − f ( x ) ∣ L(Y, f(x))=|Y - f(x)| L(Y,f(x))=Yf(x)
  • 平方损失函数:标准形式为 L ( Y , f ( x ) ) = ∑ N ( Y − f ( x ) ) 2 L(Y, f(x))=\sum_{N}(Y - f(x))^{2} L(Y,f(x))=N(Yf(x))2
  • 对数损失函数:标准形式为 L ( Y , P ( Y ∣ X ) ) = − log ⁡ P ( Y ∣ X ) L(Y, P(Y|X))=-\log P(Y|X) L(Y,P(YX))=logP(YX)。逻辑回归使用的就是对数损失函数,因为逻辑回归假设样本服从伯努利分布(0 - 1分布),通过推导得到的经验风险损失函数就是对数损失函数。
  • 指数损失函数:标准形式为 L ( Y , f ( x ) ) = exp ⁡ ( − Y f ( x ) ) L(Y, f(x))=\exp(-Yf(x)) L(Y,f(x))=exp(Yf(x)),例如AdaBoost就是以指数损失函数为损失函数的。
  • Hinge损失函数:标准形式为 L ( y ) = max ⁡ ( 0 , 1 − t y ) L(y)=\max(0, 1 - ty) L(y)=max(0,1ty),统一形式为 L ( Y , f ( x ) ) = max ⁡ ( 0 , Y f ( x ) ) L(Y, f(x))=\max(0, Yf(x)) L(Y,f(x))=max(0,Yf(x)),其中 y y y是预测值,范围为 ( − 1 , 1 ) (-1, 1) (1,1) t t t为目标值,取值为 -1或1。在线性支持向量机中,最优化问题可等价于 a r g min ⁡ w , b ∑ i = 1 N ( 1 − y i ( w x i + b ) ) + λ ∥ w ∥ 2 arg \min_{w, b}\sum_{i = 1}^{N}(1 - y_{i}(wx_{i}+b))+\lambda\| w\| ^{2} argw,bmini=1N(1yi(wxi+b))+λw2,其中 1 − y i ( w x i + b ) 1 - y_{i}(wx_{i}+b) 1yi(wxi+b)部分就是Hinge损失函数, ∥ w ∥ 2 \|w\|^{2} w2可看作正则项。

7.3 逻辑回归为什么使用对数损失函数

假设逻辑回归模型为 P ( y = 1 ∣ x , θ ) = 1 1 + e − θ T x P(y = 1|x, \theta)=\frac{1}{1 + e^{-\theta^{T}x}} P(y=1∣x,θ)=1+eθTx1,假设其概率分布是伯努利分布,概率质量函数为 P ( X = n ) = { 1 − p , n = 0 p , n = 1 P(X=n)=\begin{cases}1 - p, & n = 0 \\ p, & n = 1\end{cases} P(X=n)={1p,p,n=0n=1 。其似然函数为 L ( θ ) = ∏ i = 1 m P ( y = 1 ∣ x i ) y i P ( y = 0 ∣ x i ) 1 − y i L(\theta)=\prod_{i = 1}^{m}P(y = 1|x_{i})^{y_{i}}P(y = 0|x_{i})^{1 - y_{i}} L(θ)=i=1mP(y=1∣xi)yiP(y=0∣xi)1yi,对数似然函数为:
ln ⁡ L ( θ ) = ∑ i = 1 m [ y i ln ⁡ P ( y = 1 ∣ x i ) + ( 1 − y i ) ln ⁡ P ( y = 0 ∣ x i ) ] = ∑ i = 1 m [ y i ln ⁡ P ( y = 1 ∣ x i ) + ( 1 − y i ) ln ⁡ ( 1 − P ( y = 1 ∣ x i ) ) ] \ln L(\theta)=\sum_{i = 1}^{m}[y_{i}\ln P(y = 1|x_{i})+(1 - y_{i})\ln P(y = 0|x_{i})]=\sum_{i = 1}^{m}[y_{i}\ln P(y = 1|x_{i})+(1 - y_{i})\ln (1 - P(y = 1|x_{i}))] lnL(θ)=i=1m[yilnP(y=1∣xi)+(1yi)lnP(y=0∣xi)]=i=1m[yilnP(y=1∣xi)+(1yi)ln(1P(y=1∣xi))]
对数函数在单个数据点上的定义为 C o s t ( y , p ( y ∣ x ) ) = − y ln ⁡ p ( y ∣ x ) − ( 1 − y ) ln ⁡ ( 1 − p ( y ∣ x ) ) Cost(y, p(y|x))=-y\ln p(y|x)-(1 - y)\ln (1 - p(y|x)) Cost(y,p(yx))=ylnp(yx)(1y)ln(1p(yx)),则全局样本损失函数为 c o s t ( y , p ( y ∣ x ) ) = − ∑ i = 1 m [ y i ln ⁡ p ( y i ∣ x i ) + ( 1 − y i ) ln ⁡ ( 1 − p ( y i ∣ x i ) ) ] cost(y, p(y|x))=-\sum_{i = 1}^{m}[y_{i}\ln p(y_{i}|x_{i})+(1 - y_{i})\ln (1 - p(y_{i}|x_{i}))] cost(y,p(yx))=i=1m[yilnp(yixi)+(1yi)ln(1p(yixi))]。由此可见,对数损失函数与极大似然估计的对数似然函数本质上是相同的,所以逻辑回归直接采用对数损失函数。

7.4 对数损失函数如何度量损失

以高斯分布为例,在确定均值和标准差时,常用极大似然估计方法。极大似然的目标是找到能使观测到数据的概率最大化的参数值。假设观测到每个数据点的概率相互独立,对联合概率取自然对数。假设观测到单个数据点 x j ( j = 1 , 2 , ⋯   , m ) x_{j}(j = 1,2,\cdots,m) xj(j=1,2,,m)的概率为 P ( x i ; μ , σ ) = 1 σ 2 π exp ⁡ ( − ( x i − μ ) 2 2 σ 2 ) P(x_{i};\mu, \sigma)=\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{(x_{i}-\mu)^{2}}{2\sigma^{2}}\right) P(xi;μ,σ)=σ2π 1exp(2σ2(xiμ)2),其联合概率为:
P ( x 1 , x 2 , ⋯   , x n ; μ , σ ) = 1 σ 2 π exp ⁡ ( − ( x 1 − μ ) 2 2 σ 2 ) × 1 σ 2 π exp ⁡ ( − ( x 2 − μ ) 2 2 σ 2 ) × ⋯ × 1 σ 2 π exp ⁡ ( − ( x n − μ ) 2 2 σ 2 ) P(x_{1}, x_{2},\cdots, x_{n};\mu, \sigma)=\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{(x_{1}-\mu)^{2}}{2\sigma^{2}}\right)\times\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{(x_{2}-\mu)^{2}}{2\sigma^{2}}\right)\times\cdots\times\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{(x_{n}-\mu)^{2}}{2\sigma^{2}}\right) P(x1,x2,,xn;μ,σ)=σ2π 1exp(2σ2(x1μ)2)×σ2π 1exp(2σ2(x2μ)2)××σ2π 1exp(2σ2(xnμ)2)
对上式取自然对数并化简可得:
ln ⁡ ( P ( x 1 , x 2 , ⋯   , x n ; μ , σ ) ) = − n ln ⁡ ( σ ) − n 2 ln ⁡ ( 2 π ) − 1 2 σ 2 [ ( x 1 − μ ) 2 + ( x 2 − μ ) 2 + ⋯ + ( x n − μ ) 2 ] \ln\left(P(x_{1}, x_{2},\cdots, x_{n};\mu, \sigma)\right)=-n\ln(\sigma)-\frac{n}{2}\ln(2\pi)-\frac{1}{2\sigma^{2}}[(x_{1}-\mu)^{2}+(x_{2}-\mu)^{2}+\cdots+(x_{n}-\mu)^{2}] ln(P(x1,x2,,xn;μ,σ))=nln(σ)2nln(2π)2σ21[(x1μ)2+(x2μ)2++(xnμ)2]
然后求导,令对数损失函数为0,可计算出均值 μ \mu μ的值,同理可计算标准差 σ \sigma σ

八、梯度下降法

8.1 梯度下降法的作用

梯度下降法是机器学习中常用的优化算法,具有以下重要作用:

  • 它是迭代法的一种,可用于求解最小二乘问题。
  • 在求解机器学习算法的模型参数(无约束优化问题)时,梯度下降法是常用的方法之一,另一种常用方法是最小二乘法。
  • 通过梯度下降法可以迭代求解损失函数的最小值,从而得到最小化的损失函数和模型参数值。
  • 如果需要求解损失函数的最大值,可以通过梯度上升法来迭代,梯度下降法和梯度上升法可相互转换。

8.2 梯度下降法的直观理解

可以将梯度下降法想象成在山上寻找下山路径的过程。假设我们在山上的某个位置,不知道下山的路,只能凭借直觉摸索前进。在每一个位置,我们都会计算当前位置的梯度,然后沿着梯度的负方向,也就是最陡峭的下山方向走一步,接着再次计算新位置的梯度,继续朝着最陡峭的方向前进,不断重复这个过程,直到我们认为到达了山脚。但这个过程可能只会找到局部的山势低处,不一定能找到全局的最优解(山脚)。不过,如果损失函数是凸函数,那么梯度下降法得到的解就一定是全局最优解。其核心思想包括初始化参数、迭代计算(计算当前梯度、修改变量、朝最陡的下坡方向走一步、判断是否终止),最终得到全局最优解或者接近全局最优解。

8.3 梯度下降法算法描述

梯度下降法的算法步骤如下:

  1. 确定优化模型的假设函数及损失函数:对于线性回归,假设函数为 h b ( x 1 , x 2 , ⋯   , x n ) = θ 0 + θ 1 x 1 + ⋯ + θ n x n h_{b}(x_{1}, x_{2},\cdots, x_{n})=\theta_{0}+\theta_{1}x_{1}+\cdots+\theta_{n}x_{n} hb(x1,x2,,xn)=θ0+θ1x1++θnxn,损失函数为 J ( θ 0 , θ 1 , ⋯   , θ n ) = 1 2 m ∑ j = 0 m ( h 0 ( x 0 j , x 1 j , ⋯   , x n j ) − y j ) 2 J(\theta_{0}, \theta_{1},\cdots, \theta_{n})=\frac{1}{2m}\sum_{j = 0}^{m}(h_{0}(x_{0}^{j}, x_{1}^{j},\cdots, x_{n}^{j}) - y_{j})^{2} J(θ0,θ1,,θn)=2m1j=0m(h0(x0j,x1j,,xnj)yj)2
  2. 相关参数初始化:主要初始化 θ i \theta_{i} θi、算法迭代步长 α \alpha α、终止距离 ζ \zeta ζ。初始化时可以根据经验进行,如将 θ i \theta_{i} θi初始化为0,步长 α \alpha α初始化为1,当前步长记为 φ i \varphi_{i} φi,也可随机初始化。
  3. 迭代计算:计算当前位置损失函数的梯度,对于 θ i \theta_{i} θi,其梯度表示为 ∂ ∂ θ i J ( θ 0 , θ 1 , ⋯   , θ n ) = 1 2 m ∑ j = 0 m ( h b ( x 0 j , x 1 j , ⋯   , x n j ) − y j ) 2 \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1}, \cdots, \theta_{n}\right)=\frac{1}{2 m} \sum_{j=0}^{m}\left(h_{b}\left(x_{0}^{j}, x_{1}^{j}, \cdots, x_{n}^{j}\right)-y_{j}\right)^{2} θiJ(θ0,θ1,,θn)=2m1j=0m(hb(x0j,x1j,,xnj)yj)2。计算当前位置下降的距离 φ i = α ∂ ∂ θ i J ( θ 0 , θ 1 , ⋯   , θ n ) \varphi_{i}=\alpha \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1}, \cdots, \theta_{n}\right) φi=αθiJ(θ0,θ1,,θn) 。判断是否终止,确定是否所有 θ i \theta_{i} θi的梯度下降距离 φ i \varphi_{i} φi都小于终止距离 ζ \zeta ζ ,如果都小于 ζ \zeta ζ,则算法终止,此时 θ i \theta_{i} θi的值为最终结果,否则更新所有的 θ i \theta_{i} θi ,更新后的表达式为 θ i = θ i − α ∂ ∂ θ i J ( θ 0 , θ 1 , ⋯   , θ n ) = θ i − α 1 m ∑ j = 0 m ( h b ( x 0 j , x 1 j , ⋯   , x n j ) − y j ) x i j \theta_{i}=\theta_{i}-\alpha \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1}, \cdots, \theta_{n}\right)=\theta_{i}-\alpha \frac{1}{m} \sum_{j=0}^{m}\left(h_{b}\left(x_{0}^{j}, x_{1}^{j}, \cdots, x_{n}^{j}\right)-y_{j}\right) x_{i}^{j} θi=θiαθiJ(θ0,θ1,,θn)=θiαm1j=0m(hb(x0j,x1j,,xnj)yj)xij ,更新完毕后转入步骤(1)。

8.4 梯度下降法的缺点

梯度下降法存在一些不足之处:

  1. 收敛速度减慢:靠近极小值时,梯度值会变小,导致收敛速度减慢,迭代次数增加,训练时间变长。
  2. 直线搜索问题:直线搜索时可能会产生一些问题,例如在某些复杂的函数地形中,可能会错过最优解。
  3. “之”字形下降:在迭代过程中,可能会以“之”字形下降,导致搜索路径不够直接,影响收敛效率。

同时,需要注意梯度的概念:

  1. 梯度是一个向量,既有方向又有大小。
  2. 梯度的方向是最大方向导数的方向。
  3. 梯度的值是最大方向导数的值。

8.5 如何对梯度下降法进行调优

在实际使用梯度下降法时,需要对其进行调优,主要体现在以下几个方面:

  1. 算法迭代步长α的选择:步长 α \alpha α的取值对算法的收敛速度和结果有重要影响。初始化时可根据经验取值,但实际取值取决于数据样本。可以从大到小尝试多个值,运行算法查看迭代效果。如果损失函数在变小,则取值有效;若取值无效,说明步长可能过小,需要增大步长。然而,步长太大可能会导致迭代速度过快,错过最优解;步长太小则会使迭代速度变慢,算法运行时间长。
  2. 参数的初始值选择:初始值不同,获得的最小值也可能不同。由于梯度下降法有可能得到局部最小值,如果损失函数是凸函数,那么得到的一定是最优解。但为了避免陷入局部最优,需要多次用不同初始值运行算法,最终选择使损失函数最小化的初值。
  3. 标准化处理:样本的特征取值范围不同可能会导致迭代速度慢。为了减小特征取值的影响,可以对特征数据进行标准化处理,使新数据的数学期望为0,新方差为1,这样能节省算法运行时间,提高收敛速度。

8.6 随机梯度下降和批量梯度下降的区别

随机梯度下降(Stochastic GD,SGD)和批量梯度下降(Batch GD,BGD)是两种主要的梯度下降法,目的是加速运算求解过程。

  1. 随机梯度下降法的求解思路:随机梯度下降法中损失函数对应的是训练集中每个样本的粒度。损失函数可以写成 J ( θ 0 , θ 1 , ⋯   , θ n ) = 1 m ∑ j = 0 m ( y j − h b ( x 0 j , x 1 j , ⋯   , x n j ) ) 2 = 1 m ∑ j = 0 m C o s t ( θ , ( x j , y j ) ) J\left(\theta_{0}, \theta_{1}, \cdots, \theta_{n}\right)=\frac{1}{m} \sum_{j=0}^{m}\left(y^{j}-h_{b}\left(x_{0}^{j}, x_{1}^{j}, \cdots, x_{n}^{j}\right)\right)^{2}=\frac{1}{m} \sum_{j=0}^{m} Cost\left(\theta,\left(x^{j}, y^{j}\right)\right) J(θ0,θ1,,θn)=m1j=0m(yjhb(x0j,x1j,,xnj))2=m1j=0mCost(θ,(xj,yj)) 。对每个参数 θ i \theta_{i} θi按梯度方向更新 θ i = θ i + ( y j − h 0 ( x 0 j , x 1 j , ⋯   , x n j ) ) x i j \theta_{i}=\theta_{i}+\left(y^{j}-h_{0}\left(x_{0}^{j}, x_{1}^{j}, \cdots, x_{n}^{j}\right)\right) x_{i}^{j} θi=θi+(yjh0(x0j,x1j,,xnj))xij ,通过每个样本来迭代更新一次。其优点是训练速度快,但伴随的问题是噪声较批量梯度下降法要多,使得随机梯度下降法并不是每次迭代都向着整体最优化方向。
  2. 批量梯度下降法的求解思路:首先得到每个 θ \theta θ对应的梯度 ∂ ∂ θ i J ( θ 0 , θ 1 , ⋯   , θ n ) = 1 m ∑ j = 0 m ( h 0 ( x 0 j , x 1 j , ⋯   , x n j ) − y j ) x j j \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1}, \cdots, \theta_{n}\right)=\frac{1}{m} \sum_{j=0}^{m}\left(h_{0}\left(x_{0}^{j}, x_{1}^{j}, \cdots, x_{n}^{j}\right)-y^{j}\right) x_{j}^{j} θiJ(θ0,θ1,,θn)=m1j=0m(h0(x0j,x1j,,xnj)yj)xjj ,然后按每个参数 θ i \theta_{i} θi的梯度负方向更新 θ i = θ i − 1 m ∑ j = 0 m ( h 0 ( x 0 j , x 1 j , ⋯   , x n j ) − y j ) x i j \theta_{i}=\theta_{i}-\frac{1}{m} \sum_{j=0}^{m}\left(h_{0}\left(x_{0}^{j}, x_{1}^{j}, \cdots, x_{n}^{j}\right)-y^{j}\right) x_{i}^{j} θi=θim1j=0m(h0(x0j,x1j,,xnj)yj)xij 。这种方法得到的是一个最优解,但每迭代一步,都要用到训练集所有的数据,如果样本数据很大,迭代速度就很慢。

随机梯度下降法和批量梯度下降法相对来说都比较极端,简单对比如下:

方 法特 点
随机梯度下降1. 采用单个数据来进行梯度下降。2. 训练速度很快。3. 仅仅用一个样本决定梯度方向,得到的值有可能不是全局最优解。4. 就收敛速度来说,一次迭代一个样本,导致迭代方向变化很大,不能很快地收敛到局部最优解
批量梯度下降1. 用所有数据来进行梯度下降。2. 在样本量很大的时候,训练速度慢
  1. 小批量梯度下降法的求解思路:为了结合两种方法的优点,出现了小批量(Mini - Batch)梯度下降法。对于总数为 m m m的样本数据,选取其中的 n ( 1 < n < m ) n(1 < n < m) n(1<n<m)个子样本来迭代。其参数 θ \theta θ按梯度方向更新 θ i = θ i − α ∑ j = t t + n − 1 ( h 0 ( x 0 j , x 1 j , ⋯   , x n j ) − y j ) x i j \theta_{i}=\theta_{i}-\alpha \sum_{j=t}^{t + n - 1}\left(h_{0}\left(x_{0}^{j}, x_{1}^{j}, \cdots, x_{n}^{j}\right)-y^{j}\right) x_{i}^{j} θi=θiαj=tt+n1(h0(x0j,x1j,,xnj)yj)xij

8.7 各种梯度下降法性能比较

不同梯度下降法的性能对比如下表所示:

BGDSGDMini-batch GDOnline GD
训练集固定固定固定实时更新
单次迭代样本数整个训练集单个样本训练集的子集根据具体算法定
算法复杂度
时效性
收敛性稳定不稳定较稳定不稳定

这里介绍一下Online GD。Online GD与Mini - batch GD、SGD的区别在于,所有训练数据只用一次,然后丢弃。这样做的优点在于可预测最终模型的变化趋势。Online GD在互联网领域用得较多,比如搜索广告的点击率(CTR)预估模型,网民的点击行为会随着时间改变。用普通的BGD算法(每天更新一次)一方面耗时较长(需要对所有历史数据重新训练);另一方面,无法及时反馈用户的点击行为迁移。而Online GD算法可以实时地依据网民的点击行为进行迁移。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发工具-jetbrains使用技巧

更详细的可以看 狂神说Java】JavaWeb入门到实战 p6 idea中maven的操作 可以设置怎么调试 然后还可以wsl、远程方式等运行 maven 这里的相当于cmd的操作 命令行去执行这些东西

HarmonyOS:页面滚动时标题悬浮、背景渐变

一、需求场景 进入到app首页或者分页列表首页时&#xff0c;随着页面滚动&#xff0c;分类tab要求固定悬浮在顶部。进入到app首页、者分页列表首页、商品详情页时&#xff0c;页面滚动时&#xff0c;顶部导航栏&#xff08;菜单、标题&#xff09;背景渐变。 二、相关技术知识点…

信息系统项目管理师-第十八章-项目绩效域

本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 在整个生命周期过程中,项目管理者需要始终坚持项目管理原则,通过涵盖 10 …

[NOIP 2003 普及组] 栈 Java

import java.io.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br new BufferedReader(new InputStreamReader(System.in));int n Integer.parseInt(br.readLine());int[] dp new int[n 1];dp[0] 1; // 空序列只有一种…

面试篇 - Transformer模型中的位置编码

1. 位置编码的引入 背景&#xff1a;Transformer模型通过自注意力机制&#xff08;Self-Attention&#xff09;处理序列数据&#xff0c;但自注意力机制本身并不包含序列中元素的位置信息。因此&#xff0c;需要一种方法来为模型提供位置信息。 解决方案&#xff1a;位置编码&…

vue+flask图书知识图谱推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 编号: F025 架构: vueflaskneo4jmysql 亮点&#xff1a;协同过滤推荐算法知识图谱可视化 支持爬取图书数据&#xff0c;数据超过万条&am…

vue2 走马灯 展示多个

使用 npm install “swiper”: “^11.2.4”, 在这里插入代码片 <template><section class"swiper pc-banner"><div class"swiper-container"><div class"swiper-wrapper"><div v-for"(item, index) in swiperD…

《MySQL从入门到精通》

文章目录 《MySQL从入门到精通》1. 基础-SQL通用语法及分类2. 基础-SQL-DDL-数据库操作3. 基础-SQL-DDL-表操作-创建&查询4. 基础-SQL-DDL-数据类型及案例4.1 数值类型4.2 字符串类型4.3 时间和日期类型 5. 基础-SQL-DDL-表操作-修改&删除5.1 DDL-表操作-修改5.2 DDL-表…

Linux: 线程同步

目录 一 前言 二 线程饥饿 三 线程同步 四 条件变量 1. cond &#xff08; condition&#xff09; 2. pthread_cond_wait() &#xff1a; 3. pthread_cond_signal() 五 条件变量的使用 一 前言 在上篇文章Linux : 多线程互斥-CSDN博客我们讲解了线程互斥的概念&#xff…

golang-context详解

Context是什么 cancel 其实就是通过chan select进行提前中断返回 如果没有context&#xff0c;携程之间怎么做这些交互呢&#xff1f;肯定也能做 跨线程通讯如共享内存&#xff0c;pipe等等都可以做到&#xff0c;但是就需要开发者对通讯设计建模、规划数据同步方式等&#xf…

Spring Boot 集成 RocketMQ 全流程指南:从依赖引入到消息收发

前言 在分布式系统中&#xff0c;消息中间件是解耦服务、实现异步通信的核心组件。RocketMQ 作为阿里巴巴开源的高性能分布式消息中间件&#xff0c;凭借其高吞吐、低延迟、高可靠等特性&#xff0c;成为企业级应用的首选。而 Spring Boot 通过其“约定优于配置”的设计理念&a…

AI与我共创WEB界面

记录一次压测后的自我技术提升 这事儿得从机房停电说起。那天吭哧吭哧做完并发压测,正准备截Zabbix监控图写报告,突然发现监控曲线神秘失踪——系统组小哥挠着头说:“上次停电后,zabbix服务好像就没起来过…” 我盯着空荡荡的图表界面,大脑的CPU温度可能比服务器还高。 其…

基于频率约束条件的最小惯量需求评估,包括频率变化率ROCOF约束和频率最低点约束matlab/simulink

基于频率约束条件的最小惯量评估&#xff0c;包括频率变化率ROCOF约束和频率最低点约束matlab/simulink 1建立了含新能源调频的频域仿真传函模型&#xff0c;虚拟惯量下垂控制 2基于构建的模型&#xff0c;考虑了不同调频系数&#xff0c;不同扰动情况下的系统最小惯量需求

深入理解浏览器的 Cookie:全面解析与实践指南

在现代 Web 开发中&#xff0c;Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好&#xff0c;还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富&#xff0c;Cookie 的使用和管理也日趋复杂&#xff0c;如何在保障…

Java 正则表达式综合实战:URL 匹配与源码解析

在 Web 应用开发中&#xff0c;我们经常需要对 URL 进行格式验证。今天我们结合 Java 的 Pattern 和 Matcher 类&#xff0c;深入理解正则表达式在实际应用中的强大功能&#xff0c;并剖析一段实际的 Java 示例源码。 package com.RegExpInfo;import java.util.regex.Matcher; …

【C++】前向声明(Forward Declaration)

前向声明&#xff08;Forward Declaration&#xff09;是在C、C等编程语言中&#xff0c;在使用一个类、结构体或其他类型之前&#xff0c;仅声明其名称而不给出完整定义的一种方式。 作用 减少编译依赖&#xff1a;当一个源文件包含大量头文件时&#xff0c;编译时间会显著增…

numpy.ma.masked_where:屏蔽满足条件的数组

1.函数功能 屏蔽满足条件的数组内容&#xff0c;返回值为掩码数组 2.语法结构 np.ma.masked_where(condition, a, copyTrue)3. 参数 参数含义condition屏蔽条件a要操作的数组copy布尔值&#xff0c;取值为True时&#xff0c;结果复制数组(原始数据不变)&#xff0c;否则返回…

【解决】bartender软件换网之后神秘变慢

下的山寨版本bartender软件&#xff0c;用着一直都挺好&#xff0c;结果一次换网之后&#xff0c;启动&#xff0c;排版&#xff0c;打印各种动作都要转个几分钟才行&#xff0c;非常奇怪。直接说解决过程。 首先联想网络没有动以及脱机的时候&#xff0c;都没有这个问题。那么…

[福游宝——AI智能旅游信息查询平台]全栈AI项目-阶段二:聊天咨询业务组件开发

简言 本项目旨在构建一个以AI智能体为核心的福建省旅游信息查询系统&#xff0c;聚焦景点推荐、路线规划、交通天气查询等功能&#xff0c;为游客提供智能化、便捷化的旅游信息服务。项目采用前后端分离架构&#xff0c;前端基于Vite TypeScript Vue3技术栈&#xff0c;搭配…