【机器学习】采样方法

news2024/11/25 0:35:01

文章目录

  • 采样方法
    • 11.1 简介
    • 11.2 常见采样方法
      • 11.2.1 均匀分布采样
      • 11.2.2 逆变换采样
      • 11.2.3 拒绝采样
      • 11.2.4 重要采样
      • 11.2.5 Metropolis方法
      • 11.2.6 Metropolis-Hasting 算法
      • 11.2.7 吉布斯采样

采样方法

11.1 简介

  1. 什么是采样

    从一个分布中生成一批服从该分布的样本,该过程叫采样.采样本质上是对随机现象的模拟,根据给定的概率分布,来模拟产生一个对应的随机事件。采样可以让人们对随机事件及其产生过程有更直观的认识.

  2. 蒙特卡洛

    要解决的问题:寻找某个定义在概率分布𝑝(𝑧)上的函数𝑓(𝑧)的期望,即计算 E ( f ) = ∫ f ( z ) p ( z ) d z \mathbb E(f)=\int f(\mathbf z)p(\mathbf z)\mathrm d\mathbf z E(f)=f(z)p(z)dz

    对于大多数实际应用中的概率模型来说,无法精确计算其和或积分,可以采取基于数值采样的近似推断方法,也被称为蒙特卡罗(MonteCarlo)方法

    对这个问题,蒙特卡罗方法是从概率分布𝑝(𝑧)中独立抽取𝑙个样本 z ( 1 ) , z ( 2 ) , . . . , z ( l ) z^{(1)},z^{(2)},...,z^{(l)} z(1),z(2),...,z(l) ,这样期望即可通过有限和的方式计算,以此得到一个经验平均值,即计算: f ^ = 1 L ∑ l = 1 L f ( z ( l ) ) \hat{f}=\frac{1}{L}\sum_{l=1}^{L}f\bigl(\mathbf{z}^{(l)}\bigr) f^=L1l=1Lf(z(l))

    image-20230425080312128

11.2 常见采样方法

11.2.1 均匀分布采样

均匀分布是指整个样本空间中的每一个样本点对应的概率(密度)都是相等的;根据样本空间是否连续,又分为离散均匀分布和连续均匀分布。

一般计算机的程序都是确定性的,无法产生真正意义上的完全均匀分布的随机数,只能产生伪随机数,用线性同余法生成区间[0, m - 1]上的伪随机数序列:
x t + 1 = ( a ⋅ x t + c ) m o d    m x_{t+1}=(a\cdot x_t+c)\mod m xt+1=(axt+c)modm
其中,模 m > 0 m>0 m>0,系数 0 < a < m 0<a<m 0<a<m,增量 0 ≤ c < m 0\leq c<m 0c<m,种子 x 0 x_0 x0满足 0 ≤ x 0 < m 0\leq x_{0}<m 0x0<m

image-20230425081557430

11.2.2 逆变换采样

定理:设𝑦是一个连续随机变量,概率密度函数为𝑝(𝑦) ,累计分布函数为ℎ(y) =P(𝑦) ,则𝑧 = ℎ(y) 是定义在区间0 ≤ 𝑧 ≤ 1上的均匀分布,即𝑝 (𝑧) = 1 (0 ≤ 𝑧 ≤ 1)。

证明:ℎ(y) 是累计分布函数,则0 ≤ 𝑧 = ℎ(y) ≤ 1,且ℎ(y)是单调递增函数 , z的累积分布函数:
P ( z ≤ Z ) = P ( h ( y ) ≤ Z ) = P ( y ≤ h − 1 ( Z ) ) = h ( h − 1 ( Z ) ) = Z p ( z ) = d F ( Z ) d Z = 1 ( 0 ≤ z ≤ 1 ) \begin{array}{c}\mathrm P(z\leq Z)=\mathrm P(h(y)\leq Z)=\mathrm P(y\leq h^{-1}(Z))=h(h^{-1}(Z))=Z\\\\ p(z)=\dfrac{\mathrm dF(Z)}{\mathrm dZ}=1(0\leq z\leq1)\end{array} P(zZ)=P(h(y)Z)=P(yh1(Z))=h(h1(Z))=Zp(z)=dZdF(Z)=1(0z1)
image-20230425083400362

