机器学习算法原理和代码实现系列文章汇总

本文汇总了个人在GPT大模型和其他参考资料的帮助下,深入学习机器学习常用算法的原理和代码实现(不调用sklearn的前提下,用python和numpy实现,也会对比sklearn的实现结果一致性),本系列文章帮助AI从业人员通过机器学习的算法面试,以及通过华为的AI可信编程考试(^o^!)。

监督学习单模型 

机器学习算法原理实现——使用梯度下降求解线性回归

作为深度学习训练模型的基石,梯度下降法的原理:假设现在有一个人在山上,现在他想要走下山,但是他不知道山底在哪个方向,怎么办呢?梯度下降的思想便是 选择最陡峭的方向,即山高度下降最快的方向。现在确定了方向,就要开始下山了。在下山的过程中,最开始选定的方向并不总是高度下降最快的地方。这个人比较聪明,他每次都选定一段距离,每走一段距离之后,就重新确定当前所在位置的高度下降最快的地方。

机器学习算法原理实现——使用交叉熵、梯度下降求解逻辑回归

交叉熵可以作为两个概率分布之间差异的度量:它衡量了使用一个概率分布(模型的预测)去解释另一个概率分布(真实的标签)时的平均“惊讶度”。在实际应用中,当我们使用交叉熵作为损失函数并利用优化算法(梯度下降)来最小化这个损失时,模型的预测结果会逐渐地接近真实的标签。逻辑回归模型的输出是一个概率值,表示某个样本属于正类的概率。逻辑回归的 交叉熵损失函数的公式为:
loss = - (y * log(p) + (1 - y) * log(1 - p))
逻辑回归模型(y = 1 / (1 + e^-z),  z = w1*x1 + w2*x2 + ... + wn*xn + b)通过最小化交叉熵损失函数,来不断调整模型参数,使得模型的预测结果尽可能接近真实结果。

机器学习算法原理实现——使用梯度下降求解Lasso回归和岭回归

L1正则化可以产生稀疏的权重,即许多权重为零,这可以用于特征选择。L2正则化则会使权重接近零,但不会完全为零,这可以防止权重过大。Lasso回归是一种使用L1正则化的线性回归方法,它可以通过梯度下降法进行求解。

机器学习算法原理实现——线性判别分析LDA

线性判别分析(Linear Discriminant Analysis, LDA)是一种有监督式的数据降维方法,是在机器学习和数据挖掘中一种广泛使用的经典算法。
LDA的希望将带上标签的数据(点),通过投影的方法,投影到维度更低的空间中,使得投影后的点,按类别区分成一簇一簇的情况,并且相同类别的点,将会在投影后的空间中更接近。代码实现难度较大,可以了解下。

补充:关于协方差矩阵的理解,推荐好好看看GPT的回答 ,https://www.cnblogs.com/bonelee/p/17688831.html,我认为很多大学授课的老师都没有理解透彻。

机器学习算法原理实现——k近邻算法 KNN

k最近邻(k-nearest neighbors,KNN)算法是一种基本的分类和回归算法。其基本原理如下:
1. 训练阶段:将训练样本集中的数据和对应的标签存储起来,构建一个训练模型。
2. 预测阶段:对于一个新的测试样本,计算它与训练样本集中所有样本的距离(通常使用欧氏距离或其他距离度量方法)。
3. 选择k个最近邻:根据距离计算结果,选择与测试样本距离最近的k个训练样本。
4. 进行投票或计算平均值:对于分类任务,根据k个最近邻的标签进行投票,将得票最多的标签作为测试样本的预测标签。对于回归任务,根据k个最近邻的标签或值进行平均计算,将计算结果作为测试样本的预测值。

机器学习算法原理实现——决策树里根据信息增益选择特征

