【L2GD】: 无环局部梯度下降

文章链接:Federated Learning of a Mixture of Global and Local Models

发表期刊(会议): ICLR 2021 Conference(机器学习顶会)

往期博客:FLMix: 联邦学习新范式——局部和全局的结合

目录

  • 1.背景介绍
  • 2. 梯度下降 GD
    • SGD
    • LGD
  • 3. L2GD
    • L2GD创设
    • 局部GD和平均局部模型
    • L2GD 通信
    • L2GD收敛证明
    • L2SGD+

1.背景介绍

本文提出了一种新的训练联邦学习模型的优化公式。标准FL旨在从存储在所有参与设备上的私人数据中找到一个单一的全局模型。相比之下,新方法寻求全局模型和局部模型之间的权衡,每个设备可以从自己的私有数据中学习而无需通信。

本文开发了有效的随机梯度下降(SGD)变体来求解新公式,并证明了通信复杂性的保证。该工作的主要贡献包括结合全局和局部模型的FL新范式、新范式的理论性质、无环路局部梯度下降(L2GD)、L2GD的收敛理论以及对局部步骤在联邦学习中的作用的见解。该文件还强调了本地SGD在通信复杂性和个性化联邦学习的好处方面优于传统SGD的潜力。


2. 梯度下降 GD

梯度下降(Gradient Descent,GD)是一种常用的优化算法,用于最小化损失函数或目标函数。基本思想是通过迭代更新模型参数的方式来寻找使目标函数达到最小值的参数值。

GD通过沿着损失函数的负梯度方向来更新模型参数,以减少损失并使模型更符合训练数据。

GD基本步骤:

  • 初始化参数:选择初始的模型参数值,随机初始化或根据先验知识设置。
  • 计算梯度:在当前参数值处,计算目标函数关于参数的梯度(即目标函数对参数的偏导数)。梯度表示了目标函数在当前参数值处的变化方向和速率。
  • 更新参数:根据梯度信息和学习率(learning rate),更新模型参数。学习率决定了每次迭代中参数更新的步长大小。更新规则通常如下所示:
    新参数=旧参数−学习率×梯度
  • 重复迭代:重复步骤 2 和步骤 3,直到满足停止条件,例如达到最大迭代次数、损失函数收敛等。

学习率是一个很重要的超参,制着在每次迭代中更新参数的幅度。它决定了在梯度方向上参数更新的步长大小。

学习率过大可能导致参数更新过大,甚至可能使得优化算法无法收敛,造成震荡或发散。这种情况下,即使损失函数值在短时间内降低,最终可能错过最优解。

学习率过小则可能导致收敛速度缓慢,需要更多的迭代次数才能达到一个较好的解,特别是在损失函数的优化路径中存在较为平缓的部分时。

SGD

随机梯度下降(Stochastic Gradient Descent,SGD)是一种常用的优化算法,用于训练ML模型,特别是在大规模数据集上。它是GD算法的一种变体,使用单个样本或样本小批次(mini-batch)的梯度估计来进行参数更新,而不是使用整个训练集的梯度。这种随机性使得随机梯度下降在大型数据集上更具效率,并且能够更快地收敛到局部最优解。

优点:

  • 在大规模数据集上的训练更加高效
  • 易于实现

缺点:

  • 可能陷入局部最优解
  • 对学习率敏感
function stochastic_gradient_descent(data, learning_rate, num_epochs):
    initialize random parameters theta
    
    for epoch in range(num_epochs):
        shuffle(data)  # Shuffle the data for randomness
        for example in data:
            input_x, target_y = example
            
            # 计算损失函数梯度值 
            gradient = compute_gradient(input_x, target_y, theta)
            
            # 使用梯度下降更新参数
            for param in theta:
                param -= learning_rate * gradient[param]
    
    return theta

LGD

