机器学习实验报告——EM算法

目录

一、算法介绍

1.1算法背景

1.2算法引入

1.3算法假设

1.4算法原理

1.5算法步骤

二、算法公式推导

2.1数学基础

2.2EM算法推导

三、算法实现

3.1关于EM聚类

3.2EM工具包的使用

3.3 实例测试

四、算法讨论

4.1EM算法的优缺点

4.2EM算法的应用

4.3对于EM算法框架,如何选择具体的算法

五、实验总结


一、算法介绍

1.1算法背景

EM 的英文是 Expectation Maximization,所以 EM 算法也叫最大期望算法。

EM算法最早由Arthur Dempster、Nan Laird和Donald Rubin在1977年提出,用于解决包含隐变量的统计模型参数估计问题。

在许多现实问题中,观测数据并不完整,存在一些未观测到的隐含信息或隐变量,这时候就需要使用EM算法来对模型进行参数估计。

EM算法通过迭代的方式,交替进行“期望步骤”和“最大化步骤”,不断优化参数估计值,直到收敛为止。

1.2算法引入

由一个简单的场景进行EM算法的引入:

假设你炒了一份菜,想要把它平均分到两个碟子里,该怎么分?

很少有人用称对菜进行称重,再计算一半的分量进行平分。大部分人的方法是先分一部分到碟子 A 中,然后再把剩余的分到碟子 B 中,再来观察碟子 A 和 B 里的菜是否一样多,哪个多就匀一些到少的那个碟子里,然后再观察碟子 A 和 B 里的是否一样多……整个过程一直重复下去,直到份量不发生变化为止。

你能从这个例子中看到三个主要的步骤:初始化参数、观察预期、重新估计。首先是先给每个碟子初始化一些菜量,然后再观察预期,这两个步骤实际上就是期望步骤(Expectation)。如果结果存在偏差就需要重新估计参数,这个就是最大化步骤(Maximization)。这两个步骤加起来也就是 EM 算法的过程。

1.3算法假设

EM算法的算法假设包括以下几点:

(1)隐变量假设:

EM算法针对含有隐变量的概率模型,假设存在一些未观测到的隐变量,这些隐变量与观测变量共同决定了观测数据的生成过程。

(2)参数假设:

假设模型中包含一些需要估计的参数,这些参数可以完全描述观测数据的生成过程。

这些参数可能是概率分布的参数、混合模型的权重参数等,需要通过EM算法进行估计。

(3)独立同分布(i.i.d.)假设:

EM算法通常假设观测数据是独立同分布的,即每个观测样本都是相互独立且具有相同的概率分布。

(4)完全数据假设:

EM算法引入“完全数据”概念,即假设观测数据不仅包括观测变量,还包括相应的隐变量,从而将估计问题转化为对完全数据的估计问题。

通过引入完全数据,可以简化模型的描述和参数估计。

总之,EM算法的基本假设包括含有隐变量的概率模型、需要估计的模型参数、观测数据的独立同分布性质以及完全数据的引入。在这些假设下,EM算法能够有效地进行参数估计,并在实际应用中取得了广泛的成功。

1.4算法原理

EM算法是一种用于含有隐变量的概率模型参数估计的迭代优化算法,其核心原理可以简要概括如下:

(1)E步骤(Expectation Step):

在E步骤中,根据当前的模型参数估计值,计算隐变量的后验概率。这一步骤的目的是计算在给定观测数据情况下,每个隐变量取不同取值的概率。

通过对隐变量的后验概率进行计算,可以得到对未观测到的隐变量的更准确的估计。

(2)M步骤(Maximization Step):

在M步骤中,利用在E步骤中计算得到的隐变量的后验概率,最大化完全数据的对数似然函数来更新模型参数。换言之,就是用E步骤得到的隐变量的后验概率加权的方式来更新模型参数。

(3)迭代更新:

在完成E步骤和M步骤后,得到新的模型参数估计值,然后将这些新的参数估计值用于下一轮的E步骤和M步骤。

通过不断地进行E步骤和M步骤的交替迭代,直至参数收敛或达到预定的迭代次数,从而获得最终的模型参数估计值。

(4)收敛性:

EM算法保证在每次迭代步骤后,对数似然函数都会增加或保持不变,因此EM算法可以收敛到局部最优解。