决策树算法在选择特征时,通常会使用信息增益作为判断标准。信息增益表示的是通过某个特征对数据集进行划分,可以获得多少"信息",或者说,可以减少多少"不确定性"。
具体来说,信息增益的计算过程如下:
1. 计算数据集 D 的原始信息熵:
Ent(D) = - ∑ (|Ck| / |D|) * log2(|Ck| / |D|)
其中,Ck 是数据集 D 中第 k 类样本的集合,|Ck| 是第 k 类样本的数量,|D| 是数据集的总样本数量。
2. 计算特征 A 对数据集 D 的条件信息熵:
Ent(D|A) = ∑ (|Dv| / |D|) * Ent(Dv)
其中,Dv 是数据集 D 中特征 A 取第 v 个值的样本的集合,|Dv| 是特征 A 取第 v 个值的样本的数量。
3. 计算特征 A 对数据集 D 的信息增益:
Gain(D, A) = Ent(D) - Ent(D|A)
信息增益越大,表示特征 A 对数据集 D 的划分效果越好。在构建决策树时,我们会优先选择信息增益最大的特征进行划分。

机器学习算法原理实现——cart决策树:分类&回归

基尼指数(Gini Index)是一种用于决策树算法的划分标准,它衡量的是数据集的不纯度。基尼指数越小,表示数据集的纯度越高,也就是同一类别的样本越多。基尼指数的计算公式为:

Gini(D) = 1 - ∑ (|Ck| / |D|)^2

其中,Ck 是数据集 D 中第 k 类样本的集合,|Ck| 是第 k 类样本的数量,|D| 是数据集的总样本数量。
举个例子,假设我们有一个数据集,包含 10 个样本,其中 5 个是正类,5 个是负类。那么,这个数据集的基尼指数为:

Gini(D) = 1 - (5/10)^2 - (5/10)^2 = 0.5

这个值表示数据集的不纯度较高,正类和负类的样本数量相等。
如果我们有一个特征可以将数据集完全划分为两个纯净的子集,一个子集全是正类,一个子集全是负类,那么这两个子集的基尼指数都是 0,表示纯度最高。

在构建决策树时,我们会计算每个特征划分后的基尼指数,选择基尼指数最小的特征进行划分,以此来提高决策树的分类效果。

将分类CART树修改为回归CART树,我们需要做以下几个主要的修改:
1. 在TreeNode类中,我们需要将predicted_class改为predicted_value,因为在回归问题中,我们预测的是一个连续值,而不是类别。
2. 在gini函数中,我们需要将基尼指数的计算方式改为计算均方误差(MSE)。在回归问题中,我们通常使用MSE作为节点不纯度的度量。
3. 在grow_tree函数中,我们需要将predicted_class改为predicted_value,并将其计算方式改为计算目标值的平均值。
4. 在best_split函数中,我们需要将基尼指数的计算方式改为计算MSE。
5. 在CARTClassifier类中,我们需要将类名改为CARTRegressor,并将predict函数中的类别预测改为值预测。

机器学习算法原理实现——神经网络反向传播,链式求导核心

神经网络中的链式求导法则是一种用于计算复合函数导数的方法,它是反向传播算法的基础。
链式法则的基本思想是,如果一个变量 y 是另一个变量 u 的函数,u 又是另一个变量 x 的函数,那么 y 对 x 的导数可以通过 y 对 u 的导数和 u 对 x 的导数的乘积来计算。
用数学公式表示就是:如果 y = f(u) 和 u = g(x),那么 dy/dx = (dy/du) (du/dx)。
在神经网络中,我们通常需要计算损失函数对网络参数的导数,以便进行梯度下降优化。由于神经网络是由多个层组成的复合函数,所以我们需要使用链式法则来计算这些导数。
例如,假设我们有一个三层神经网络,输出层的激活函数为 a3 = f3(z3),其中 z3 = f2(a2) w3 + b3,a2 又是第二层的输出,以此类推。那么,如果我们想计算损失函数 L 对 w3 的导数,就需要使用链式法则:dL/dw3 = (dL/da3) (da3/dz3) (dz3/dw3)。
这就是神经网络中链式求导法则的基本原理。

 

为了学习 svm,我们必须理解拉格朗日乘子和对偶性。 

跟着GPT学习拉格朗日对偶性