分层梯度下降(Layer-wise Gradient Descent,LGD)是一种用于深度学习中神经网络训练的优化算法。它的主要思想是将神经网络分层,然后对每一层分别进行训练和更新。这种方法旨在解决深度神经网络训练中的梯度消失或梯度爆炸等问题,并提高网络训练的效率。

与SGD的比较

SGDLGD
分层更新每次迭代中使用整个网络的梯度来更新参数对每一层单独计算和更新梯度
更新频率每次迭代中更新整个网络的参数按层级顺序逐层更新参数,网络参数的更新频率较低
梯度传播传播通过所有层来更新参数
容易出现梯度消失或梯度爆炸
通过分层的方式减少了参数更新时的梯度传播距离
有助于缓解梯度问题
收敛速度由于同时更新所有参数
需要较长时间才能收敛到较优解
通过分层更新
会更快地收敛到局部最优解
function layer_wise_gradient_descent(network, data, learning_rate, num_epochs):
    initialize random parameters for each layer in network
    
    for epoch in range(num_epochs):
        shuffle(data)  # Shuffle the data for randomness
        for example in data:
            input_x, target_y = example
            
            # Forward pass through the network
            predictions = network.forward_pass(input_x)
            
            # Backward pass to compute gradients for each layer
            network.compute_gradients(input_x, target_y)
            
            # Update parameters of each layer using gradients
            for layer in network.layers:
                layer.update_parameters(learning_rate)
    
    return network

3. L2GD

文章提出了联邦学习新范式 ♣ \clubsuit 如下:

♣ min ⁡ x 1 , . . . , x n ∈ R d { F ( x ) : = f ( x ) + λ ψ ( x ) } f ( x ) : = 1 n ∑ i = 1 n f i ( x i ) ψ ( x ) : = 1 2 n ∑ i = 1 n ∥ x i − x ‾ ∥ 2 \clubsuit \quad \min_{x_1,...,x_n \in \mathbb{R}^d } \{ F(x): = f(x)+ \lambda \psi (x)\} \\ f(x):=\frac{1}{n}\sum_{i=1}^{n} f_i(x_i) \\ \psi (x) := \frac{1}{2n}\sum_{i=1}^{n} \left \| x_i-\overline{x} \right \| ^2 x1,...,xnRdmin{F(x):=f(x)+λψ(x)}f(x):=n1i=1nfi(xi)ψ(x):=2n1i=1nxix2 其中 λ ≥ 0 \lambda \ge0 λ0 是一个惩罚超参, x 1 , . . . , x n ∈ R d x_1,...,x_n \in \mathbb{R}^d x1,...,xnRd 是本地模型参数 , x : = ( x 1 , x 2 , . . . , x n ) ∈ R n d x:=(x_1,x_2,...,x_n) \in\mathbb{R}^{nd} x:=(x1,x2,...,xn)Rnd 并且 x ‾ : = 1 n ∑ i = 1 n x i \overline{x}:=\frac{1}{n}\sum_{i=1}^{n}x_i x:=n1i=1nxi 是所有本地模型的平均值。

本文设计了一种新的随机化方法 Loopless Local GD (L2GD) 来求解范式 ♣ \clubsuit

L2GD创设

L2GD方法是一个非一致的SDG,可以视为一个2元和问题,通过随机采样 ∇ f \nabla f f 或者 ∇ ψ \nabla \psi ψ 来估计 ∇ F \nabla F F