待采样的目标分布为 p ( x ) p(x) p(x),它的累计分布函数为 z = Φ ( X ) = ∫ − ∞ X p ( x ) d x \mathrm{z}=\Phi(X)=\int_{-\infty}^{X}p(x)d x z=Φ(X)=Xp(x)dx,则逆变换采样法步骤为:

  • 从均匀分布U(0,1)产生一个随机数 z i z_i zi
  • 计算逆函数 X i = Φ − 1 ( z i ) X_{i}=\Phi^{-1}(z_{i}) Xi=Φ1(zi),循环上述步骤,产生更多样本

例:

指数分布密度函数 p ( x ) = λ exp ⁡ ( − λ x ) ( 0 ≤ x < ∞ ) p(x)=\lambda\exp(-\lambda x)(0\le x<\infty) p(x)=λexp(λx)(0x<)其累计分布函数为 z = Φ ( X ) = 1 − exp ⁡ ( − λ X ) \text{z}=\Phi(X)=1-\exp(-\lambda X) z=Φ(X)=1exp(λX)

其逆变换为: X = − λ − 1 ln ⁡ ( 1 − z ) X=-\lambda^{-1}\ln(1-z) X=λ1ln(1z)

11.2.3 拒绝采样

拒绝采样,又称为接受-拒绝采样,基本思想是用一“更大的的概率分布”或“更简单的概率分布”q(z)覆盖原本的概率分布,这个更简单的概率分布容易采样 (如正态分布)

  • p ⁡ ( z ) = 1 z p p ⁡ ~ ( z ) \operatorname{p}(z)=\frac{1}{z_p}\tilde{\operatorname{p}}(z) p(z)=zp1p~(z)为采样分布, p ⁡ ~ ( z ) \tilde{\operatorname{p}}(z) p~(z)为已知分布, Z p Z_p Zp为归一化因子(这一步没看明白暂且当成一样的)
  • 引入较简单分布 q ( z ) q(z) q(z) ,称为提议分布,从中可以较容易采样
  • 引入常数k,对任意z满足 k q ( z ) ≥ p ~ ( z ) \mathrm{kq}(z)\geq\tilde{\mathrm{p}}(z) kq(z)p~(z) k q ( z ) kq(z) kq(z)称为比较函数
image-20230425085950804

拒绝采样方法的步骤:

  • q ( z ) q(z) q(z)中随机采一个样本 z 0 z_0 z0
  • 生成区间 [ 0 , k q ( z 0 ) ] [0,kq(z_0)] [0,kq(z0)]上的均匀分布的一个样本 u 0 u_0 u0
  • 如果 u 0 ≥ p ~ ( z ) u_0\geq \tilde{\mathrm{p}}(z) u0p~(z),则拒绝该样本;反之接受
  • 重复以上过程得到 [ z 0 , z 1 , … z n ] \left[z_{0},z_{1},\ldots z_{n}\right] [z0,z1,zn]即是对 p ( z ) p(z) p(z)的一个近似

在上述拒绝采样方法中,𝑧的原始值从概率分布𝑞(𝑧)中生成,这些样本之后被接受的可能性为: p ~ ( z ) k q ( z ) \frac{{\tilde{p}}(z)}{k q(z)} kq(z)p~(z),因此,样本被接受的平均概率为:
p ( a c c e p t ) = ∫ { p ~ ( z ) k q ( z ) } q ( z ) d z = 1 k ∫ p ~ ( z ) d z p(\mathrm{accept})=\int\left\{\frac{\tilde{p}(z)}{kq(z)}\right\}q(z)dz=\frac{1}{k}\int\tilde{p}(z)dz p(accept)={kq(z)p~(z)}q(z)dz=k1p~(z)dz
原则上𝑘可以取得很大,从而满足总能全覆盖,但是不难发现,𝑘取得越大,拒绝概率也更高;因此,选取的𝑘要尽可能的小,并使得𝑘𝑞(𝑧)恰好能覆盖$ \tilde{\mathrm{p}}(z)$