背包问题: 你直接思考:“我应该选择哪些物品放入背包,使得背包的价值最大化,同时不超过重量限制?”你会考虑每个物品,思考是否放入背包。

对偶问题: 现在换个思路。为背包的重量限制设定一个“价格”或“惩罚”(想象超过限制会有一定的罚款)。对于这个给定的“惩罚”,你再次思考如何选择物品以最大化你的总收益(物品的价值减去可能的罚款)。当你调整这个“惩罚”时,你会得到不同的最佳选择。

这个对偶问题实际上是在考虑:“如果我超过背包的限制,我愿意支付多少‘代价’?”对于不同的代价,你可能会选择不同的物品组合。该惩罚项就是拉格朗日乘子!

GPT大模型帮助我们理解拉格朗日乘子法——拉格朗日乘子法背后的直觉和依据是基于梯度的性质

拉格朗日乘子法是一种用于求解带约束的优化问题的方法。它的基本思想是将约束条件融入到目标函数中,形成一个新的拉格朗日函数,然后通过求解这个新函数的极值来找到原问题的解。
拉格朗日乘子法的基本思想是,如果一个点是带约束的优化问题的解,那么在这个点处,目标函数的梯度应该与约束条件的梯度平行。因为只有这样,我们才不能通过沿着约束条件的方向改变解的值来进一步改善目标函数的值。

机器学习算法原理实现——跟着gpt学习svm求解的SMO算法

