机器学习 | 无监督聚类K-means和混合高斯模型

news/2024/5/20 8:46:38 标签: 机器学习, 聚类, kmeans

机器学习 | 无监督聚类K-means和混合高斯模型

1. 实验目的

实现一个K-means算法和混合高斯模型,并用EM算法估计模型中的参数。

2. 实验内容

用高斯分布产生 k k k个高斯分布的数据(不同均值和方差)(其中参数自己设定)。

  1. 用K-means聚类,测试效果;

  2. 用混合高斯模型和你实现的EM算法估计参数,看看每次迭代后似然值变化情况,考察EM算法是否可以获得正确的结果(与你设定的结果比较)。

  3. 可以UCI上找一个简单问题数据,用你实现的GMM进行聚类

3. 实验环境

Windows11; Anaconda+python3.11; VS Code

4. 实验过程、结果及分析(包括代码截图、运行结果截图及必要的理论支撑等)

4.1 算法理论支撑

4.1.1 K-means聚类算法

K-means聚类算法的核心思想为假定聚类内部点之间的距离应该小于数据点与聚类外部的点之间的距离。即使得每个数据点和与它最近的中心之间距离的平方和最小

假设数据集为 X = { x 1 , … , x N } , x i ∈ R D X = \left\{ x_{1},\ldots,x_{N} \right\},x_{i} \in \mathbb{R}^{D} X={x1,,xN},xiRD,我们的目标是将数据集划分为 K K K个类别 Y Y Y。令 μ k ∈ R D , k = 1 , … , K \mu_{k} \in \mathbb{R}^{D},k = 1,\ldots,K μkRD,k=1,,K表示各类别的中心。聚类问题等价于求概率分布:

P ( Y | X ) = P ( X | Y ) ∙ P ( Y ) P ( X ) P\left( Y \middle| X \right) = \frac{P\left( X \middle| Y \right) \bullet P(Y)}{P(X)} P(YX)=P(X)P(XY)P(Y)

K-means聚类相当于假设 P ( X | Y ) P\left( X \middle| Y \right) P(XY)服从多元高斯分布(特征之间相互独立,协方差矩阵 Σ = λ I \Sigma\mathbf{=}\lambda\mathbf{I} Σ=λI),且 P ( Y ) P(Y) P(Y)为等概率均匀分布。而 P ( X ) P(X) P(X)为已知数据分布,从似然的角度看,极大化 P ( Y | X ) P\left( Y \middle| X \right) P(YX)即等价于极大化 P ( X | Y ) ∼ − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) P\left( X \middle| Y \right)\sim - \frac{1}{2}(x - \mu)^{T}\Sigma^{- 1}(x - \mu) P(XY)21(xμ)TΣ1(xμ),即最小化各数据点到其类别的均值。

多元正态分布: N ( x ∣ μ , Σ ) = 1 ( 2 π ) D / 2 1 ∣ Σ ∣ 1 / 2   exp ⁡ { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) }   多元正态分布:\mathcal{N(}x|\mu,\Sigma) = \frac{1}{(2\pi)^{D/2}}\frac{1}{\mid \Sigma \mid^{1/2\ }}\exp\{ - \frac{1}{2}(x - \mu)^{T}\Sigma^{- 1}(x - \mu)\}\ 多元正态分布:N(xμ,Σ)=(2π)D/21Σ1/2 1exp{21(xμ)TΣ1(xμ)} 

引入二值指示变量 r n k ∈ { 0 , 1 } r_{nk} \in \{ 0,1\} rnk{0,1}表示数据点的分类情况,则可定义目标函数为

min ⁡ r , μ J = ∑ n = 1 N ∑ k = 1 K r n k ∥ x n − μ k ∥ 2 \min_{r,\mu}{J = \sum_{n = 1}^{N}{\sum_{k = 1}^{K}{r_{nk}\left\| x_{n} - \mu_{k} \right\|^{2}}}} r,μminJ=n=1Nk=1Krnkxnμk2

因此最优化过程可以划分为两步:

  1. 固定 μ \mu μ,优化 r n k r_{nk} rnk。由于 J J J关于 r n k r_{nk} rnk是线性的,因此可以对每个 n n n分别进行最小化,即对 r n k r_{nk} rnk根据与聚类中心的距离进行最优化:

r n k = { 1 ,           k = a r g m i n j ∥ x n − μ j ∥ 2 0 ,          其他情况      r_{nk} = \left\{ \begin{aligned} 1 ,&\ \ \ \ \ \ \ \ \ k = argmin_{j}\left\| x_{n} - \mu_{j} \right\|^{2} \\ 0 ,&\ \ \ \ \ \ \ \ \ 其他情况\ \ \ \end{aligned} \right.\ rnk={1,0,         k=argminjxnμj2         其他情况    

  1. 固定 r n k r_{nk} rnk,优化 μ \mu μ。由于 J J J μ \mu μ的二次函数,对其求导等于零得

∂ J ∂ μ k = 2 ∑ n = 1 N r n k ( x n − μ k ) = 0 ⇒ μ k = ∑ n r n k x n ∑ n r n k \frac{\partial J}{\partial\mu_{k}} = 2\sum_{n = 1}^{N}{r_{nk}(x_{n} - \mu_{k}) = 0} \Rightarrow \mu_{k} = \frac{\sum_{n}^{}{r_{nk}x_{n}}}{\sum_{n}^{}r_{nk}} μkJ=2n=1Nrnk(xnμk)=0μk=nrnknrnkxn

μ k \mu_{k} μk等于类别k的所有数据点的均值。

4.1.2 混合高斯模型

任意连续概率密度都能用多个高斯分布的线性组合叠加的高斯混合概率分布 p ( x ) = ∑ k = 1 K π k N ( x ∣ μ k , Σ k ) p(x) = \sum_{k = 1}^{K}{\pi_{k}\mathcal{N}(x|\mu_{k},\Sigma_{k})} p(x)=k=1KπkN(xμk,Σk)来描述。引入 " 1   o f   K " "1\ of\ K" "1 of K"编码的二值随机变量 z \mathcal{z} z,满足 z k ∈ { 0 , 1 } \mathcal{z}_{k} \in \{ 0,1\} zk{0,1} ∑ k = 1 K z k = 1 \sum_{k = 1}^{K}\mathcal{z}_{k} = 1 k=1Kzk=1

由右图模型定义联合概率分布 p ( x , z ) = p ( z ) ∙ p ( x ∣ z ) p\left( x,\mathcal{z} \right) = p\mathcal{(z) \bullet}p\left( x|\mathcal{z} \right) p(x,z)=p(z)p(xz) z \mathcal{z} z的边缘先验概率分布设为 p ( z k = 1 ) = π k ( 0 ≤ π k ≤ 1 且 ∑ k = 1 K π k = 1 ) p(\mathcal{z}_{k} = 1) = \pi_{k}(0 \leq \pi_{k} \leq 1且\sum_{k = 1}^{K}{\pi_{k} = 1}) p(zk=1)=πk(0πk1k=1Kπk=1),也可写作 p ( z ) = ∏ k = 1 K π k z k p(\mathcal{z}) = \prod_{k = 1}^{K}\pi_{k}^{\mathcal{z}_{k}} p(z)=k=1Kπkzk

那么, x x x的条件概率分布为:
p ( x ∣ z k = 1 ) = N ( x ∣ μ k , Σ k ) ⇔   p ( x ∣ z ) = ∏ k = 1 K N ( x ∣ μ k , Σ k ) z k p(x|\mathcal{z}_{k} = 1) = \mathcal{N(}x|\mu_{k},\Sigma_{k}) \Leftrightarrow \ p(x|\mathcal{z}) = \prod_{k = 1}^{K}{\mathcal{N(}x|\mu_{k},\Sigma_{k})^{\mathcal{z}_{k}}} p(xzk=1)=N(xμk,Σk) p(xz)=k=1KN(xμk,Σk)zk

于是可以给出 p ( x ) = ∑ z p ( z ) ∙ p ( x ∣ z ) = ∑ k = 1 K π k N ( x ∣ μ k , Σ k ) p(x) = \sum_{\mathcal{z}}^{}{p\mathcal{(z) \bullet}p\left( x\mathcal{|z} \right)} = \sum_{k = 1}^{K}{\pi_{k}\mathcal{N(}x|\mu_{k},\Sigma_{k})} p(x)=zp(z)p(xz)=k=1KπkN(xμk,Σk),同时, z \mathcal{z} z的条件后验概率 γ ( z k ) \gamma(\mathcal{z}_{k}) γ(zk)由贝叶斯定理得(已知为 x x x,类别为 z k \mathcal{z}_{k} zk的概率):

γ ( z k ) ≡ p ( z k = 1 | x ) = p ( z k = 1 ) p ( x | z k = 1 ) ∑ j = 1 K p ( z j = 1 ) p ( x ∣ z j = 1 )   = π k N ( x ∣ μ k , Σ k ) ∑ j = 1 K π j N ( x ∣ μ j , Σ k ) \begin{array}{r} \gamma(z_{k}) \equiv p\left( \mathcal{z}_{k} = 1 \middle| x \right) \end{array} = \frac{p\left( z_{k} = 1 \right)p\left( x \middle| z_{k} = 1 \right)}{\sum_{j = 1}^{K}{p\left( z_{j} = 1 \right)p\left( x\mid z_{j} = 1 \right)}}\ = \frac{\pi_{k}\mathcal{N}\left( x\mid\mu_{k},\Sigma_{k} \right)}{\sum_{j = 1}^{K}{\pi_{j}\mathcal{N}\left( x\mid\mu_{j},\Sigma_{k} \right)}} γ(zk)p(zk=1x)=j=1Kp(zj=1)p(xzj=1)p(zk=1)p(xzk=1) =j=1KπjN(xμj,Σk)πkN(xμk,Σk)

于是此聚类过程可以看做将概率分布 p ( x ) p(x) p(x)解耦成 K K K个高斯分布,对应 K K K个类别。对于数据集 X = { x 1 , … , x N } , x i ∈ R D , X ∈ R N × D X = \left\{ x_{1},\ldots,x_{N} \right\},x_{i} \in \mathbb{R}^{D},X \in \mathbb{R}^{N \times D} X={x1,,xN},xiRD,XRN×D,对应隐变量表示为 Z ∈ R N × K Z \in \mathbb{R}^{N \times K} ZRN×K

则对数似然函数为
ln ⁡ p ( X ∣ π , μ , Σ ) = ∑ n = 1 N ln ⁡ { ∑ k = 1 K π k N ( x n ∣ μ k , Σ k ) } \ln p(X \mid \pi,\mu,\Sigma) = \sum_{n = 1}^{N}{\ln\left\{ \sum_{k = 1}^{K}{\pi_{k}\mathcal{N}\left( x_{n}\mid\mu_{k},\Sigma_{k} \right)} \right\}} lnp(Xπ,μ,Σ)=n=1Nln{k=1KπkN(xnμk,Σk)}

将此似然函数关于 μ k \mu_{k} μk求导(假设 Σ k \Sigma_{k} Σk非奇异),令 N k = ∑ n = 1 N γ ( z n k ) ,   γ ( z n k ) ≡ p ( z k = 1 | x n ) N_{k} = \sum_{n = 1}^{N}{\gamma\left( z_{nk} \right),\ \gamma\left( z_{nk} \right) \equiv p\left( z_{k} = 1 \middle| x_{n} \right)} Nk=n=1Nγ(znk), γ(znk)p(zk=1xn)为能被分配到聚类 k k k的有效数量,可以得到:

∑ n = 1 K π k N ( x n ∣ μ k , Σ k ) ∑ j π j N ( x n ∣ μ j , Σ j ) ⏟ γ ( z n k ) Σ k − 1 ( x n − μ k ) = 0 ⇒ μ k = 1 N k ∑ n = 1 N γ ( z n k ) x n \sum_{n=1}^{K}\frac{\pi_{k}\mathcal{N}(x_{n}\mid\mu_{k},\Sigma_{k})}{\underbrace{\sum_{j}\pi_{j}\mathcal{N}(x_{n}\mid\mu_{j},\Sigma_{j})}_{\gamma({z}_{nk})}}\Sigma_{k}^{-1}(x_{n}-\mu_{k})=0\Rightarrow\mu_{k}=\frac{1}{N_{k}}\sum_{n=1}^{N}\gamma(z_{nk})x_{n} n=1Kγ(znk) jπjN(xnμj,Σj)πkN(xnμk,Σk)Σk1(xnμk)=0μk=Nk1n=1Nγ(znk)xn

由此式 μ k \mu_{k} μk可视为当前所有点数据为第 k k k类的概率加权平均。

同样地,将此函数关于 Σ k \Sigma_{k} Σk求导等于0可以得到:

Σ k = 1 N k ∑ n = 1 N γ ( z n k ) ( x n − μ k ) ( x − μ k ) T \Sigma_{k} = \frac{1}{N_{k}}\sum_{n = 1}^{N}{\gamma(z_{nk})(x_{n} - \mu_{k})(x - \mu_{k})^{T}} Σk=Nk1n=1Nγ(znk)(xnμk)(xμk)T

最后使用拉格朗日乘子法关于 π k \pi_{k} πk优化 ln ⁡ p ( X ∣ π , μ , Σ ) + λ ( ∑ k = 1 K π k − 1 ) \ln{p\left( X\mid\pi,\mu,\Sigma \right)} + \lambda(\sum_{k = 1}^{K}{\pi_{k} - 1}) lnp(Xπ,μ,Σ)+λ(k=1Kπk1) π k \pi_{k} πk需要满足和为1的条件)得到:

∑ n = 1 N N ( x n ∣ μ k , Σ k ) ∑ j π j N ( x n ∣ μ j , Σ j ) + λ = 0 ⇒ π k = N k N \sum_{n = 1}^{N}{\frac{\mathcal{N(}x_{n} \mid \mu_{k},\Sigma_{k})}{\sum_{j}^{}{\pi_{j}\mathcal{N(}x_{n} \mid \mu_{j},\Sigma_{j})}} + \lambda} = 0 \Rightarrow \pi_{k} = \frac{N_{k}}{N} n=1NjπjN(xnμj,Σj)N(xnμk,Σk)+λ=0πk=NNk

使用EM算法优化 ln ⁡ p ( X ∣ π , μ , Σ ) \ln p(X \mid \pi,\mu,\Sigma) lnp(Xπ,μ,Σ)即可总结为以下步骤:


ALGORITHM 1 EM for Gaussian Mixture Models

  1. input X ← X \leftarrow X数据集, K ← K \leftarrow K类别数目, i t e r ← iter \leftarrow iter迭代次数;
  2. 初始化均值 μ k \mu_{k} μk、协方差 Σ k \Sigma_{k} Σk和混合系数 π k \pi_{k} πk
  3. 计算对数似然 ln ⁡ p ( X ∣ π , μ , Σ ) ← ∑ n = 1 N ln ⁡ { ∑ k = 1 K π k N ( x n ∣ μ k , Σ k ) } \ln p(X \mid \pi,\mu,\Sigma) \leftarrow \sum_{n = 1}^{N}{\ln\left\{ \sum_{k = 1}^{K}{\pi_{k}\mathcal{N}\left( x_{n}\mid\mu_{k},\Sigma_{k} \right)} \right\}} lnp(Xπ,μ,Σ)n=1Nln{k=1KπkN(xnμk,Σk)}
  4. while i < i t e r i < iter i<iter do
  5. γ ( z n k ) ← π k N ( x n ∣ μ k , Σ k ) ∑ j = 1 K π j N ( x n ∣ μ j , Σ j ) \gamma(z_{nk}) \leftarrow \frac{\pi_{k}\mathcal{N}\left( x_{n}\mid\mu_{k},\Sigma_{k} \right)}{\sum_{j = 1}^{K}{\pi_{j}\mathcal{N}\left( x_{n}\mid\mu_{j},\Sigma_{j} \right)}} γ(znk)j=1KπjN(xnμj,Σj)πkN(xnμk,Σk); (E步)
  6. μ k n e w ← 1 N k ∑ n = 1 N γ ( z n k ) x n \mu_{k}^{new} \leftarrow \frac{1}{N_{k}}\sum_{n = 1}^{N}{\gamma(z_{nk})x_{n}} μknewNk1n=1Nγ(znk)xn
  7. Σ k n e w ← 1 N k ∑ n = 1 N γ ( z n k ) ( x n − μ k n e w ) ( x − μ k n e w ) T \Sigma_{k}^{new} \leftarrow \frac{1}{N_{k}}\sum_{n = 1}^{N}{\gamma(z_{nk})(x_{n} - \mu_{k}^{new})(x - \mu_{k}^{new})^{T}} ΣknewNk1n=1Nγ(znk)(xnμknew)(xμknew)T; (M步)
  8. π k n e w ← N k N \pi_{k}^{new} \leftarrow \frac{N_{k}}{N} πknewNNk
  9. end while
  10. return μ k , Σ k , π k \mu_{k},\Sigma_{k},\pi_{k} μk,Σk,πk //返回最优参数;

4.2 实验设计

4.2.1 随机数据生成

在这里插入图片描述
如上图代码,使用np.random.multivariate_normal方法按给定的协方差矩阵和均值按多元高斯分布初始化 k k k个类别的数据点。

4.2.2 K-means聚类

首先初始化 k k k个类的中心,这里采取的是从数据集中随机选取 k k k个样本作为初始的 k k k类中心。

在这里插入图片描述

而后是更新中心的算法,主要是分为两步:

  1. 通过计算每个样本到 k k k个中心的距离(欧式距离),然后选取最小的距离对应的那个聚类中心作为样本标签,将该样本划分到这个类中,

  2. 根据更新后的类别计算类内均值,作为新的中心。

在这里插入图片描述

重复上述过程,直至中心更新距离较之上次变化较小时退出迭代。

在这里插入图片描述

4.2.3 混合高斯模型GMM

首先初始化 k k k个类的均值、协方差和混合系数,可以有随机生成和采用K-means聚类的结果两种方式进行初始化。

在这里插入图片描述

根据对数似然计算公式 l n p ( X ∣ π , μ , Σ ) ← ∑ n = 1 N ln ⁡ { ∑ k = 1 K π k N ( x n ∣ μ k , Σ k ) } lnp(X \mid \pi,\mu,\Sigma) \leftarrow \sum_{n = 1}^{N}{\ln\left\{ \sum_{k = 1}^{K}{\pi_{k}\mathcal{N}\left( x_{n}\mid\mu_{k},\Sigma_{k} \right)} \right\}} lnp(Xπ,μ,Σ)n=1Nln{k=1KπkN(xnμk,Σk)}以及 关于 μ k \mu_{k} μk Σ k \Sigma_{k} Σk π k \pi_{k} πk的导数进行EM更新:

  1. E步:计算 γ ( z n k ) ← π k N ( x n ∣ μ k , Σ k ) ∑ j = 1 K π j N ( x n ∣ μ j , Σ j ) \gamma(z_{nk}) \leftarrow \frac{\pi_{k}\mathcal{N}\left( x_{n}\mid\mu_{k},\Sigma_{k} \right)}{\sum_{j = 1}^{K}{\pi_{j}\mathcal{N}\left( x_{n}\mid\mu_{j},\Sigma_{j} \right)}} γ(znk)j=1KπjN(xnμj,Σj)πkN(xnμk,Σk),即各数据点的类别概率;

  2. M步:计算新的均值 μ k n e w = 1 N k ∑ n = 1 N γ ( z n k ) x n ,  混合系数 π k n e w ← N k N 以及 协方差 Σ k n e w = 1 N k ∑ n = 1 N γ ( z n k ) ( x n − μ k n e w ) ( x − μ k n e w ) T \mu_{k}^{new} = \frac{1}{N_{k}}\sum_{n = 1}^{N}{\gamma(z_{nk})x_{n}},\ 混合系数\pi_{k}^{new} \leftarrow \frac{N_{k}}{N}以及{协方差\Sigma}_{k}^{new} = \frac{1}{N_{k}}\sum_{n = 1}^{N}{\gamma(z_{nk})(x_{n} - \mu_{k}^{new})(x - \mu_{k}^{new})^{T}} μknew=Nk1n=1Nγ(znk)xn, 混合系数πknewNNk以及协方差Σknew=Nk1n=1Nγ(znk)(xnμknew)(xμknew)T

在这里插入图片描述

重复上述过程,直至似然函数较之上次变化较小时退出迭代。

在这里插入图片描述

4.3 实验结果及分析

4.3.1 自己生成数据结果比较

设置均值为 ( − 2 , − 2 ) , ( 2 , − 2 ) , ( 2 , 2 ) , ( − 2 , 2 ) ( - 2, - 2),(2, - 2),(2,2),( - 2,2) (2,2),(2,2),(2,2),(2,2),协方差矩阵均为 [ 1 0 0 1 ] \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} [1001],生成1000组数据,而后先后使用K-means和GMM进行聚类聚类结果如下:

K-means正确率为96.7%,GMM正确率为96.9%(在使用K-means的结果作为GMM初始化的条件下)。

在这里插入图片描述

同时,经过反复实验发现,K-means和GMM的聚类结果严重依赖于初始化的结果,当初始化中心(或均值)选取区分度不高时,结果往往会比较差。

而GMM以K-means的结果初始化,能够一定程度上优化K-means的聚类结果(特别是当分类结果不好时)。
在这里插入图片描述

而特征之间不相互独立时,GMM聚类结果明显优于K-means。这是由于K-means假设数据呈球状分布,不能够区分开具有不相互独立的特征。

下图为均值为 ( − 2 , − 2 ) , ( 2 , − 2 ) , ( 2 , 2 ) , ( − 2 , 2 ) ( - 2, - 2),(2, - 2),(2,2),( - 2,2) (2,2),(2,2),(2,2),(2,2),协方差矩阵均为 [ 1 0.36 0.36 1 ] \begin{bmatrix} 1 & 0.36 \\ 0.36 & 1 \end{bmatrix} [10.360.361],生成1000组数据,先后使用K-means和GMM进行聚类聚类结果如下:

此时K-means正确率为91.8%,GMM正确率为97.6%。

在这里插入图片描述

4.3.2 UCI-Iris数据集结果比较

而后使用Iris数据集进行聚类,K-means分类正确率为88%,GMM的分类正确率为96.7%,将聚类结果按第一个特征和第二个特征进行可视化结果如下:

在这里插入图片描述

5. 实验结论

K-means和GMM都是EM算法的体现。两者共同之处都有隐变量,遵循EM算法的E步和M步的迭代优化。

K-means其实就是一种特殊的高斯混合模型,提出了强假设,假设每一类在样本数据中出现的概率相等均为 1 k \frac{1}{k} k1,每个特征间相互独立,且满足变量间的协方差矩阵为单位对角阵。在此条件下,可以直接用欧氏距离作为K-means的协方差去衡量相似性。

而GMM用混合高斯模型来描述聚类结果,且假设多个高斯模型对总模型的贡献是有权重的,且样本属于某一类也是由概率的,从而相似度也由离散的 0 , 1 0,1 0,1变成了需要通过全概率公式计算的值,分类效果一般好于K-means。

实验发现,初值的选取对K-means和GMM的效果影响较大,初始化较差可能会导致陷入局部最优解而得不到较好的聚类结果。可以使用GMM对K-means的分类结果进行进一步优化。

6. 参考文献

[1]李航. 统计学习方法[M]. 清华大学出版社, 2012.

[2]周志华. 机器学习[M]. 清华大学出版社, 2016.

[3]Bishop C .Pattern Recognition and Machine Learning[M]. 2006.


http://www.niftyadmin.cn/n/5325097.html

相关文章

java大数据hadoop2.9.2 Java编写Hadoop分析平均成绩

1、准备文件&#xff0c;例如score.txt&#xff0c;内容如下&#xff1a; zs k1 88 ls k1 98 ww k1 78 zs k2 88 ls k2 98 ww k2 78 zs k3 88 ls k3 98 ww k3 78 2、创建maven项目 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --><d…

BC7 缩短二进制

描述 我们处理的整数通常用十进制表示&#xff0c;在计算机内存中是以二进制补码形式存储&#xff0c;但通常二进制表示的整数比较长&#xff0c;为了便于在程序设计过程中理解和处理数据&#xff0c;通常采用八进制和十六进制&#xff0c;缩短了二进制补码表示的整数&#xf…

宿舍管理系统的设计与实现:基于Spring Boot、Java、Vue.js和MySQL的完整解决方案

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

mac vscode latex实用

网上有教程怎么在vscode里安装macTex以及插件&#xff0c;然后就可以在latex里写代码了&#xff0c;这里需要修改的是对应的json文件&#xff0c;输入command P,可以看到最近打开的json设置文件&#xff0c;结果如下 然后设置这个json文件&#xff0c;我的json文件设置如下 …

数据仓库(3)-模型建设

本文从以下9个内容&#xff0c;介绍数据参考模型建设相关内容。 1、OLTP VS OLAP OLTP&#xff1a;全称OnLine Transaction Processing&#xff0c;中文名联机事务处理系统&#xff0c;主要是执行基本日常的事务处理&#xff0c;比如数据库记录的增删查改,例如mysql、oracle…

web前端算法简介之字典与哈希表

回顾 栈、队列 &#xff1a; 进、出 栈&#xff08;Stack&#xff09;&#xff1a; 栈的操作主要包括&#xff1a; 队列&#xff08;Queue&#xff09;&#xff1a; 队列的操作主要包括&#xff1a; 链表、数组 &#xff1a; 多个元素存储组成的 简述链表&#xff1a;数组&…

点击随机红点的简单游戏(pygame)

import pygame import sys import random# 初始化 Pygame pygame.init()# 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Click the Red Dot")# 定义颜色 black (0, 0, 0) red (255, 0, 0)…

Codeforces Round 779 (Div. 2) D2. 388535(思维题 二进制性质/trie树上最大最小异或)

题目 t(t<1e5)组样例&#xff0c;每次给定l,r(0<l<r<2^17) 和r-l1个数ai&#xff0c;新序列是被[l,r]这些数异或上同一个x得到的&#xff0c; 求出x&#xff0c;有多个输出任意一个即可 思路来源 官方题解 洛谷题解 Educational Codeforces Round 157 (Rated…