11.2.4 重要采样

E [ f ] = ∫ f ( z ) p ( z ) d z (11.1) \mathbb{E}[f] = \int f(z)p(z)dz \tag{11.1} \\ E[f]=f(z)p(z)dz(11.1)

f ^ = 1 L ∑ l = 1 L f ( z ( l ) ) (11.2) \hat{f} = \frac{1}{L}\sum\limits_{l=1}^L f(z^{(l)}) \tag{11.2} f^=L1l=1Lf(z(l))(11.2)

想从复杂概率分布中采样的一个主要原因是能够使用式(11.1)计算期望。重要采样(importance sampling)的方法提供了直接近似期望的框架,但是它本身并没有提供从概率分布$ p(z) $中采样的方法。

公式(11.2)给出的期望的有限和近似依赖于能够从概率分布 p ( z ) p(z) p(z)中采样。然而,假设直接从 p ( z ) p(z) p(z)中采样无法完成,但是对于任意给定的 z z z值,我们可以很容易地计算 p ( z ) p(z) p(z)一种简单的计算期望的方法是将 z z z空间离散化为均匀的格点,将被积函数使用求和的方式计算,形式为
E [ f ] ≃ ∑ l = 1 L p ( z ( l ) ) f ( z ( l ) ) \mathbb{E}[f] \simeq \sum\limits_{l=1}^Lp(z^{(l)})f(z^{(l)}) E[f]l=1Lp(z(l))f(z(l))
这种方法的一个明显的问题是求和式中的项的数量随着 z z z的维度指数增长。此外,正如我们已经注意到的那样,我们感兴趣的概率分布通常将它们的大部分质量限制在 z z z空间的一个很小的区域,因此均匀地采样非常低效,因为在高维的问题中,只有非常小的一部分样本会对求和式产生巨大的贡献。我们希望从 p ( z ) p(z) p(z)的值较大的区域中采样,或理想情况下,从 p ( z ) f ( z ) p(z)f(z) p(z)f(z)的值较大的区域中采样

与拒绝采样的情形相同,重要采样基于的是对提议分布 q ( z ) q(z) q(z)的使用,我们很容易从提议分布中采样,如下图所示:

image-20230428152651433

重要采样解决的是计算函数 f ( z ) f(z) f(z)关于分布 p ( z ) p(z) p(z)的期望的问题,其中,从 p ( z ) p(z) p(z)中直接采样比较困难。相反,样本 z ( l ) {z^{(l)}} z(l)从一个简单的概率分布 q ( z ) q(z) q(z)中抽取,求和式中的对应项的权值为 p ( z ( l ) ) / q ( z ( l ) ) p(z^{(l)})/q(z^{(l)}) p(z(l))/q(z(l)),这样就可以还原到从 p ( z ) p(z) p(z)中取样。

上述过程中的式子,我们可以通过$ q(z) 中的样本 中的样本 中的样本 {z^{(l)}} $的有限和的形式来表示期望
E = ∫ f ( z ) p ( z ) d z   = ∫ f ( z ) p ( z ) q ( z ) q ( z ) d z ≃ 1 L ∑ l = 1 L p ( z ( l ) ) q ( z ( l ) ) f ( z ( l ) ) \mathbb{E} = \int f(z)p(z)dz \ = \int f(z)\frac{p(z)}{q(z)}q(z)dz \simeq \frac{1}{L}\sum\limits_{l=1}^L\frac{p(z^{(l)})}{q(z^{(l)})}f(z^{(l)}) E=f(z)p(z)dz =f(z)q(z)p(z)q(z)dzL1l=1Lq(z(l))p(z(l))f(z(l))
其中 r l = p ( z ( l ) ) / q ( z ( l ) ) r_l = p(z^{(l)}) / q(z^{(l)}) rl=p(z(l))/q(z(l))被称为重要性权重(importance weights),修正了由于从错误的概率分布 q ( z ) q(z) q(z)中采样引入的偏差。

