机器学习实验报告——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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RT Thread Stdio生成STM32L431RCT6无法启动问题

一、问题现象 使用RT thread Stdio生成STM32L431RCT6工程后&#xff0c;编译下载完成后系统无法启动&#xff0c;无法仿真debug&#xff1b; 二、问题原因 如果当前使用的芯片支持包版本为0.2.3&#xff0c;可能是这个版本问题&#xff0c;目前测试0.2.3存在问题&#xff0c…

【51单片机】外部中断

0、前言 参考&#xff1a;普中 51 单片机开发攻略 第16章 及17章 1、硬件 2、软件 #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned char u8; typedef unsigned int u16;sbit led P2^0; sbit key3 P3^2;//外部中断…

晨控CK-FR03-EC与欧姆龙NX系列EtherCAT通讯连接说明手册

晨控CK-FR03-EC与欧姆龙NX系列EtherCAT通讯连接说明手册 晨控CK-FR03-EC是一款基于射频识别技术的高频RFID标签读卡器&#xff0c;读卡器工作频率为13.56MHZ&#xff0c;支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。 读卡器同时支持标准工业通讯协…

机器学习周记(第二十六周:文献阅读-DPGCN)2024.1.15~2024.1.21

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文摘要 1.3 论文背景 2 论文模型 2.1 问题描述 2.2 论文模型 2.2.1 时间感知离散图结构估计&#xff08;Time-aware Discrete Graph Structure Estimation Module&#xff0c;TADG Module&#xff09; 2.2.2 时间…

HNU-数据挖掘-实验2-数据降维与可视化

数据挖掘课程实验实验2 数据降维与可视化 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验2 数据降维与可视化实验背景实验目标实验数据集说明实验参考步骤实验过程1.对数据进行初步降维2.使用无监督数据降维方法&#xff0c;比如PCA&#xff0c;I…

网络要素服务(WFS)详解

文章目录 1. 概述2. GetCapabilities3. DescribeFeatureType4. GetFeature4.1 Get访问方式4.2 Post访问方式 5. Transaction5.1 Insert5.2 Replace5.3 Update5.4 Delete 6 注意事项 1. 概述 前置文章&#xff1a; 地图服务器GeoServer的安装与配置 GeoServer发布地图服务&#…

外汇天眼:每一个骗局的背后,可能是倾家荡产!

在网络科技还没有发达的以前&#xff0c;骗子主要通过线下揽客的方式推荐各类虚假的投资理财项目&#xff0c;有的甚至打着专门的理财咨询机构吸引了一大批新手投资者。在当时&#xff0c;外汇投资还不为多数人知道&#xff0c;随便忽悠“高利益保本”就有投资者上当受骗。 现如…

LINUX常用工具之sudo权限控制

一、Sudo基本介绍 sudo是Linux 中用于允许特定用户以超级用户或其他特权用户的身份执行特定的命令或任务。sudo 提供了一种安全的方法&#xff0c;使用户能够临时获取额外的权限&#xff0c;而不需要以完全超级用户的身份登录系统。sudo也可以用了设置黑名单命令清单&#xff…

多列匹配,根据对应状态、排序字段

多列匹配&#xff0c;根据对应状态、排序字段 数据&#xff1a; 查询:

Golang leetcode28 找出字符串中第一个匹配项的下标 KMP算法详解

文章目录 找出字符串中第一个匹配项的下标 leetcode28 串的模式匹配问题暴力求解使用KMP模式匹配算法KMP算法简述 KMP算法的代码实现 找出字符串中第一个匹配项的下标 leetcode28 串的模式匹配问题 暴力求解 func strStr(haystack string, needle string) int { L : len(need…

大模型笔记【3】 gem5 运行模型框架LLama

一 LLama.cpp LLama.cpp 支持x86&#xff0c;arm&#xff0c;gpu的编译。 1. github 下载llama.cpp https://github.com/ggerganov/llama.cpp.git 2. gem5支持arm架构比较好&#xff0c;所以我们使用编译LLama.cpp。 以下是我对Makefile的修改 开始编译&#xff1a; make UNAME…

用pandas实现用前一行的excel的值填充后一行

今天接到一份数据需要分析&#xff0c;数据在一个excel文件里&#xff0c;内容大概形式如下&#xff1a; 后面空的格子里的值就是默认是前面的非空的值&#xff0c;由于数据分析的需要需要对重复的数据进行去重&#xff0c;去重就需要把控的cell的值补上&#xff0c;然后根据几…

2024 前端高频面试题之 JS 篇

JS 篇&#xff08;持续更新中&#xff09; 1、什么是原型、原型链&#xff1f;2、什么是继承&#xff1f;说一说有哪些&#xff1f;继承组合的原理及优点&#xff1f;3、new 操作符具体干了什么&#xff1f;4、js 有哪些方法改变 this 指向&#xff1f;5、bind 有哪些实现的注意…

时空预测网络ST-Resnet 代码复现

ST-ResNet&#xff08;Spatio-Temporal Residual Network&#xff09;是一种用于处理时空数据的深度学习模型&#xff0c;特别适用于视频、时间序列等具有时空结构的数据。下面是一个简单的使用PyTorch搭建ST-ResNet的示例代码。请注意&#xff0c;这只是一个基本的示例&#x…

一文了解国密算法SSL证书

国密算法是中国国家密码管理局发布的一组密码算法标准&#xff0c;用于替代国际上的一些加密算法。在SSL证书中&#xff0c;使用国密算法的证书通常称为"国密SSL证书"。 国密SSL证书与传统的SSL证书在加密算法上有所不同。传统SSL证书通常使用的是RSA或者ECC&#xf…

QQ失效的图片怎么恢复?这3种方法送给大家!

在我们使用QQ时&#xff0c;难免会遇到QQ图片失效的情况。或许是因为误删了聊天记录&#xff0c;又或许是因为没有及时保存而导致失效。 那么&#xff0c;面对这些失效的图片&#xff0c;我们该如何恢复呢&#xff1f;qq失效的图片怎么恢复&#xff1f;今天&#xff0c;小编将…

一起读《奔跑吧Linux内核(第2版)卷1:基础架构》- 了解kmalloc、vmalloc、malloc

大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作&#xff01; 移步飞书获得更好阅读体验&#xff1a; Docs Hello&#xff0c;大家好我是硬核王同学&#xff0c;是一名刚刚工作一年…

开源无代码应用程序生成器Saltcorn

什么是 Saltcorn &#xff1f; Saltcorn 是一个无需编写任何代码即可构建数据库 Web 应用程序的平台。它配备了一个吸睛的仪表板&#xff0c;丰富的生态系统、视图生成器以及支持主题的界面&#xff0c;使用直观的点击、拖放用户界面来构建整个应用程序。 软件的特点&#xff1…

上位机图像处理和嵌入式模块部署(流程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;传统图像处理的方法&#xff0c;一般就是pccamera的处理方式。camera本身只是提供基本的raw data数据&#xff0c;所有的…

SpringBoot - SpringBoot手写模拟SpringBoot启动过程

依赖 建一个工程&#xff0c;两个Module: 1. springboot模块&#xff0c;表示springboot框架的源码实现 2. user包&#xff0c;表示用户业务系统&#xff0c;用来写业务代码来测试我们所模拟出来的SpringBoot 首先&#xff0c;SpringBoot是基于的Spring&#xff0c;所以我…