但需要注意的是,EM算法并不能保证收敛到全局最优解,因其结果受初始参数值的影响。

总之,EM算法通过交替进行E步骤和M步骤,能够有效地估计含有隐变量的概率模型的参数。

1.5算法步骤

步骤一: 参数的初值可以任意选择,但需注意EM算法对初值是敏感的

步骤二: E步求Q(θ,θ(i))。Q函数式中Z是未观测数据,Y是观测数据。注意,Q(θ,θ(i))的第1个变元表示要极大化的参数,第2个变元表示参数的当前估计值。

步骤三: M步求Q(θ,θ(i))的极大化,得到θ(i+1)。

步骤四: 给出停止迭代的条件,一般是对较小的正数ε1,ε2,若满足下面条件则停止迭代

EM算法计算流程

二、算法公式推导

2.1数学基础

(1)数学期望

数学期望就是一个事件可能获得的所有结果被其获得相应结果的可能性(概率)“降价(加权)”后,求得的和,作为该事件的整体期望结果,也就是用一个数来表示一件事获得可能结果是啥。

假设一个随机事件X ,对于离散型数值的数学期望为:

pi为xi发生的概率值。

对于连续型数值的数学期望为:

f(x)为x的概率密度函数。

(2)最大似然估计

最大似然估计分为离散型随机变量和连续型随机变量两种。离散型随机变量是一系列独立同分布的随机事件在某个或某些未知参数θ的参与下,其得到最大概率值下,对参数θ的估计;连续型随机变量是指一系列具有连续特征的随机变量在某个或某些未知参数θ的参与下,其得到最大概率密度值下,对参数θ的估计。

通常,由于计算最大概率值时,需要用到概率连乘,这将在计算上带来很大的麻烦,因此,我们在求解最大似然值时,往往采用对数方法进行,即对连乘式取ln或者log,将连乘转换成连加形式,再求其偏导。

总结求解极大似然估计问题步骤:

写出似然函数;

对似然函数取对数,并整理;

求导数,令导数为0,得到似然方程;

解似然方程,得到的参数即为所求;

(3)JenSen不等式

如果f是凸函数,X是随机变量,那么:E[f(X)]>=f(E[X]),通俗的说法是函数的期望大于等于期望的函数。

特别地,如果f是严格凸函数,当且仅当P(X = EX) = 1,即X是常量时,上式取等号,即E[f(X)] = f(EX)

2.2EM算法推导

(1)对于每个实例,用表示样本实例隐含变量z的某种分布,且满足条件()=1, () >=0,∀j,如果是连续性的,则表示概率密度函数,需要将求和符号换成积分符号。

对于上面的式子,做如下变换:

上面三个式子中,式(1)是根据联合概率密度下某个变量的边缘密度函数求解的(这里把 z 当作是随机变量)。对每一个样本i的所有可能类别 z 求等式右边的联合概率密度函数和,也就得到等式左边为随机变量 x 的边缘概率密度。由于对式(1)直接求导非常困难,所以将其分子分母都乘以一个相等的函数,转换为式(2)。而在式(2)变为式(3)的过程,采用的是上面提到的Jensen不等式。