而更常见的情形是,概率分布 p p p的计算结果没有标准化,也就是 p ( z ) = p ~ ( z ) / Z p p(z) = \tilde{p}(z) / Z_p p(z)=p~(z)/Zp中我们只知道 p ~ ( z ) \tilde{p}(z) p~(z),其中 p ~ ( z ) \tilde{p}(z) p~(z)可以很容易地由 z z z计算出来(可能没有函数表达式),而 Z p Z_p Zp未知( p ~ ( z ) \tilde{p}(z) p~(z)无法积分算)。类似的,我们可能希望使用重要采样分布 q ( z ) = q ~ ( z ) / Z q q(z) = \tilde{q}(z) / Z_q q(z)=q~(z)/Zq中的 q ~ ( z ) \tilde{q}(z) q~(z),它具有相同的性质。于是我们得到:
E [ f ] = ∫ f ( z ) p ( z ) d z   = Z q Z p ∫ f ( z ) p ~ ( z ) q ~ ( z ) q ( z ) d z   ≃ Z q Z p 1 L ∑ l = 1 L r ~ l f ( z ( l ) ) \mathbb{E}[f] = \int f(z)p(z)dz \ = \frac{Z_q}{Z_p}\int f(z)\frac{\tilde{p}(z)}{\tilde{q}(z)}q(z)dz \ \simeq \frac{Z_q}{Z_p}\frac{1}{L}\sum\limits_{l=1}^L\tilde{r}_lf(z^{(l)}) E[f]=f(z)p(z)dz =ZpZqf(z)q~(z)p~(z)q(z)dz ZpZqL1l=1Lr~lf(z(l))
其中 r ~ l = p ~ ( z ( l ) ) / q ~ ( z ( l ) ) \tilde{r}_l = \tilde{p}(z^{(l)}) / \tilde{q}(z^{(l)}) r~l=p~(z(l))/q~(z(l))

我们还可以使用同样的样本集合来计算比值 Z p / Z q Z_p / Z_q Zp/Zq,结果为:
Z p Z q = 1 Z q ∫ p ~ ( z ) d z = ∫ p ~ ( z ) q ~ ( z ) q ( z ) d z   ≃ 1 L ∑ l = 1 L r ~ l \frac{Z_p}{Z_q} = \frac{1}{Z_q}\int\tilde{p}(z)dz = \int\frac{\tilde{p}(z)}{\tilde{q}(z)}q(z)dz \ \simeq \frac{1}{L}\sum\limits_{l=1}^L\tilde{r}_l ZqZp=Zq1p~(z)dz=q~(z)p~(z)q(z)dz L1l=1Lr~l

第一个等式中 Z p Z_p Zp ∫ p ~ ( z ) d z \int\tilde{p}(z)dz p~(z)dz等价计算了出来,第二个等式中 Z q Z_q Zq q ( z ) = q ~ ( z ) / Z q q(z) = \tilde{q}(z) / Z_q q(z)=q~(z)/Zq替代

因此:
E [ f ] ≃ ∑ l = 1 L w l f ( z ( l ) ) \mathbb{E}[f] \simeq \sum\limits_{l=1}^Lw_lf(z^{(l)}) E[f]l=1Lwlf(z(l))
其中:
w l = r ~ l ∑ m r ~ m = p ~ ( z ( l ) ) / q ( z ( l ) ) ∑ m p ~ ( z ( l ) ) / q ( z ( l ) ) w_l = \frac{\tilde{r}_l}{\sum_m\tilde{r}_m} = \frac{\tilde{p}(z^{(l)})/q(z^{(l)})}{\sum_m\tilde{p}(z^{(l)})/q(z^{(l)})} wl=mr~mr~l=mp~(z(l))/q(z(l))p~(z(l))/q(z(l))

11.2.5 Metropolis方法