支持向量机(SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括了核技巧,这使它成为实质上的非线性分类器。SVM的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题。
SVM算法包括五个基本步骤:
1. 构造一个超平面,使得该超平面能够将不同类别的样本分开。
2. 选择最大间隔,即选择使得距离超平面最近的样本点到超平面的距离最大的超平面。
3. 当数据线性不可分时,使用核函数将数据映射到高维空间,使得数据在高维空间中线性可分。
4. 使用拉格朗日乘子法和KKT条件求解对偶问题,得到支持向量和对应的拉格朗日乘子。
5. 根据支持向量和对应的拉格朗日乘子,构造出分类决策函数。
SVM的主要优点是泛化错误率低,计算开销不大,结果易解释。缺点是对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。

 

监督学习集成模型

机器学习算法原理实现——随机森林,核心是就是行列抽样,可以并行

随机森林(Random Forest)是一种集成学习方法,它通过构建并组合多个决策树来进行预测。随机森林的主要思想是通过集成学习的方式提高模型的泛化能力和鲁棒性。
随机森林的算法原理和步骤如下:
1. 自助采样:对于给定的训练数据集,我们首先进行自助采样(Bootstrap Sampling),即有放回地随机抽取样本,形成新的训练集。这个新的训练集的大小和原始训练集相同,但由于是有放回的抽取,所以其中会有一些重复的样本,也会有一些被遗漏的样本。
2. 构建决策树:然后,我们使用这个新的训练集来构建一个决策树。在构建决策树时,每次节点分裂都会从一个随机的特征子集中选择最优的特征。这个随机的特征子集的大小通常是原始特征数量的平方根。
3. 重复步骤:我们重复上述两个步骤,构建出多个决策树,形成一个"森林"。
4. 投票预测:最后,当我们需要进行预测时,我们让这个"森林"中的每一棵树都进行预测,然后选择出现次数最多的类别(对于分类问题)或者平均预测值(对于回归问题)作为最终的预测结果。
随机森林的主要优点是它既能处理分类问题,也能处理回归问题,而且对于特征的缩放和分布没有严格的要求,同时也能处理高维特征和缺失值。

机器学习算法原理实现——adaboost,三个臭皮匠顶个诸葛亮

adaboost原理本质就是“三个臭皮匠(ABC),顶个诸葛亮”:假设A对1/3样本预测正确擅长,则他对这部分样本的预测权重会增加,B和C对剩下的样本预测正确,则另外的样本权重会增加,则adaboost本质上就是集成了三人的智慧,让他们三个人的长处和优势都发挥出来!

机器学习算法原理实现——gbdt

GBDT(Gradient Boosting Decision Tree)是一种集成学习方法,它通过组合多个决策树来构建一个强分类器。GBDT的基本思想是,每一次迭代都训练一个新的决策树,用来纠正上一次迭代的错误。
GBDT的算法原理可以分为以下几个步骤:
1. 初始化:首先,我们需要初始化一个模型,这个模型可以是一个常数,也可以是一个简单的分类器。
2. 迭代训练:在每一次迭代中,我们首先计算当前模型的负梯度(也就是残差),然后训练一个新的决策树,用来拟合这个负梯度。这个新的决策树就是我们这一次迭代的结果。
3. 更新模型:将这一次迭代的结果加入到当前模型中,得到新的模型。
4. 重复步骤2和步骤3,直到达到预设的迭代次数,或者模型的性能已经不能再提升。
通俗来说,GBDT就像是一个团队,每个成员都是一个决策树。在每一次迭代中,都会有一个新的成员加入到团队中,他的任务就是尽可能地弥补前面所有成员的不足。通过这种方式,GBDT能够逐渐提升模型的性能。

机器学习算法原理实现——xgboost,核心是加入了正则化和损失函数二阶泰勒展开

本质上就是在传统gbdt的决策树基础上加入了正则化防止过拟合,以及为了让损失函数求解更方便,加入了泰勒展开,这样计算损失函数更方便了【面试必问】。

XGBoost 可以看作是 GBDT 的一个改进版本,它在 GBDT 的基础上引入了正则化,改进了损失函数,实现了并行化,增加了对缺失值的处理,以及内置了交叉验证等功能,使得模型的性能更好,训练更加高效。

机器学习算法原理实现——lightgbm,核心leaf-wise生长结合数据和特征并行+直方图算法+单边梯度抽样+互斥特征捆绑

LightGBM 是微软开源的一种基于梯度提升(Gradient Boosting)的决策树模型,它在训练效率和模型性能上都有很大的优势。LightGBM 的算法原理和 GBDT、XGBoost 类似,都是通过迭代训练一系列的弱学习器(通常是决策树),然后将这些弱学习器组合起来,形成一个强学习器。
LightGBM 的主要亮点包括:
1. 基于直方图的算法:LightGBM 使用了一种基于直方图的算法,这种算法可以将连续的特征值离散化成离散的 bin,从而加速训练过程,并减少内存使用。
2. 带深度限制的 Leaf-wise 的树生长策略:传统的 GBDT 和 XGBoost 使用的是 Level-wise 的树生长策略,即每一次迭代都在当前所有叶子节点上进行分裂,然后选择增益最大的分裂点进行分裂。而 LightGBM 使用的是 Leaf-wise 的树生长策略,即每一次迭代都在当前增益最大的叶子节点上进行分裂。这种策略可以更快地降低训练误差,但是也可能会导致过拟合。因此,LightGBM 在 Leaf-wise 的基础上增加了深度限制,以防止过拟合。
3. 支持类别特征:LightGBM 可以直接处理类别特征,无需进行独热编码。
4. 支持并行学习:LightGBM 支持并行学习,可以在多核 CPU 或者 GPU 上进行高效的训练。
5. 处理大规模数据:LightGBM 可以处理大规模数据,训练速度快,内存占用少。
...还有单边梯度抽样和互斥特征捆绑。
因此,LightGBM 在许多数据科学比赛和实际应用中都得到了广泛的使用。

 

无监督聚类和降维 

机器学习算法原理实现——kmeans聚类算法

EM算法的一个特例,具体步骤:
初始化:首先选择K个数据点作为初始的簇中心。这可以是随机选择,也可以是使用某种启发式方法。
分配数据点:对于数据集中的每一个数据点,计算其到K个中心的距离,并将其分配到距离最近的中心所在的簇。
更新簇中心:对于每一个簇,计算簇中所有数据点的均值,将均值作为新的簇中心。
收敛判断:比较新的簇中心与上一次迭代的簇中心,如果簇中心没有(或只有微小的)变化,算法结束。否则,返回第2步。
结束:当簇中心不再变化或达到预定的迭代次数时,算法结束。

机器学习算法原理实现——pca降维

假设我们有一个n维的数据集X,我们希望找到一个k维的子空间(k<n),使得当X投影到这个子空间上时,能够保留最多的信息。这个问题可以转化为最大化投影后的方差(理由:因为方差代表了数据的分散程度,也就是数据的变化量。在很多情况下,数据的变化量可以被视为数据的信息量。因此,最大化方差就意味着最大化我们保留的信息量)。
假设投影矩阵为P,那么投影后的数据为Y=XP,目标是最大化P^T*Var(X)*P,其中Var(X)是X的协方差矩阵,P是我们要求的投影矩阵。最后求解的结果:Var(X)P = λP ,就是降维到k维,那么我们就选择最大的k个特征值λ对应的特征向量。

概率模型 

机器学习算法原理实现——朴素贝叶斯

推导来自贝叶斯条件概率:P(Y|X) = P(X|Y) P(Y) / P(X)
其中,Y是类别,X是特征。朴素贝叶斯算法还假设所有特征都是条件独立的,即给定类别Y的条件下,特征X1, X2, ..., Xn是独立的。因此,条件概率P(X|Y)可以写成:
P(X|Y) = P(X1|Y) P(X2|Y) ... P(Xn|Y)
P(Y|X) = P(Y) P(X1|Y) P(X2|Y) ... P(Xn|Y) / P(X)
在分类问题中,由于P(X)对于所有类别都是相同的,因此我们通常忽略P(X),并选择使P(Y) P(X1|Y) P(X2|Y) ... P(Xn|Y)最大的类别作为预测结果。

机器学习算法原理实现——EM算法

EM算法,全称为期望最大化算法(Expectation-Maximization Algorithm),是一种迭代优化算法,主要用于含有隐变量的概率模型参数的估计。EM算法的基本思想是:如果给定模型的参数,那么可以根据模型计算出隐变量的期望值;反过来,如果给定隐变量的值,那么可以通过最大化似然函数来估计模型的参数。每次看到EM算法,就想抛掷硬币,根据观测到的结果去估算AB出现正面的概率例子。

机器学习算法原理实现——HMM生成序列和维特比算法

HMM的基本假设有两个:
1. 齐次马尔可夫性假设:即任意时刻的状态只与前一时刻的状态有关,与其他时刻状态及观测无关。
2. 观测独立性假设:即任意时刻的观测(Y输出)只与该时刻的状态有关,与其他观测和状态无关。
例如使用HMM预测未来5天的天气,核心是状态概率转移,然后根据不同状态来预测天气。生成HMM的序列算法比较直观。另外就是动态规划的维特比算法,针对发烧的例子,目标是让你估计三天的隐藏状态:
第一天  第二天 第三天
健康       健康     健康 \
     \/          \/                 \      Y = 正常、头晕、冷 ==>最大化该概率网络的输出
     /\          /\                /
发烧      发烧     发烧 /

在给出初始化概率和转移概率矩阵以后,核心是最大化该概率网络的输出来求解隐藏状态!这就是一个类似求解最短路的动态规划算法了!

机器学习算法原理实现——最大熵模型 

最大熵模型是一个对数线性模型,它的形式为:P(Y|X) = exp(∑λi fi(X,Y)) / Z(X),其中,λi是特征函数fi对应的权重,Z(X)是归一化因子,保证概率之和为1。
如果我们将最大熵模型的特征函数定义为输入和类别的线性函数,那么最大熵模型的输出就等价于Softmax函数的输出。在进行模型训练时候,保证模型的期望等于训练数据的期望。
微信读书可以参考:https://weread.qq.com/web/reader/77d3255072a838d277db01ak7f632b502707f6ffaa6bf2e

 

最后,祝大家顺利通过AI算法类考试和面试。

 

参考:

1、《机器学习,公式推导与实现》,https://weread.qq.com/web/bookDetail/77d3255072a838d277db01a

2、GPT4

posted @ 2023-10-07 17:19  bonelee  阅读(130)  评论(0编辑  收藏  举报