当前位置: 首页 > news >正文

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

摘要

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

一、引言

机器学习作为人工智能的核心领域,近年来发展迅猛,广泛应用于图像识别、自然语言处理、数据分析等诸多方面。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算法可以实时地依据网民的点击行为进行迁移。

相关文章:

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

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

信奥赛之c++基础(for与if的嵌套使用)

🍭 糖果工厂大闯关——for与if的嵌套魔法 🚚 第一章:快递站的故事(情景引入) 📦 快递分拣员小明 快递站每天要处理100个包裹,小明发现: 有些包裹要立即派送(红色标签)有些包裹可以暂存仓库(蓝色标签)for (int 包裹号=1; 包裹号<=100; 包裹号++) {if (包裹颜…...

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日&#xff0c;备受瞩目的QCon开发者技术峰会盛大举行&#xff0c;本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题&#xff0c;汇聚了众多鸿蒙生态的领军人物与技术专家&#xff0c;共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…...

day25 学习笔记

文章目录 前言一、图像翻转二、图像的仿射变换1.仿射变换的原理2.仿射变换函数3.图像旋转4.图像平移5.图像缩放6.图像剪切 三、插值方法1.最近领插值2.双线性插值法3.双三次插值4.代码展示 前言 通过今天的学习&#xff0c;我掌握了OpenCV中有关图像翻转&#xff0c;图像仿射变…...

Docker构建go-web应用

https://www.liwenzhou.com/posts/Go/deploy-in-docker/#c-0-4-0 本文介绍了如何使用Docker以及Docker Compose部署我们的 Go Web 程序。 Docker部署示例 准备代码 这里我先用一段使用net/http库编写的简单代码为例讲解如何使用Docker进行部署&#xff0c;后面再讲解稍微复杂…...

人工智能100问☞第4问:人工智能与机器学习、深度学习的区别?

目录 一、通俗解释 二、专业解析 三、权威参考 人工智能(AI)是目标​​:让机器具备智能(如建造一辆车);机器学习(ML)是引擎​​:提供动力方法(如燃油发动机);深度学习(DL)是涡轮增压​​:提升引擎性能(如处理复杂路况)。三者协同驱动技术发展,如同车辆需要…...

电子电器架构 --- 智能座舱的定义

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

JavaScript Map 对象深度解剖

JavaScript Map 对象深度解剖 一、Map 核心特性 1.1 什么是 Map&#xff1f; 通俗解释&#xff1a; Map 就像是一个“超级版对象”&#xff0c;它用更灵活的方式存储键值对。举个生活例子&#xff1a; 普通对象&#xff08;Object&#xff09;像一本传统电话簿&#xff0c;…...

zlm启用webrtc交叉编译指南

zlm启用webrtc交叉编译指南 一、交叉编译openssl 下载openssl-1.1.1k版本&#xff0c;其他版本可能会有问题 $ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz $ tar -xvzf openssl-1.1.1k.tar.gz $ cd openssl-1.1.1k $ ./config no-asm shared --openssld…...

树莓派超全系列教程文档--(23)内核参数

内核参数 内核命令行 (cmdline.txt)命令行选项标准条目设置KMS显示模式 其他条目 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 内核命令行 (cmdline.txt) Linux 内核在启动过程中接受一系列命令行参数。在 Raspberry Pi 上&#xff0c;该命令…...

机器学习 从入门到精通 day_05

1. 线性回归 前面介绍了很多分类算法&#xff0c;分类的目标变量是标称型数据&#xff0c;回归是对连续型的数据做出预测。 标称型数据&#xff08;Nominal Data&#xff09;是统计学和数据分析中的一种数据类型&#xff0c;它用于分类或标记不同的类别或组别,数据点之间并没有…...

读者、写者问题优化

#include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define NUM_READERS 5 #define NUM_WRITERS 5 // 定义信号量和全局变量 sem_t sdata, srcount; int rea…...

DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析

DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析 DeepSeek作为中国人工智能领域的重要参与者&#xff0c;推出了V3和R1两款大模型&#xff0c;它们在架构设计和应用场景上各有侧重。本文将深入分析这两款模型在架构原理上的核心差异&#xff0c;并探讨它们如何分别应对复杂推…...

OpenCV图像增强实战教程:从理论到代码实现

OpenCV图像增强实战教程&#xff1a;从理论到代码实现 &#x1f525;&#x1f680; &#x1f4da; 想要掌握图像增强的核心技术&#xff1f;本文手把手教你使用OpenCV实现多种图像增强技术&#xff0c;从基础的线性变换到高级的频域滤波&#xff0c;全方位提升你的图像处理能力…...

一文介绍关于多模态的基础知识 !!

文章目录 前言 一、机器学习 二、深度学习 三、应用领域 前言 多模态不再局限于单一类型的数据处理&#xff0c;它融合图像、文本和音频等多种信息源。其基础知识涵盖机器学习、深度学习及其在多模态领域的应用。机器学习部分包含分类、回归、聚类和降维等四类算法&#xff1b…...

mysql DQL

一.基本查询 1.查询多个字段 2.查看所有字段 3.设置别名 4.去除重复记录 二.条件查询 1.大于小于等于 2.查询 身份证为空的 没有所以没有记录 3.在15到20这个区间范围内 4.or/in 或者 4.like 匹配 &#xff08;_匹配单个字符 %匹配多个字符&#xff09; 查询员工信…...

Android Studio 项目文件夹结构详解

文章目录 一、项目视图概览1. Android 视图&#xff08;简化视图&#xff09;2. Project 视图&#xff08;完整物理结构&#xff09; 二、核心目录详解1. 项目根目录文件2. app 模块目录&#xff08;主模块&#xff09;2.1 manifests/2.2 java/2.3 res/ - 资源目录2.4 assets/2…...

Linux系统常见磁盘扩容操作(Common Disk Expansion Operations in Linux Systems)

Linux系统常见磁盘扩容操作 目录说明 一、准备工作&#xff1a;获取目标磁盘信息 &#xff08;1&#xff09;确认分区表格式和文件系统 二、扩容已有MBR分区 &#xff08;1&#xff09;分区后扩容 ext为例 xfs为例 三、扩容已有GPT分区 &#xff08;1&#xff09;分区…...

【UE5 C++】“ProceduralMeshComponent”的使用记录

效果 如下所示&#xff0c;通过“ProceduralMeshComponent”创建了一个自定义形状的Mesh&#xff0c;并且该Mesh包含碰撞信息&#xff0c;然后2s后更新Mesh形状。 步骤 1. 在“xxx.Build.cs”中引入“ProceduralMeshComponent”模块 2. 新建一个Actor类&#xff0c;这里命名为…...

源代码加密之零日攻击

# SDC沙盒&#xff1a;有效防御零日攻击的多层防护体系 在当今复杂多变的网络安全环境中&#xff0c;零日攻击已成为企业面临的重大威胁之一。零日攻击利用尚未被公众发现或尚未被软件供应商修复的漏洞进行攻击&#xff0c;具有极高的隐蔽性和破坏性。SDC沙盒作为一种先进的数…...

Vue2 集成VTK.js 并显示3D影像

Vue2 集成VTK.js 并显示3D影像&#xff08;核心代码) 作者:coder_fang vtk.js目前官网只有vue3的示例&#xff0c;对于已有vue2系统的集成&#xff0c;需要使用指定版本的vtk,itk等库并修改部分配置即可。 需要的主要库和版本: vue:2.3.4; vtk-v32.9.0.min.js,itk-wasm.min.…...

本地git操作

一、初始化与基础操作 1. 初始化仓库 git init # 当前目录新建仓库 git init <目录名> # 指定目录初始化 2. 查看状态 git status # 显示工作区和暂存区状态 git status -s # 简洁版状…...

AI的出现,是否能替代IT从业者?

*AI在IT领域中的应用已成趋势&#xff0c;IT 从业者们站在这风暴之眼&#xff0c;面临着一个尖锐问题&#xff1a;AI 是否会成为 “职业终结者”&#xff1f;有人担忧 AI 将取代 IT 行业的大部分工作&#xff0c;也有人坚信 IT 从业者的专业技能与创新思维无可替代。那么&#…...

3、组件:魔法傀儡的诞生——React 19 组件化开发全解析

一、开篇&#xff1a;魔法傀儡的觉醒 "每个React组件都像一具魔法傀儡&#xff0c;"邓布利多校长挥动魔杖&#xff0c;空中浮现出闪烁的代码字符&#xff0c;"它们能自主思考、协同工作&#xff0c;甚至能跨越时空&#xff08;服务器与客户端&#xff09;执行任…...

Vue 解决 Error: please transfer a valid prop path to form item!

在 Vue.js 中使用表单验证库&#xff08;如 VeeValidate 或 Element UI 的表单组件时&#xff09;&#xff0c;遇到错误信息 "please transfer a valid prop path to form item!" 通常指的是在表单项的属性绑定中&#xff0c;路径&#xff08;prop path&#xff09;不…...

day29 第八章 贪心算法 part03

134. 加油站 “可以换一个思路&#xff0c;首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈&#xff0c;说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 i从0开始累加rest[i]&#xff0c;和记为curSum…...

贪心算法(19)(java)重构字符串

题目&#xff1a;给定一个字符串 s &#xff0c;检查是否能重新排布其中的字母&#xff0c;使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行&#xff0c;返回空字符串 "" 。 示例 1: 输入: s "aab" 输出: "aba"示例 2: 输入:…...

Linux下C语言与OpenGL游戏开发指南

1. 为什么选择 Linux C OpenGL&#xff1f; 跨平台兼容性&#xff1a;OpenGL 是跨平台的图形 API&#xff0c;编写的代码稍作修改即可在 Windows/macOS 上运行。 性能控制&#xff1a;C 语言提供底层内存管理和硬件访问能力&#xff0c;适合高性能游戏开发。 开源生态&…...

深入 Java 正则表达式源码:透视 Matcher.group(int) 的分组提取机制

在 Java 中&#xff0c;正则表达式无疑是文本处理的重要工具。而 Matcher.group(int group) 是其中非常关键的一个方法&#xff0c;它用于提取正则中的分组内容。今天我们不仅通过一个例子来看它的使用方法&#xff0c;还会结合底层源码&#xff0c;深入理解它背后的机制。 实…...

解决 Spring Boot 启动报错:数据源配置引发的启动失败

启动项目时&#xff0c;控制台输出了如下错误信息&#xff1a; Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 2025-04-14 21:13:33.005 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporte…...

【深度学习的骨架与脉搏】语义分割的卷积神经网络·U-Net

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 …...

ELK+Filebeat 深度部署指南与实战测试全解析

一、介绍 ELK&#xff1a; ELasticsearch ,Logstash,Kibana三大开源框架首字母简写,市面上也被称为Elastic Stack。 Elasticsearch 是一个基于 Lucene 的分布式搜索平台框架&#xff0c;通过 Restful 方式进行交互&#xff0c;具备近实时搜索能力。像百度、Google 这类大数据全…...

Java设计模式之中介者模式:从入门到架构级实践

一、什么是中介者模式&#xff1f; 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是通过引入一个中介对象来封装多个对象之间的交互关系。这种模式将原本复杂的网状通信结构转换为星型结构&#xff0c;类似于现实生活中的机…...

L2TP通道基础实验

目录 实验拓扑&#xff1a; 一、需求配置LAC设置&#xff1a; 界面设置&#xff1a; ​编辑LNS设置&#xff1a; 建立静态路由&#xff1a;​编辑 策略配置&#xff1a; 二、测试 通讯测试&#xff1a; 实验拓扑&#xff1a; 一、需求配置 LAC设置&#xff1a; [LAC]l2…...

关于字节跳动旗下的豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析

以下是关于豆包&#xff08;DouBao&#xff09;软件的详解、核心功能以及与同类产品的对比分析&#xff1a; 一、豆包&#xff08;DouBao&#xff09;详解 豆包是字节跳动推出的一款多功能人工智能助手&#xff0c;主打“智能助手场景化工具”结合&#xff0c;覆盖日常生活、…...

如何在本地修改 Git 项目的远程仓库地址

✅ 场景说明 你当前的 Git 项目地址是&#xff1a; http://192.168.0.16/xxx.git你希望把它改成&#xff1a; http://192.168.0.22:8099/xxx.git&#x1f9e9; 操作步骤 步骤 ①&#xff1a;进入项目所在目录 你已经在正确路径下了&#xff1a; cd C:\Develop\xxx确认这个…...

Gitea 1.23.7 速配

复用容器内的postgresql CREATE USER gitea WITH PASSWORD gitea; CREATE DATABASE gitea; GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea; docker-compose.yml 内容 gitea:image: gitea/gitea:latestcontainer_name: giteaenvironment:- GITEA__server__HTTP_ADDR0.0.0.…...

JavaScript — 函数定义

介绍 JavaScript函数是执行特定任务的代码块&#xff0c;可通过多种方式定义。传统函数声明使用function关键字&#xff0c;后接函数名和参数列表&#xff0c;这种声明会被提升至作用域顶部。函数表达式则将匿名或具名函数赋值给变量&#xff0c;遵循变量作用域规则&#xff0…...

Allure安装与使用【macOS】

安装&#xff1a; brew install allure 安装插件&#xff1a; pip install allure-pytest2.8.16 生成一个html格式的报告&#xff0c;步骤&#xff1a; 执行生成json&#xff0c;制定结果保存目录 pytest --alluredirreport test_demo.py 查看测试保报告方式 将json转成h…...

​‌FireCrawl‌爬虫工具​, Craw4ai

‌FireCrawl‌是一款开源的AI爬虫工具&#xff0c;专门用于Web数据提取&#xff0c;并将其转换为Markdown格式或其他结构化数据。FireCrawl特别适合处理使用JavaScript动态生成的网站&#xff0c;能够自动抓取网站及其所有可访问的子页面内容&#xff0c;并将其转换为适合大语言…...

【Python爬虫】详细入门指南

目录 一、简单介绍 二、详细工作流程以及组成部分 三、 简单案例实现 一、简单介绍 在当今数字化信息飞速发展的时代&#xff0c;数据的获取与分析变得愈发重要&#xff0c;而网络爬虫技术作为一种能够从互联网海量信息中自动抓取所需数据的有效手段&#xff0c;正逐渐走入…...

Cesium.Cesium3DTileset设置贴地,tileset.readyPromise.then报错

tileset.readyPromise.then(function(tileset) { }); 用的readyPromise函数&#xff0c;却报错了&#xff0c;通过参考别人的博客内容发现最终修改的是 modelMatrix这个参数的内容&#xff0c;所以直接舍弃使用readyPromise函数&#xff0c;在代码中等 viewer.scene.primitiv…...

卫星电话扬帆智慧海洋,构筑蓝海通信新生态

海洋&#xff0c;承载着全球90%的贸易运输量&#xff0c;更是我国“向海图强”战略的核心战场。但是&#xff0c;全球95%的海洋区域仍处于蜂窝网络覆盖的“真空地带”&#xff0c;近海信号不稳、远洋通信中断的难题长期制约着海洋经济的纵深发展。技术革新是推动发展的强大引擎…...

大模型不是在推理,只是在复述??

目的 看见一篇论文Recitation over Reasoning: How Cutting-Edge Language Models Can Fail on Elementary School-Level Reasoning Problems?&#xff0c;论文中建立了一个推理题库&#xff0c;通过将推理问题进行改写&#xff08;通过只改写几个字&#xff0c;颠覆整个问题…...

安全编码课程 实验7 并发

实验项目&#xff1a;C 多线程中的数据竞争与同步机制 实验要求&#xff1a; 1. 编写基础代码&#xff1a;模拟账户余额取款 创建一个全局共享变量 int balance 100&#xff0c;表示初始余额&#xff1b; 创建两个线程 Thread A 和 Thread B&#xff0c;尝试各自取出 100 元&a…...

【vue】2.16简单案例

一、高亮显示点击文字 使用vue绑定页面 设置默认样式 使用for循环数组数据展示&#xff0c;并取得索引 创建点击事件并传承&#xff0c;创建num变量 方法中num传进来的参数&#xff0c; 在内容中使用&#xff1a;class和三元运算符&#xff0c;当numkey时是true显示&#xff0c…...

多线程进阶知识篇(一)

文章目录 一、开启线程1. start()2. run() 二、单核/多核CPU1. 单核CPU2. 多核CPU3.烧水问题 三、操作线程的命令四、并发的本质五、线程上下文切换1. 定义2. 原因 一、开启线程 1. start() 调用 start() 方法会启动一个新的线程&#xff0c;每次调用 start()&#xff0c;线程…...

【benepar】benepar安装会自动更新pytorch

直接pip install benepar&#xff0c;安装benepar0.2.0时会自动更新torch的版本 解决方法&#xff1a;去https://pypi.org/project/benepar/0.1.3/找历史版本 我的适配版本&#xff1a;python3.9&#xff0c;torch1.11.0&#xff08;cuda11.3&#xff09;&#xff0c;对应的ben…...

智能云图库-1-项目初始化

项目中的异常处理 自定义异常 在exception包下新建错误码枚举类&#xff1a; Getter public enum ErrorCode {SUCCESS(0, "ok"),PARAMS_ERROR(40000, "请求参数错误"),NOT_LOGIN_ERROR(40100, "未登录"),NO_AUTH_ERROR(40101, "无权限&q…...

每日算法-250414

每日算法学习记录 - 240414 记录今天学习和解决的两道 LeetCode 算法题&#xff0c;主要涉及二分查找的应用。 162. 寻找峰值 题目描述 思路分析 核心思想&#xff1a;二分查找 题目要求找到数组中的任意一个峰值。峰值定义为比其相邻元素都大的元素。题目还隐含了一个条件…...