与拒绝采样和重要采样相同,我们再一次从提议分布中采样。但是这次我们记录下当前状态 z ( τ ) z^{(\tau)} z(τ)以及依赖于这个当前状态的提议分布 q ( z ∣ z τ ) q(z|z^\tau) q(zzτ),从而样本序列 z ( 1 ) , z ( 2 ) , … z^{(1)},z^{(2)},\ldots z(1),z(2),组成了一个马尔科夫链。

我们假设提议分布足够简单很容易直接采样,且 p ( z ) = p ~ ( z ) / Z p p(\mathbf{z})=\widetilde{p}({\mathbf{z}})/Z_{p} p(z)=p (z)/Zp中的 p ~ ( z ) \widetilde{p}({\mathbf{z}}) p (z)可以很容易的计算值。

在算法的每次迭代中,我们从提议分布中生成一个候选样本 z ∗ z^* z,然后根据一个恰当的准则接受这个样本。

在基本的 Metropolis 算法中,我们假定提议分布是对称的,即 q ( z A ∣ z B ) = q ( z B ∣ z A ) q(z_A|z_B)=q(z_B|z_A) q(zAzB)=q(zBzA)对于所有的 z A z_A zA z B z_B zB都成立。这样,候选样本被接受的概率为:
A ( z ⋆ , z ( τ ) ) = min ⁡ ( 1 , p ~ ( z ⋆ ) p ~ ( z ( τ ) ) ) A(\mathbf{z}^{\star},\mathbf{z}^{(\tau)})=\min\left(1,\frac{\widetilde{p}(\mathbf{z}^{\star})}{\widetilde{p}(\mathbf{z}^{(\tau)})}\right) A(z,z(τ))=min(1,p (z(τ))p (z))
我们的接受准则是:当接受概率大于预设值u时,则接受这个样本。

如果候选样本被接受,那么 z ( τ + 1 ) = z ∗ z^{(\tau+1)} = z^* z(τ+1)=z;否则候选样本点 z ∗ z^* z被抛弃, z ( τ + 1 ) z^{(\tau+1)} z(τ+1)被设置为 z ( τ ) z^{(\tau)} z(τ)

然后从概率分布 q ( z ∣ z ( τ + 1 ) ) q(z|z^{(\tau+1)}) q(zz(τ+1))中再次抽取一个候选样本。

可以看到,在 Metropolis 算法中,当一个候选点被拒绝时,前一个样本点会被包含到是最终的样本的列表中,从而产生了这个样本点的多个副本。虽然在实际中我们只会保留一个样本副本,以及一个整数的权因子,记录状态出现了多少次。设计马尔科夫链蒙特卡洛方法的一个中心目标就是避免随机游走行为。

image-20230521002841427

11.2.6 Metropolis-Hasting 算法

与 Metropolis 算法相比,提议分布不再是参数的一个对称函数,此时的接受概率变为:
A k ( z ⋆ , z ( τ ) ) = min ⁡ ( 1 , p ~ ( z ⋆ ) q k ( z ( τ ) ∣ z ⋆ ) p ~ ( z ( τ ) ) q k ( z ⋆ ∣ z ( τ ) ) ) A_k(\mathbf{z}^{\star},\mathbf{z}^{(\tau)})=\min\left(1,\frac{\widetilde{p}(\mathbf{z}^{\star})q_k(\mathbf{z}^{(\tau)}|\mathbf{z}^{\star})}{\widetilde{p}(\mathbf{z}^{(\tau)})q_k(\mathbf{z}^{\star}|\mathbf{z}^{(\tau)})}\right) Ak(z,z(τ))=min(1,p (z(τ))qk(zz(τ))p (z)qk(z(τ)z))
其中k标记出可能的转移集合中的成员,对于一个对称的提议分布, Metropolis-Hasting 准则会退化为 Metropolis 准则。

具体推导过程设计到马尔科夫链的知识,这里只记形式

11.2.7 吉布斯采样

吉布斯采样是一个简单的并且广泛应用的马尔科夫链蒙特卡洛算法,可以看做 Metropolis-Hasting 算法的一个具体的情形