因此便得到了公式(3)。OK,现在我们知道上面的式(2)和式(3)两个不等式可以写成:似然函数 L ( > = J ( z , Q )的形式( z 为隐含变量),那么我们可以通过不断的最大化 J 的下界,来使得L(θ)不断提高,最终达到它的最大值。

(2)完整的流程如下

第一步,初始化分布参数 θ;

第二步,重复E-step 和 M-step直到收敛:

·E步骤:根据参数的初始值或上一次迭代的模型参数来计算出的隐性变量的后验概率(条件概率),其实就是隐性变量的期望值。作为隐藏变量的现有估计值:

·M步骤:最大化似然函数从而获得新的参数值:

通过不断的迭代,然后就可以得到使似然函数 L(θ)最大化的参数 θ了。

(3)讨论如何确保EM收敛

假定和是EM第t次和t+1次迭代后的结果。如果我们证明了

 l<=l(),也就是说极大似然估计单调增加,那么最终我们就会得到极大似然估计的最大值。下面来证明,选定 θ(t)之后,我们得到E步:

这一步保证了在给定θ(t)时,Jensen不等式中的等式成立,也就是

然后进行M步,固定,并将试作变量,对上面的式子求导,得到,这样经过一些推导会有以下式子成立:

在公式(4)中,得到,只是最大化l,也就是l的下界,并没有使等式成立,等式成立只有在固定,并按E步得到时才能成立。

这样就证明了 l(θ)会单调增加。如果要判断收敛情况,可以这样来做:一种收敛方法是 l(θ)不再变化,还有一种就是变化幅度很小,即根据的值来决定。

总之,EM算法类似于坐标上升法(coordinate ascent):E步:固定 θ,优化Q;M步:固定Q,优化 θ;交替将极值推向最大。

三、算法实现

3.1关于EM聚类

经过上述分析及推导,可以看到 EM 算法最直接的应用就是求参数估计。如果我们把潜在类别当做隐藏变量,样本看做观察值,就可以把聚类问题转化为参数估计问题。这也就是 EM 聚类的原理。

相比于 K-Means 算法,EM 聚类更加灵活,比如下面这两种情况,K-Means 会得到下面的聚类结果。

因为 K-Means 是通过距离来区分样本之间的差别的,且每个样本在计算的时候只能属于一个分类,称之为是硬聚类算法。而 EM 聚类在求解的过程中,实际上每个样本都有一定的概率和每个聚类相关,叫做软聚类算法。

可以把 EM 算法理解成为是一个框架,在这个框架中可以采用不同的模型来用 EM 进行求解。

常用的 EM 聚类有 GMM 高斯混合模型和 HMM 隐马尔科夫模型。GMM(高斯混合模型)聚类就是 EM 聚类的一种。比如上面这两个图,可以采用 GMM 来进行聚类。

和 K-Means 一样,我们事先知道聚类的个数,但是不知道每个样本分别属于哪一类。通常,我们可以假设样本是符合高斯分布的(也就是正态分布)。每个高斯分布都属于这个模型的组成部分(component),要分成 K 类就相当于是 K 个组成部分。这样我们可以先初始化每个组成部分的高斯分布的参数,然后再看来每个样本是属于哪个组成部分。这也就是 E 步骤。

再通过得到的这些隐含变量结果,反过来求每个组成部分高斯分布的参数,即 M 步骤。反复 EM 步骤,直到每个组成部分的高斯分布参数不变为止。

这样也就相当于将样本按照 GMM 模型进行了 EM 聚类。

3.2EM工具包的使用

在 Python 中有第三方的 EM 算法工具包。此次我采用的是 GMM 高斯混合模型,在使用前需要引入工具包:

 from sklearn.mixture import GaussianMixture

创建完 GMM 聚类器之后,我们就可以传入数据让它进行迭代拟合。

我们使用 fit 函数,传入样本特征矩阵,模型会自动生成聚类器,然后使用 prediction=gmm.predict(data) 来对数据进行聚类,传入想进行聚类的数据,可以得到聚类结果 prediction。

3.3 实例测试

尝试使用 EM 算法对王者荣耀数据进行聚类

在了解了 GMM 聚类工具之后,我们尝试对王者荣耀的英雄数据进行聚类。

我们可以通过聚类算法把特征值相近的数据归为一类,不同类之间的差异较大,这样就可以对原始数据进行降维。通过分成几个组(簇),来研究每个组之间的特性。或者我们也可以把组(簇)的数量适当提升,这样就可以找到可以互相替换的英雄,比如你的对手选择了你擅长的英雄之后,你可以选择另一个英雄作为备选。

(1)数据集描述

这里我们收集了 69 名英雄的 20 个特征属性,这些属性分别是最大生命、生命成长、初始生命、最大法力、法力成长、初始法力、最高物攻、物攻成长、初始物攻、最大物防、物防成长、初始物防、最大每 5 秒回血、每 5 秒回血成长、初始每 5 秒回血、最大每 5 秒回蓝、每 5 秒回蓝成长、初始每 5 秒回蓝、最大攻速和攻击范围等。

数据集部分数据如下:

(2)代码实现

现在我们需要对王者荣耀的英雄数据进行聚类,我们先设定项目的执行流程:

首先我们需要加载数据源;

在准备阶段,我们需要对数据进行探索,包括采用数据可视化技术,让我们对英雄属性以及这些属性之间的关系理解更加深刻,然后对数据质量进行评估,是否进行数据清洗,最后进行特征选择方便后续的聚类算法;

聚类阶段:选择适合的聚类模型,这里我们采用 GMM 高斯混合模型进行聚类,并输出聚类结果,对结果进行分析。

代码如下:

  1. # -*- coding: utf-8 -*-
  2. import pandas as pd
  3. import csv
  4. import matplotlib.pyplot as plt
  5. import seaborn as sns
  6. from sklearn.mixture import GaussianMixture
  7. from sklearn.preprocessing import StandardScaler
  8. # 数据加载,避免中文乱码问题
  9. data_ori = pd.read_csv('heroes.csv', encoding = 'gb18030')
  10. features = [u'最大生命',u'生命成长',u'初始生命',u'最大法力'u'法力成长',u'初始法力',u'最高物攻',u'物攻成长',u'初始物攻',u'最大物防',u'物防成长',u'初始物防'u'最大每 5 秒回血'u'每 5 秒回血成长'u'初始每 5 秒回血'u'最大每 5 秒回蓝'u'每 5 秒回蓝成长'u'初始每 5 秒回蓝'u'最大攻速'u'攻击范围']
  11. data = data_ori[features]
  12. # 对英雄属性之间的关系进行可视化分析
  13. # 设置 plt 正确显示中文
  14. plt.rcParams['font.sans-serif']=['SimHei'# 用来正常显示中文标签
  15. plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
  16. # 用热力图呈现 features_mean 字段之间的相关性
  17. corr = data[features].corr()
  18. plt.figure(figsize=(14,14))
  19. # annot=True 显示每个方格的数据
  20. sns.heatmap(corr, annot=True)
  21. plt.show()
  22. # 相关性大的属性保留一个,因此可以对属性进行降维
  23. features_remain = [u'最大生命'u'初始生命'u'最大法力'u'最高物攻'u'初始物攻'u'最大物防'u'初始物防'u'最大每 5 秒回血'u'最大每 5 秒回蓝'u'初始每 5 秒回蓝'u'最大攻速'u'攻击范围']
  24. data = data_ori[features_remain]
  25. data[u'最大攻速'] = data[u'最大攻速'].apply(lambda x: float(x.strip('%'))/100)
  26. data[u'攻击范围']=data[u'攻击范围'].map({'远程':1,'近战':0})
  27. # 采用 Z-Score 规范化数据,保证每个特征维度的数据均值为 0,方差为 1
  28. ss = StandardScaler()
  29. data = ss.fit_transform(data)
  30. # 构造 GMM 聚类
  31. gmm = GaussianMixture(n_components=30, covariance_type='full')
  32. gmm.fit(data)
  33. # 训练数据
  34. prediction = gmm.predict(data)
  35. print(prediction)
  36. # 将分组结果输出到 CSV 文件中
  37. data_ori.insert(0'分组', prediction)
  38. data_ori.to_csv('./hero_out.csv', index=False, sep=',')

(3)结果可视化

①热力图呈现 features_mean 字段之间的相关性

②输出的聚类结果文件 hero_out.csv(

(3)关于代码及结果的分析

①关于引用包

首先我们会用 DataFrame 数据结构来保存读取的数据,最后的聚类结果会写入到 CSV 文件中,因此会用到 pandas 和 CSV 工具包。另外我们需要对数据进行可视化,采用热力图展现属性之间的相关性,这里会用到 matplotlib.pyplot 和 seaborn 工具包。在数据规范化中我们使用到了 Z-Score 规范化,用到了 StandardScaler 类,最后我们还会用到 sklearn 中的 GaussianMixture 类进行聚类。

 ②数据可视化的探索

你能看到我们将 20 个英雄属性之间的关系用热力图呈现了出来,中间的数字代表两个属性之间的关系系数,最大值为 1,代表完全正相关,关系系数越大代表相关性越大。从图中你能看出来“最大生命”“生命成长”和“初始生命”这三个属性的相关性大,我们只需要保留一个属性即可。同理我们也可以对其他相关性大的属性进行筛选,保留一个。你在代码中可以看到,我用 features_remain 数组保留了特征选择的属性,这样就将原本的 20 个属性降维到了 13 个属性。

③关于数据规范化

我们能看到“最大攻速”这个属性值是百分数,不适合做矩阵运算,因此我们需要将百分数转化为小数。我们也看到“攻击范围”这个字段的取值为远程或者近战,也不适合矩阵运算,我们将取值做个映射,用 1 代表远程,0 代表近战。然后采用 Z-Score 规范化,对特征矩阵进行规范化。

 ④在聚类阶段

我们采用了 GMM 高斯混合模型,并将结果输出到 CSV 文件中;这里我将输出的结果截取了一段(设置聚类个数为 30):

第一列代表的是分组(簇),我们能看到张飞、程咬金分到了一组,牛魔、白起是一组,老夫子自己是一组,达摩、典韦是一组。聚类的特点是相同类别之间的属性值相近,不同类别的属性值差异大。因此如果你擅长用典韦这个英雄,不防试试达摩这个英雄。同样你也可以在张飞和程咬金中进行切换。这样就算你的英雄被别人选中了,你依然可以有备选的英雄可以使用。

四、算法讨论

4.1EM算法的优缺点

EM算法作为一种迭代优化算法,在实际应用中具有一些优点和缺点。

(1)优点

①针对含有隐变量的概率模型,EM算法是一种有效的参数估计方法。它可以通过迭代的方式逐步优化模型参数,使得模型更好地拟合观测数据。

②EM算法在处理复杂的概率模型时表现出较强的灵活性,能够应对各种类型的隐变量模型,例如高斯混合模型、隐马尔可夫模型等。

③由于EM算法利用期望步骤(E步骤)和最大化步骤(M步骤)交替进行优化,因此可以收敛到局部最优解,尤其在凸优化的情况下,通常能够获得较好的结果。

(2)缺点

①对初始值敏感:EM算法对初始参数值敏感,不同的初始值可能导致不同的最终结果,因此需要谨慎选择初始值来保证算法的稳定性和收敛性。

②可能收敛到局部最优解:由于EM算法是一种局部优化方法,存在收敛到局部最优解而非全局最优解的风险。这意味着在参数空间中可能会陷入局部极小值点,而无法发现全局最优解。

③计算复杂度高:在每次迭代中,EM算法需要计算数据的后验概率,并更新模型参数,这导致了在数据量较大时计算复杂度较高,导致算法效率较低。

4.2EM算法的应用

EM算法在实际中有许多广泛的应用,特别是在概率模型的参数估计、聚类分析和隐变量模型等领域。以下是一些常见的EM算法应用:

(1)高斯混合模型(Gaussian Mixture Model, GMM):EM算法常被用于对GMM的参数进行估计。GMM是一种常用的概率模型,用于对数据进行建模,尤其适用于假设数据是由多个高斯分布混合而成的情况。

(2)隐马尔可夫模型(Hidden Markov Model, HMM):HMM是一种常见的隐变量模型,用于建模时序数据。EM算法可以用于对HMM的参数进行估计,包括状态转移矩阵和观测概率矩阵。

(3)聚类分析:EM算法也被广泛应用于聚类分析中,特别是在基于概率模型的聚类方法中,如混合聚类(mixture clustering)和模型自适应聚类(model-based clustering)。

(4)数据挖掘:在数据挖掘领域,EM算法被用来处理缺失数据的填补和模式识别。它可以通过对缺失数据进行建模,估计缺失值,从而帮助进行数据清洗和分析。

(5)图像处理:在图像处理中,EM算法可以被用来进行图像分割、目标识别和特征提取等任务,尤其在需要建立概率模型对图像进行分析时发挥作用。

总的来说,EM算法在概率模型估计、参数学习和隐变量模型等领域有着广泛的应用,它为处理具有隐变量的概率模型提供了有效的数值求解方法,为各种复杂数据分析和模式识别问题提供了重要的工具。

4.3对于EM算法框架,如何选择具体的算法

在选择适用于EM算法框架的具体算法时,需要考虑数据的特性、模型的假设以及算法的实现和效率等因素。以下是一些指导原则来选择适合的算法:

(1)数据类型:如果你的数据具有连续特征,并且符合高斯分布的假设,那么高斯混合模型(GMM)可能是一个合适的选择。而如果你的数据是时序数据,并且受到隐含状态影响,比如语音信号或生物学序列,那么隐马尔可夫模型(HMM)可能更适合。

(2)模型假设:GMM假设数据由多个高斯分布混合而成,适合对具有明显聚类结构的数据进行建模;HMM假设数据由一个隐含的马尔可夫链产生,适合对时序数据进行建模。根据你的数据是否符合这些假设,可以选择相应的模型。

(3)算法实现和效率:针对具体的算法实现和计算效率,需要考虑在实际场景中的使用情况。在选择算法时,可以考虑算法的收敛速度、对初始值敏感程度、并行化能力等因素,以及算法在大规模数据集上的表现。

(4)先前研究和应用:在一些特定领域中,可能已经有关于使用GMM或HMM的成功案例和成熟的应用。在选择算法时,可以参考相关文献和先前研究,了解在特定领域中哪种算法更为常用,并根据先前的经验进行选择。

五、实验总结

在本次机器学习实验中,探究的是期望最大化EM算法。实验中我首先查找了EM的算法背景,最早是用来进行参数估计的一种算法。然后由一个两个碟子分菜的例子引入EM算法,碟子分菜中给每个碟子初始化菜量和观察预期并调整的两个步骤实际上就是期望步骤(Expectation)和最大化步骤(Maximization)。

然后分析了EM算法假设及算法原理,即四个核心部分:E步骤、M步骤、迭代更新及收敛性。

在算法推导部分,我实现了以下两个关键流程:

第一步,初始化分布参数 θ;

第二步,重复E-step 和 M-step直到收敛:

并在最后得到了EM算法。

为了复现EM算法,本次数据集使用的是王者荣耀中一些英雄的各方面数据汇总。并采用 GMM 高斯混合模型进行聚类。得到了呈现各属性间关系的热力图及输出的聚类结果。

在实验的最后,讨论了EM算法的优缺点及应用,并思考了在EM算法大框架下,如何选择一个合适的算法,如GMM和HMM。

总之,通过此次实验,对EM算法有了更深的认识和理解。EM算法通过交替地使用E步骤和M步骤,在存在隐含变量的概率模型中进行参数估计,是一种常用的机器学习算法。

2024-1-21

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

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

相关文章

信息安全概述

信息安全&#xff1a;防止任何对数据进行未授权访问的措施&#xff0c;或者防止造成信息有意无意泄漏、破坏、丢失等问题的发生&#xff0c;让数据处于远离危险、免于威胁的状态或特性。 网络安全&#xff1a;计算机网络环境下的信息安全。 信息安全现状及挑战 数字化时代威…

7.12、中间人攻击(ARP欺骗)

一、ARP协议原理 地址解析协议(Address Resolution Protocol&#xff0c;ARP)&#xff0c;负责把目的主机的IP 地址解析成目的MAC地址&#xff0c;地址解析的目标就是发现逻辑地址与物理地址的映射关系。网络中的计算机、交换机、路由器等都会定期维护自己的ARP缓存表。 为什么…

第6章 SpringBoot缓存管理

学习目标 了解SpringBoot的默认缓存 熟悉SpringBoot中Redis的缓存机制及实现 掌握SpringBoot整合Redis的缓存实现 缓存是分布式系统中的重要组件&#xff0c;主要解决数据库数据的高并发访问问题。在实际开发中&#xff0c;尤其是用户访问量较大的网站&#xff0c;为了提高服…

HarmonyOS SDK,助力开发者打造焕然一新的鸿蒙原生应用

鸿蒙生态千帆启航仪式于1月18日正式启动。从2019年HarmonyOS正式发布到2020年“没有人能够熄灭漫天星光”&#xff0c;今天&#xff0c;满天星光终汇成璀璨星河&#xff0c;HarmonyOS NEXT鸿蒙星河版重磅发布&#xff0c;带来了全新架构、全新体验、全新生态。作为支撑鸿蒙原生…

Spring--@Async解析

一、Async 简介 从Spring3开始提供了Async注解&#xff0c;被该注解标注的方法&#xff0c;Spring底层会新建一个线程池或者使用已有的线程池中的线程去异步的执行被标注的方法。 二、Async 工作原理 Async与Transactional 工作原理基本是一样的&#xff0c;也是通过Spring …

100天精通鸿蒙从入门到跳槽——第11天:TypeScript 知识储备:装饰器

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

代码随想录 Leetcode150. 逆波兰表达式求值

题目&#xff1a; 代码(首刷看解析 2024年1月21日&#xff09;&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &qu…

AP5191 降压恒流 双灯 12V5A 一切一LED车灯汽车大灯驱动方案

AP5191是一款PWM工作模式,高效率、外围简 单、内置功率MOS管&#xff0c;适用于4.5-150V输入的高 精度降压LED恒流驱动芯片。输出功率150W&#xff0c; 电流6A。 AP5191可实现线性调光和PWM调光&#xff0c;线性调 光脚有效电压范围0.55-2.6V. AP5191 工作频率可以通过RT 外部…

win 下使用 cmd 运行 jar 包

1、使用 Win R 输入 cmd 命令打开命令提示符 2、在 cmd 窗口中输入以下命令 java -jar xxxxxx.jar 运行 jar 包&#xff0c;控制台出现中文乱码 原因是 windows 默认使用 GBK 编码格式&#xff0c;程序使用 UTF-8 编码格式 将编码格式改为 UTF-8 编码&#xff0c;在 cmd 窗…

JavaScript库jquery的使用方法

"写更少&#xff0c;做更多"是jquery的设计理念&#xff0c;jquery是一个兼容多浏览器的JavaScript库&#xff0c;利用jquery的语法设计能使开发更便捷。 网页添加jquery的方法:1.从jquery.com下载库&#xff1b;2.从CDN中载入库&#xff08;示例使用&#xff09;&a…

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理课程汇总 第0章 绪论第一章 数字图像基础第二章 数字图像存储与处理第三章 空间域处理方法第四章 变换域处理方法第五章 辐射校正第六章 几何校正第七章 图像去噪声第八章 图像增强第九章 感兴趣目标及对象提取第十章 特征提取与选择第十一章 遥感数字图像分类…

c++学习之IO流

目录 前言&#xff1a; 一&#xff0c;流的概念 二&#xff0c;c的io流 输入输出流 缓冲区的同步 文件流 文件的打开 文件读写自定义类型数据 字符流 1. 将数值类型数据格式化为字符串 2. 字符串拼接 3. 序列化和反序列化结构数据 前言&#xff1a; 在了解c的输入输…

SpringBoot异常处理和单元测试

学习目标 Spring Boot 异常处理Spring Boot 单元测试 1.SpringBoot异常处理 1.1.自定义错误页面 SpringBoot默认的处理异常的机制&#xff1a;SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot…

c语言->学会offsetof宏计算结构体相对偏移量

前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目的&#xff0c;学习offsetof宏计算结构体相对偏移量 1.offsetof宏 来我们看图…

vector讲解

在学习玩string后我们开始学习vector&#xff0c;本篇博客将对vector进行简单的介绍&#xff0c;还会对vector一些常用的函数进行讲解 vector的介绍 实际上vector就是一个数组的数据结构&#xff0c;但是vector是由C编写而成的&#xff0c;他和数组也有本质上的区别&#xff…

2.机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

2️⃣机器学习-K最近邻&#xff08;k-Nearest Neighbor&#xff0c;KNN&#xff09;分类算法原理讲解 个人简介一算法概述二算法思想2.1 KNN的优缺点 三实例演示3.1电影分类3.2使用KNN算法预测 鸢(yuan)尾花 的种类3.3 预测年收入是否大于50K美元 个人简介 &#x1f3d8;️&…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

XXL-Job的搭建接入Springboot项目(详细)

一、XXL-Job介绍 XXL-Job 是一款开源的分布式任务调度平台&#xff0c;由 Xuxueli&#xff08;徐雪里&#xff09;开发。它基于 Java 技术栈&#xff0c;提供了一套简单易用、高可靠性的任务调度解决方案。 XXL-Job 的主要作用是帮助开发者实现定时任务的调度和执行。它可以用…

2024年轻人返乡创业潮,外卖平台市场需求是怎么样的?

目前&#xff0c;县域经济正面临着几大利好。“返乡就业、返乡创业和告老还乡”现象越发普遍&#xff0c;这不仅在小县城中有所体现&#xff0c;同样在乡镇中也呈现出同样的趋势。一些产业链和工厂纷纷下沉到乡镇&#xff0c;带来了更多的就业机会。这不仅能够吸引年轻人回乡就…

Spring Boot 4.0:构建云原生Java应用的前沿工具

目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…