令采样概率为 P ∈ ( 0 , 1 ) P \in(0,1) P(0,1),对于 F F F x ∈ R n d x \in \mathbb{R}^{nd} xRnd 的随机梯度可表示为: G ( x ) : = { ∇ f ( x ) 1 − p w i t h p r o b a b i l i t y 1 − p λ ∇ ψ ( x ) p w i t h p r o b a b i l i t y p G(x): = \begin{cases} \frac{\nabla f(x)}{1-p} & with\quad probability \quad 1 − p \\ \frac{\lambda \nabla \psi(x)}{p} & with\quad probability\quad p \\ \end{cases} G(x):={1pf(x)pλψ(x)withprobability1pwithprobabilityp其中 G ( x ) G(x) G(x) ∇ F ( x ) \nabla F(x) F(x) 的无偏估计。

使用L2GD以最小化 F F F ♠ x k + 1 = x k − α ⋅ G ( x k ) \spadesuit \quad x^{k+1}=x^k-\alpha \cdot G(x^k) xk+1=xkαG(xk) α \alpha α 为学习率或步长,将 G ( x ) G(x) G(x) 代入 ♠ \spadesuit 可以得到L2GD的更新算法:

在这里插入图片描述
在每一轮迭代中,会先抛一枚硬币 ξ \xi ξ

  • 如果 ξ = 1 \xi =1 ξ=1 则以概率 p \quad p \quad p 采样 ∇ ψ \nabla \psi ψ 来估计 ∇ F \nabla F F 并进行参数更新,此时 Master 将每个局部模型向平均值方向移动;

  • 如果 ξ = 0 \xi =0 ξ=0 则以概率 1 − p 1-p 1p 采样 ∇ f \nabla f f 来估计 ∇ F \nabla F F 并进行参数更新,此时所有设备执行一个局部GD步骤。

为了保证 ♡ x i k + 1 = ( 1 − α λ n p ) x i k + α λ n p x ˉ k \heartsuit \quad x^{k+1}_i=(1-\frac{\alpha \lambda}{np})x^k_i+\frac{\alpha \lambda}{np} \bar{x}^k xik+1=(1npαλ)xik+npαλxˉk 是一个关于 x i k x^k_i xik x ˉ k \bar{x}^k xˉk 的凸组合,

需要对 α \alpha α 的大小进行限制,使 α λ n p < 1 2 \frac{\alpha \lambda}{np}<\frac{1}{2} npαλ<21

在上述算法的基础上,只需要在连续两次投掷硬币得到不同 ξ \xi ξ 值时进行通信。

需要注意的是,算法语句没有考虑到数据的隐私。 而隐私是FL的一个非常重要的方面。


局部GD和平均局部模型

局部模型的平均值在聚合步骤中不会更改。具体表现为聚合后的 x ˉ k + 1 \bar{x}^{k+1} xˉk+1 具有以下性质(结合公式 ♡ \heartsuit ):
x ˉ k + 1 = 1 n ∑ i = 1 n x i k + 1 = 1 n ∑ i = 1 n [ ( 1 − α λ n p ) x i k + α λ n p x ˉ k ] = x ˉ k \bar{x}^{k+1}=\frac{1}{n} \sum_{i=1}^{n} x^{k+1}_i =\frac{1}{n}\sum_{i=1}^{n}[(1-\frac{\alpha \lambda}{np})x^k_i+\frac{\alpha \lambda}{np} \bar{x}^k]=\bar{x}^{k} xˉk+1=n1i=1nxik+1=n1i=1n[(1npαλ)xik+npαλxˉk]=xˉk这意味着如果在一个执行序列中发生了几个平均步骤, ♡ \heartsuit 中的点 a = x ˉ k a=\bar{x}^k a=xˉk 始终保持不变,每个局部模型 x i k x_i^k xik 只是在执行序列和 a a a 的开始处沿着连接局部模型初始值的直线移动,每一步都将 x i k x^k_i xik 向平均值 a 靠近。

至此,我们可以得到这样一个结论:

  • 局部GD步骤越多,局部模型越接近纯局部模型
  • 采取的平均步骤越多,局部模型就越接近它们的平均值。

局部GD与平均步骤的相对数量由参数 p p p 控制:

  • 局部GD步骤的期望数量是 1 p \frac{1}{p} p1
  • 平均步骤的期望数量是 1 1 − p \frac{1}{1-p} 1p1

L2GD 通信

在这里插入图片描述
为了更好地理解算法中通信发生的时间,考虑以下可能的抛硬币顺序 :0,0,1,0,1,1,0。

  • 前两次抛硬币 ( ξ = 0 ) (\xi =0) (ξ=0) 将导致在所有设备上执行两个局部GD步骤,第 i i i 台设备 的局部模型为 x i k = 2 x_i^{k=2} xik=2

  • 第三次掷硬币 ( ξ = 1 ) (\xi =1) (ξ=1),此时所有的局部模型 x i k = 2 x_i^{k=2} xik=2 都会被传送给 Master,取平均值形成 x ˉ k = 2 \bar{x}^{k=2} xˉk=2,然后就开始了取平均的步骤 ♡ \heartsuit 得到每台设备的新局部模型 x i k = 3 x_i^{k=3} xik=3

  • 第四次掷硬币 ( ξ = 0 ) (\xi =0) (ξ=0),此时 Master 将更新的局部模型 x i k = 3 x_i^{k=3} xik=3 发送回设备 i i i,设备 i i i 随后执行一个局部GD步骤,得到 x i k = 4 x_i^{k=4} xik=4

  • 然后是连续三次抛硬币 ( ξ = 1 ) (\xi =1) (ξ=1),这意味着局部模型再次被传递给 MasterMaster 执行三个平均步骤 ♡ \heartsuit 得到 x i k = 7 x_i^{k=7} xik=7

  • 第八次掷硬币 ( ξ = 0 ) (\xi =0) (ξ=0),这使得 Master 将更新后的局部模型 x i k = 7 x_i^{k=7} xik=7 发送回设备 i i i,设备随后执行单个局部GD步骤,得到 x i k = 8 x_i^{k=8} xik=8

这个例子说明了当两个连续的硬币投掷出不同的值时,需要进行通信:

  • 如果0后面跟着一个1,那么所有的设备都与 Master 通信;
  • 如果1后面跟着一个0,那么 Master 就返回给设备通信。
  • 标准是将每对通信,DeviceMaster 和随后的 MasterDevice,计数为单个通信轮。
  • L2GD k k k 个迭代中,预期的通信轮数为 p ( 1 − p ) k p(1−p)k p(1p)k

L2GD收敛证明

本文在提出联邦学习新范式的时候做过一个重要的假设,可以参考前文:FLMix: 联邦学习新范式——局部和全局的结合。

对于每一个设备 i i i ,它的目标函数 f i : R d → R f_i:\mathbb{R}^d \rightarrow \mathbb{R} fi:RdR L − s m o o t h L-smooth Lsmooth 并且 μ − s t r o n g l y \mu -strongly μstrongly 的凸函数。

用数学表示即为: L f : = L n L_f:=\frac{L}{n} Lf:=nL μ f : = μ n \mu_f:=\frac{\mu}{n} μf:=nμ 那么对于函数 ψ \psi ψ ,显然它是凸的。并且有一下表达: ( ∇ ψ ( x ) ) i = 1 n ( x i − x ˉ ) ψ ( x ) = n 2 ∑ i = 1 n ∣ ∣ ( ( ∇ ψ ( x ) ) i ) ∣ ∣ 2 = n 2 ∣ ∣ ∇ ψ ( x ) ∣ ∣ 2 (\nabla \psi(x))_i=\frac{1}{n}(x_i-\bar{x}) \\ \psi(x)=\frac{n}{2}\sum_{i=1}^{n}||((\nabla \psi(x))_i)|| ^2=\frac{n}{2}||\nabla \psi(x)||^2 (ψ(x))i=n1(xixˉ)ψ(x)=2ni=1n∣∣((ψ(x))i)2=2n∣∣∇ψ(x)2我们保持这个假设在L2DG的计算中仍然成立。

如果 学习率 α < 1 2 L \alpha<\frac{1}{2\mathcal{L} } α<2L1 其中 L : = 1 n max ⁡ { L 1 − p , λ p } \mathcal{L} :=\frac{1}{n}\max\{\frac{L}{1-p},\frac{\lambda}{p}\} L:=n1max{1pL,pλ} 有: E [ ∥ x k − x ( λ ) ∥ 2 ] ≤ ( 1 − α μ n ) k ∥ x 0 − x ( λ ) ∥ 2 + 2 n α σ 2 μ w h e r e σ 2 : = 1 n 2 ∑ i = 1 n ( 1 1 − p ∥ ∇ f i ( x i ( λ ) ) ∥ 2 + λ 2 p ∥ x i ( λ ) − x ˉ ( λ ) ∥ 2 ) \mathbb{E} \left [ \left \| x^k-x(\lambda) \right \|^2 \right ] \le(1-\frac{\alpha \mu}{n})^k\left \| x^0-x(\lambda) \right \|^2+\frac{2n\alpha \sigma^2 }{\mu} \\ \\ where \quad \quad \sigma^2:=\frac{1}{n^2}\sum_{i=1}^{n}(\frac{1}{1-p}\left \| \nabla f_i(x_i(\lambda)) \right \|^2 +\frac{\lambda^2}{p}\left \| x_i(\lambda)-\bar{x}(\lambda) \right \|^2 ) E[ xkx(λ) 2](1nαμ)k x0x(λ) 2+μ2nασ2whereσ2:=n21i=1n(1p1fi(xi(λ))2+pλ2xi(λ)xˉ(λ)2)我们需要找到超参 p , α p,α p,α,使得函数能以最快的速率以将误差收敛到最优值的 ( O ( ε ) + 2 n α σ 2 μ ) (\mathcal{O}(\varepsilon )+\frac{2n\alpha\sigma^2}{\mu}) (O(ε)+μ2nασ2) 邻域内,也就是说,实现 ♯ E [ ∥ x k − x ( λ ) ∥ 2 ] ≤ ε ∥ x 0 − x ( λ ) ∥ 2 + 2 n α σ 2 μ \sharp \quad \mathbb{E} \left [ \left \| x^k-x(\lambda) \right \|^2 \right ] \le\varepsilon\left \| x^0-x(\lambda) \right \|^2+\frac{2n\alpha \sigma^2 }{\mu} E[ xkx(λ) 2]ε x0x(λ) 2+μ2nασ2 推论:当值 p ∗ = λ L + λ p^* =\frac{ λ}{ L+λ} p=L+λλ 时,可以令迭代次数和实现 ♯ \sharp 的预期通信次数两者最小化。

特别地,最佳迭代次数是 2 L + λ μ l o g 1 ε 2\frac{L+\lambda}{ \mu} log\frac{ 1}{\varepsilon} 2μL+λlogε1,并且最佳预期通信次数是 2 λ λ + L L μ l o g 1 ε \frac{2λ}{ λ+L}\frac{ L}{ \mu} log \frac{1}{ ε} λ+L2λμLlogε1

如果令 p = p ∗ p=p^* p=p 那么 α λ n p = 1 2 \frac{\alpha \lambda}{np}=\frac{1}{2} npαλ=21,并且算法1中的 ♡ \heartsuit 简化为: x i k = 1 2 ( x i k + x ˉ k ) x_i^k=\frac{1}{2}(x_i^k +\bar{x}^k) xik=21(xik+xˉk)并且局部GD的更新步骤简化为: x i k + 1 = x i k − 1 2 L ∇ f i ( x i k ) x_i^{k+1}=x_i^k-\frac{1}{2L}\nabla f_i(x_i^k) xik+1=xik2L1fi(xik)对于简化后的两个式子,有以下几点发现:

  • 虽然本文提出的方法不支持完全平均,因为它太不稳定,但推论表明应该向平均迈出一大步。
  • 随着 λ \lambda λ 变小,优化问题 ♣ \clubsuit 的解将越来越倾向于纯局部模型,即当 λ → 0 λ → 0 λ0 x i ( λ ) → x i ( 0 ) : = a r g min ⁡ f i x_i(\lambda)→ x_i(0):= arg \min f_i xi(λ)xi(0):=argminfi纯局部模型可以在没有任何通信的情况下计算

L2SGD+

L2GD是SGD的一个特定实例,因此它只线性收敛到一个最优邻域。这意味着,它只能求解具有凸函数性质的优化目标,当函数存在非凸(有局部最优解)区域时,L2GD可能会陷入凹区域。

为了解决上述问题,作者提出将控制变量纳入随机梯度,进一步假设每个局部目标都具有有限和结构,并提出了L2SGD+算法。

假设 f i f_i fi 有个有限和结构: f i ( x i ) = 1 m ∑ j = 1 m f i , j ′ ( x i ) f_i(x_i)=\frac{1}{m}\sum_{j=1}^{m}f_{i,j}'(x_i) fi(xi)=m1j=1mfi,j(xi) f i , j ′ f_{i,j}' fi,j 强凸且 L − s m o o t h L-smooth Lsmooth , 同时 f i f_i fi μ − s t r o n g l y \mu-strongly μstrongly 凸函数。

篇幅有限,加之本人能力有限,这边就不展开讲解了,有兴趣的同仁可以去看原文的推导证明,还挺有挑战的。


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

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

相关文章

DataCamp在线学习平台

DataCamp&#xff08;https://www.datacamp.com/blog&#xff09;是一个在线学习平台&#xff0c;专注于数据科学和分析领域的教育。该平台提供丰富的课程&#xff0c;涵盖了从数据处理到机器学习和深度学习的各个方面。以下是DataCamp的主要特点&#xff1a; 互动学习&#x…

【python】OpenCV—Image Pyramid(8)

文章目录 1 图像金字塔2 拉普拉斯金字塔 1 图像金字塔 高斯金字塔 在 OpenCV 中使用函数 cv2.pyrDown()&#xff0c;实现图像高斯金字塔操作中的向下采样&#xff0c;使用函数 cv2.pyrUp() 实现图像金字塔操作中的向上采样 import cv2img cv2.imread(C://Users/Administrat…

MIB 6.1810实验Xv6 and Unix utilities(2)sleep

难度:easy Implement a user-level sleep program for xv6, along the lines of the UNIX sleep command. Your sleep should pause for a user-specified number of ticks. A tick is a notion of time defined by the xv6 kernel, namely the time between two interrupts f…

数据分析 - 离散概率分布的运用

期望公式 期望的方差 期望的标准差

微服务架构演进

系统架构演变 没有最好的架构&#xff0c;只有最合适的架构&#xff1b;架构发展过程&#xff1a;单体架构》垂直架构》SOA 面向服务架构》微服务架构&#xff1b;推荐看看《淘宝技术这十年》&#xff1b; 单体架构 互联网早期&#xff0c;一般的网站应用流量较小&#xff0…

Hive数据表操作--学习笔记

1&#xff0c;Hive数据表操作 1&#xff0c;建表语句和内外部表 ①创建内部表 create [external] table [if not exists] 表名( 字段名 字段类型 [comment 注释], 字段名 字段类型 [comment 注释], ... ) [row format delimited fields terminated by 指定分隔符];&#xff0…

行内样式、内部样式、外部样式

行内样式&#xff1a; 该元素的所在本行中使用style标记来写样式 内部样式&#xff1a; 在head标签中使用style标记来写样式 外部样式&#xff1a; 在head标签中使用link标记引用外部样式 注意优先级&#xff1a; 行内样式&#xff1e;内部样式&#xff1e;外部样式 代码…

【Java 进阶篇】JQuery 遍历 —— For 循环的奇妙之旅

在前端开发的世界里&#xff0c;遍历是一个常见而重要的操作。它让我们能够浏览并操纵文档中的元素&#xff0c;为用户提供更加丰富和交互性的体验。而在 JQuery 中&#xff0c;遍历的方式多种多样&#xff0c;其中 for 循环是一种简单而灵活的选择。在本篇博客中&#xff0c;我…

【918.环形子数组的最大和】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {int sum0;for(auto x:nums) sumx;vector<int> f(nums.size());vector<int> g(nums.size…

科研学习|科研软件——SPSS统计的单因素方差分析与单变量方差分析

在spss统计分析中&#xff0c;方差分析在比较均值菜单和一般线性模型菜单中都可以做&#xff0c;单因素方差分析一般称为单因素Anova分析&#xff0c;单变量方差分析一般称为一般线性模型单变量分析。这两种方法既有区别又有联系&#xff0c;在统计学中&#xff0c;这两种分析方…

快速使用vscode写python

1.打开vscode&#xff0c;打开扩展&#xff0c;输入python&#xff0c;点击安装。 2.下载python。官网下载太慢&#xff0c;通过镜像下载。 http://npm.taobao.org/mirrors/python/3.9.0/ 下载python-3.9.0-amd64.exe 3.下载好后安装python&#xff0c;下方的add python to p…

在vue项目里面使用index.ts进行统一导出

目录 一、概述 二、具体实践 2.1创建目录 2.2index.ts文件内容展示 2.2在需要的vue文件里面import 2.3vue全代码 三、实际效果 一、概述 一般我们在做项目的时候会发现vue文件里面没有export default 转而替代的是使用同目录下index.ts进行统一导出 好处&#xff1a;能…

winform+access超市管理信息系统

说明文档 主要技术&#xff1a; 基于C#winform架构和access数据库 功能模块&#xff1a; 登陆和对access数据库的一些简单操作&#xff0c;只适合新手学习看看 运行环境&#xff1a; 运行需vs2013或者以上版本&#xff0c;sql server 2012或者以上版本。附送有运行说明文档。…

科研学习|研究方法——python T检验

一、单样本T检验 目的&#xff1a;检验单样本的均值是否和已知总体的均值相等前提条件&#xff1a; &#xff08;1&#xff09;总体方差未知&#xff0c;否则就可以利用 Z ZZ 检验&#xff08;也叫 U UU 检验&#xff0c;就是正态检验&#xff09;&#xff1b; &#xff08;2&a…

[Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件

Adobe XD是一个直观、强大的UI/UX开发工具&#xff0c;旨在设计、原型设计、用户之间共享材料&#xff0c;以及通过数字技术设计交互。Adobe XD为您提供开发网站、应用程序、语音界面、游戏界面、电子邮件模板等所需的一切。 无限制地创建 设计各种互动&#xff0c;创建看起来…

Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)

目录 前言&#xff1a; 一、什么是iBeacon技术 二、Uniapp连接iBeacon设备的准备工作 硬件设备&#xff1a; 三、Uniapp连接iBeacon设备的实现步骤 创建Uniapp项目&#xff1a; 四、Uniapp连接iBeacon设备的应用场景 室内导航&#xff1a; 五、Uniapp连接iBeacon设备的未来…

Leetcode刷题详解——扫雷游戏

1. 题目链接&#xff1a;529. 扫雷游戏 2. 题目描述&#xff1a; 让我们一起来玩扫雷游戏&#xff01; 给你一个大小为 m x n 二维字符矩阵 board &#xff0c;表示扫雷游戏的盘面&#xff0c;其中&#xff1a; M 代表一个 未挖出的 地雷&#xff0c;E 代表一个 未挖出的 空方…

【53.最大子数组和】

一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxSubArray(vector<int>& nums) {vector<int> dp(nums.size());dp[0]nums[0];int retdp[0];for(int i1;i<nums.size();i){dp[i]max(dp[i-1]nums[i],nums[i]);retmax(dp[i],ret);}ret…

Linux输入设备应用编程(键盘,触摸屏,按键,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

ERP管理系统:企业升级的秘密武器

ERP管理系统&#xff1a;企业升级的秘密武器 在当今快速发展的商业环境中&#xff0c;企业要想保持竞争力&#xff0c;就必须不断进行自我升级。而在这个过程中&#xff0c;ERP管理系统以其强大的功能和优化流程的能力&#xff0c;逐渐成为了企业升级的秘密武器。 一、ERP管理…