考虑我们项采样的概率分布 p ( z ) = p ( z 1 , … , z M ) p(z)=p(z_1,\ldots,z_M) p(z)=p(z1,,zM),并且假设我们已经选择了马尔科夫链的某个初始状态。吉布斯采样的每个步骤涉及到将一个变量的值替换为以剩余变量的值为条件,从这个概率分布中抽取的那个变量的值。具体流程如下:

image-20230520165910291

参考书:PRML

参考:PRML学习笔记(十一) - Pelhans 的博客

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

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

相关文章

Linux知识点 -- 进程概念(一)

Linux知识点 – 进程概念&#xff08;一&#xff09; 文章目录 Linux知识点 -- 进程概念&#xff08;一&#xff09;一、冯诺伊曼体系结构二、操作系统&#xff08;OS&#xff09;1.概念2.设计OS的目的3.如何理解管理4.系统调用和库函数的概念 三、进程概念1.理解进程2.描述进程…

Windows源码安装INDEMIND双目惯性模组

最近电赛准备在Win10的平台上做一个增强现实眼镜&#xff0c;所以IMU相机也是必不可少的传感器&#xff0c;记录Windows源码安装INDEMIND双目惯性模组。 文章目录 实验环境一、配置准备1、SDK下载及准备安装2、安装CMake并添加环境变量3、设置".sln"文件的默认打开方…

区块链服务网络发展联盟最新成员单位名单公布

原标题&#xff1a;《BSN发展联盟第六批入盟成员单位及全体联盟成员名单公示》 为了更好地推动BSN的发展&#xff0c;国家信息中心、中国移动通信集团有限公司、中国银联股份有限公司、北京红枣科技有限公司共同发起成立了区块链服务网络发展联盟&#xff08;Blockchain-based…

六、AOP(2)

一、AOP操作&#xff08;AspectJ注解&#xff09;重点 1.创建类&#xff0c;在类里面定义方法com.zhilei.spring5.aopanno public class User {public void add(){System.out.println("add...");} }2.创建增强类&#xff0c;编写增强逻辑 在增强类里面&#xff0c…

基于LC3模拟器的简单游戏设计:简易四子棋

一、实验目的 分析和理解指定的需解决问题。利用LC-3的汇编代码设计实现相关程序。通过LC-3仿真器调试和运行相关程序并得到正确的结果。 二、实验内容 四子棋是一款普遍流行的简易型桌面游戏&#xff0c;据说&#xff0c;虎克船长曾因专注于此游戏而长期隐身在住所&#xf…

如何绘制算法流程图?常见渠道一览

算法流程图是一种用于描述算法执行流程的图形化工具&#xff0c;它通常将算法的执行过程分解成若干个步骤&#xff0c;并通过线条连接这些步骤&#xff0c;形成一个完整的流程图。在计算机科学和信息技术的发展过程中&#xff0c;算法流程图已经成为了一种非常有用的工具&#…

ThreadLocal为什么容易内存泄露?

文章目录 一、Java的四种引用二、ThreadLocal为什么容易内存泄露&#xff1f;三、源码 一、Java的四种引用 1、强引用&#xff1a;强引用在程序内存不足&#xff08;OOM&#xff09;的时候也不会被回收 2、软引用&#xff1a;软引用在程序内存不足时&#xff0c;会被回收 3、弱…

前端axios fetch 解决接口请求响应数据返回快慢不均导致的数据错误问题

引言 搜索功能&#xff0c;我想很多业务都会涉及&#xff0c;这个功能的特点是&#xff1a; 用户可以在输入框中输入一个关键字&#xff0c;然后在一个列表中显示该关键字对应的数据&#xff1b;输入框是可以随时修改/删除全部或部分关键字的&#xff1b;如果是实时搜索&…

Go学习圣经:0基础精通GO开发与高并发架构(1)

GO 学习圣经&#xff1a;底层原理和实操 说在前面&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer…

高并发线程内存事件处理器 disruptor 三 高性能原理

一 disruptor为什么快的核心原理 属性填充&#xff1a;通过添加额外的无用信息&#xff0c;避免伪共享问题 什么是共享内存 在系统内存中&#xff0c;我们的数据存在于cpu缓存中&#xff0c;cpu缓存的基础缓存单位为 cache line&#xff0c;通常cache line的大小为64字节&…

什么是测试策略?怎么制定测试策略?测试管理篇

之前说了太多的测试技术和测试用例设计方法&#xff0c;猛地发现有点“偏科“了。今天我们放松一些&#xff0c;泡一杯茶&#xff0c;一起来聊一聊测试策略吧。 当然&#xff0c;文章脉络肯定是咱们老三样&#xff1a;什么是测试策略&#xff0c;为什么要制定测试策略&#xff…

5个最好的WooCommerce商城自动化动作来增加销售量

您是否正在寻找简单智能的方法来自动执行任务并增加 WooCommerce 商店的销售额&#xff1f; 通过在线商店中的自动化任务&#xff0c;您可以在发展业务和增加销售额的同时节省时间和金钱。 在本文中&#xff0c;我们将向您展示如何使用 WooCommerce商城自动化来增加销售额。 …

Puppeteer入门实践

环境 1、安装nodejs 官网&#xff1a;https://nodejs.org/zh-cn 下载安装好nodejs只后 验证&#xff1a;node -v 出现版本号表示安装成功&#xff0c;否则需要配置环境变量 2、创建node项目并初始化 随便新建一个文件夹 进入文件夹搜索cmd回车 执行npm init -y 安装依赖 …

RabbitMq--- 惰性队列

前言 消息堆积是Mq消费时常见的问题&#xff0c;这里我们展开说一下消息堆积的原因&#xff0c;以及RabbitMq 中是如何解决这个问题的。 1. 消息堆积问题 当生产者发送消息时的速度超过了消费者处理消息的速度&#xff0c;就会导致队列中的消息堆积&#xff0c;直到队列存储…

【Linux】shell脚本—正则表达式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、正则表达式概述二、基本的正则表达式三、操作演示 一、正则表达式概述 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、…

WIN11+CLion+CMake+MINGW+OPENCV编译需注意问题

安装编译教程可参考以下链接&#xff1a; CLion OpenCV cmake&#xff0c;源码编译及使用_clion编译opencv_拜阳的博客-CSDN博客 使用CLion开发openCV——环境搭建全记录_-Willing-的博客-CSDN博客 此文主要是记录自己在编译过程中遇到的问题和解决方法 1、版本问题 C…

Windows 10 主机上的 VMware Workstation 和设备/凭据防护不兼容“错误

Windows 10 主机上的 VMware Workstation 和设备/凭据防护不兼容“错误 VMware Workstation 和 Device/Credential Guard 不兼容。VMware 工作站可以在禁用设备/凭据防护后运行。 排查错误的过程&#xff1a; 要解决错误&#xff0c;请按照以下步骤操作&#xff1a; 如果您…

LDR6020 【USB_C显示器方案】台式显示器方案介绍

首先介绍一下什么是Type-c接口&#xff1f; 现在显示器上常见的有这几种接口&#xff1a;HDMI、DP、USB-A、USB-C&#xff08;USB Type-c接口&#xff09;、3.5mm和电源接口&#xff0c;像之前流行的VGA接口和DVI接口&#xff0c;基本上在新显示器上&#xff0c;尤其是中高端显…

什么是频谱型温振变送器(附常见振动故障特征)

在机械振动方面&#xff0c;振动分析是一项十分重要的技术。这项技术是预测维修程序中的基础&#xff0c;是机器状态的指示器&#xff0c;为了避免机械设备异常振动所带来的损失&#xff0c;对工业机械设备做振动分析是非常有必要的&#xff01; 频谱型温振变送器是一款选用了M…

阿里高级工程师对C语言预处理指令的理解

目录 预处理器指令列表 预处理器指令的流程 四种主要类型的预处理器指令 结论 我们可以将预处理器视为一个编译过程&#xff0c;该过程在开发人员运行程序时运行。它是使用 c/c 语言执行程序的预处理。若要初始化预处理器命令的进程&#xff0c;必须使用哈希符号 &#xf…