西瓜书学习笔记——主成分分析(公式推导+举例应用)

news2024/12/25 1:44:38

文章目录

      • 算法介绍
      • 实验分析

算法介绍

主成分分析(Principal Component Analysis,PCA)是一种常用的降维技术,用于在高维数据中发现最重要的特征或主成分。PCA的目标是通过线性变换将原始数据转换成一组新的特征,这些新特征被称为主成分,它们是原始特征的线性组合。

对于一个正交属性空间(各个属性之间是线性无关的)中的样本点,存在以下两个性质的超平面可对所有样本点进行恰当的表达:

  • 最近重构性:样本点到这个超平面的距离足够的近。
  • 最大可分性:样本点在这个超平面上的投影尽可能分开。

我们先从最近重构性的角度来进行推导:

  • 假定数据样本已进行中心化,即 ∑ i x i = 0 \sum_{i}x_i=0 ixi=0
  • 假定投影变换后得到的新坐标系为 { w 1 , 2 2 , . . . , w d } \{w_1,2_2,...,w_d\} {w1,22,...,wd},其中 w i w_i wi是标准正交基。
    • ∣ ∣ w i ∣ ∣ 2 = 1 ||w_i||_2=1 ∣∣wi2=1
    • w i T w j = 0 ( i ≠ j ) w_i^Tw_j=0(i \ne j) wiTwj=0(i=j)

若丢弃新坐标系中的部分坐标,即将维度降低到 d ′ < d d^\prime<d d<d,则样本点 x i x_i xi在低维坐标系下的投影是 z i = ( z i 1 ; z i 2 ; . . . ; z i d ′ ) z_i=(z_{i1};z_{i2};...;z_{id^\prime}) zi=(zi1;zi2;...;zid),其中 z i j = w j T x i z_{ij}=w_j^Tx_i zij=wjTxi x i x_i xi在低维坐标系下第 j j j维的坐标。若基于 z i z_i zi来重构 x i x_i xi,则会得到 x ^ i = ∑ j = 1 d ′ z i j w j \hat x_i=\sum_{j=1}^{d^\prime}z_{ij}w_j x^i=j=1dzijwj

考虑到整个训练集,原样本点 x i x_i xi与基于投影重构的样本点 x ^ i \hat x_i x^i之间的距离为:
∑ i = 1 m ∣ ∣ ∑ j = 1 d ′ z i j w j − x i ∣ ∣ 2 2 = ∑ i = 1 m ∑ j = 1 d ′ ( z i j w j − x i ) T ( z i j w j − x i ) = ∑ i = 1 m ∑ j = 1 d ′ ( z i j w j T − x i T ) ( z i j w j − x i ) = ∑ i = 1 m ( ( ∑ j = 1 d ′ z i j w j T ) ( ∑ j = 1 d ′ z i j w j ) − 2 ∑ j = 1 d ′ z i j w j T x i + x i T x i ) (1) \begin{aligned} \sum_{i=1}^m||\sum_{j=1}^{d^\prime}z_{ij}w_j-x_i||_2^2&=\sum_{i=1}^m\sum_{j=1}^{d^\prime}(z_{ij}w_j-x_i)^T(z_{ij}w_j-x_i)\\ &=\sum_{i=1}^m\sum_{j=1}^{d^\prime}(z_{ij}w_j^T-x_i^T)(z_{ij}w_j-x_i)\\ &=\sum_{i=1}^m\bigg((\sum_{j=1}^{d^\prime}z_{ij}w_j^T)(\sum_{j=1}^{d^\prime}z_{ij}w_j)-2\sum_{j=1}^{d^\prime}z_{ij}w_j^Tx_i+x_i^Tx_i\bigg) \end{aligned}\tag{1} i=1m∣∣j=1dzijwjxi22=i=1mj=1d(zijwjxi)T(zijwjxi)=i=1mj=1d(zijwjTxiT)(zijwjxi)=i=1m((j=1dzijwjT)(j=1dzijwj)2j=1dzijwjTxi+xiTxi)(1)

其中 w w w是标准正交基,故有 ∣ ∣ w i ∣ ∣ 2 = 1 ||w_i||_2=1 ∣∣wi2=1 w i T w j = 0 ( i ≠ j ) w_i^Tw_j=0(i \ne j) wiTwj=0(i=j),且 x i T x i x_i^Tx_i xiTxi是一个常数,令 x i T x i = const x_i^Tx_i=\text{const} xiTxi=const,所以(1)式可以简化为:
∑ i = 1 m ∣ ∣ ∑ j = 1 d ′ z i j w j − x i ∣ ∣ 2 2 = ∑ i = 1 m ( ( z i 1 w 1 T + z i 2 w 2 T + . . . + z i d ′ w d ′ T ) ( z i 1 w 1 + z i 2 w 2 + . . . + z i d ′ w d ′ ) − 2 z i T [ w 1 T w 2 T . . . w d ′ T ] x i ) + const = ∑ i = 1 m ( ∑ j = 1 d ′ z i j T z i j − 2 z i T w T x i ) + const = ∑ i = 1 m ( z i T z i − 2 z i T z i ) + const = − ∑ i = 1 m z i T z i + const = − ( z 1 T z 1 + z 2 T z 2 + . . . + z m T z m ) + const = − ∑ i = 1 m t r ( z i T z i ) + const (2) \begin{aligned} \sum_{i=1}^m||\sum_{j=1}^{d^\prime}z_{ij}w_j-x_i||_2^2&=\sum_{i=1}^m\bigg((z_{i1}w_1^T+z_{i2}w_2^T+...+z_{id^\prime}w_{d^\prime}^T)(z_{i1}w_1+z_{i2}w_2+...+z_{id^\prime}w_{d^\prime})-2z_i^T\begin{bmatrix} w_1^T \\ w_2^T \\ ...\\ w_{d^\prime}^T \\ \end{bmatrix}x_i\bigg)+\text{const}\\ &=\sum_{i=1}^m\bigg(\sum_{j=1}^{d^\prime}z_{ij}^Tz_{ij}-2z_i^Tw^Tx_i\bigg)+\text{const}\\ &=\sum_{i=1}^m\bigg(z_i^Tz_i-2z_i^Tz_i\bigg)+\text{const}\\ &=-\sum_{i=1}^m z_i^Tz_i+\text{const}\\ &=-(z_1^Tz_1+z_2^Tz_2+...+z_m^Tz_m)+\text{const}\\ &=-\sum_{i=1}^mtr(z_i^Tz_i)+\text{const} \end{aligned}\tag{2} i=1m∣∣j=1dzijwjxi22=i=1m((zi1w1T+zi2w2T+...+zidwdT)(zi1w1+zi2w2+...+zidwd)2ziT w1Tw2T...wdT xi)+const=i=1m(j=1dzijTzij2ziTwTxi)+const=i=1m(ziTzi2ziTzi)+const=i=1mziTzi+const=(z1Tz1+z2Tz2+...+zmTzm)+const=i=1mtr(ziTzi)+const(2)

又因为 t r ( A B ) = t r ( B A ) tr(AB)=tr(BA) tr(AB)=tr(BA)故(2)式可变为:
∑ i = 1 m ∣ ∣ ∑ j = 1 d ′ z i j w j − x i ∣ ∣ 2 2 = − ∑ i = 1 m t r ( z i z i T ) + const = − t r ( ∑ i = 1 m z i z i T ) + const = − t r ( ∑ i = 1 m w T x i x i T w ) + const = − t r ( w T ( ∑ i = 1 m x i x i T ) w ) + const ∝ − t r ( w T ( ∑ i = 1 m x i x i T ) w ) (3) \begin{aligned} \sum_{i=1}^m||\sum_{j=1}^{d^\prime}z_{ij}w_j-x_i||_2^2&=-\sum_{i=1}^mtr(z_iz_i^T)+\text{const}\\ &=-tr\bigg(\sum_{i=1}^m z_iz_i^T\bigg)+\text{const}\\ &=-tr\bigg(\sum_{i=1}^mw^Tx_ix_i^Tw\bigg)+\text{const}\\ &=-tr\bigg(w^T(\sum_{i=1}^mx_ix_i^T)w\bigg)+\text{const}\\ &\propto-tr\bigg(w^T(\sum_{i=1}^mx_ix_i^T)w\bigg) \end{aligned}\tag{3} i=1m∣∣j=1dzijwjxi22=i=1mtr(ziziT)+const=tr(i=1mziziT)+const=tr(i=1mwTxixiTw)+const=tr(wT(i=1mxixiT)w)+consttr(wT(i=1mxixiT)w)(3)

根据最近重构性,式(3)应该被最小化,有:

min ⁡ W − tr ⁡ ( W T X X T W )  s.t.  W T W = E . (4) \begin{aligned} & \min _{\mathbf{W}}-\operatorname{tr}\left(\mathbf{W}^{\mathrm{T}} \mathbf{X} \mathbf{X}^{\mathrm{T}} \mathbf{W}\right) \\ & \text { s.t. } \mathbf{W}^{\mathrm{T}} \mathbf{W}=\mathbf{E} . \end{aligned} \tag{4} Wmintr(WTXXTW) s.t. WTW=E.(4)

这就是PCA的最终优化目标。

接着我们从最大可分性出发,我们知道样本点 x i x_i xi在新空间中的超平面上的投影是 W T x i W^Tx_i WTxi,若所有的样本点的投影能尽可能的分开,则应该使投影后样本点的方差最大化。

在降维和投影中,我们通常不使用传统的方差定义,因为这里我们不涉及到随机变量和随机过程。相反,我们使用方差的术语来描述投影后样本点在新空间中的变异性,这更多地是一种几何上的直觉而非统计学中方差的定义。

方差的形式为 x i T W W T x i x_i^T W W^T x_i xiTWWTxi,可以从以下几何角度解释:

  • 投影方向: 投影矩阵 W W W 确定了投影的方向,每一列表示新空间的基向量。

  • 样本点变异性: x i x_i xi 是原始空间中的样本点, W T x i W^Tx_i WTxi 是投影到新空间后的样本点。 x i x_i xi W T x i W^Tx_i WTxi 之间的差异,即 x i − W T x i x_i - W^Tx_i xiWTxi,表示样本点在投影方向上的变异性。

  • 方差形式: 方差的形式 x i T W W T x i x_i^T W W^T x_i xiTWWTxi 表示了在投影方向上的样本点变异性的量度。这个形式的计算实际上考虑了样本点在投影方向上的平方和,类似于方差的直觉。

  • 最大化分离性: 当我们尝试最大化这个“方差”时,我们实际上是在尝试选择一个投影方向,使得在新空间中的样本点在投影方向上的变异性最大化。这有助于确保在新空间中,样本点能够尽可能地分开,提高了样本点在新空间中的可分性。

请注意,这种形式的“方差”并不是统计学中方差的定义,而更多是一种在降维和投影问题中用于描述样本点分布情况的术语。这种定义的目标是为了在新空间中找到一个有利于分离的方向,以便更好地实现降维和分类等任务。

故投影后样本点的方差是

V a r ( W T x i ) = V a r ( x i T W ) = ∑ i W T x i x i T W = W T ( ∑ i x i x i T ) W = W T ( x 1 x 1 T + x 2 x 2 T + . . . + x m x m T ) W = W T ( ∑ i t r ( x i x i T ) ) W = t r ( W T X X T W ) (5) \begin{aligned} Var(W^Tx_i)&=Var(x_i^TW)\\ &=\sum_iW^Tx_ix_i^TW\\ &=W^T(\sum_ix_ix_i^T)W\\ &=W^T\bigg( x_1x_1^T+x_2x_2^T+...+x_mx_m^T\bigg)W\\ &=W^T\bigg( \sum_itr(x_ix_i^T)\bigg)W\\ &=tr(W^TXX^TW) \end{aligned}\tag{5} Var(WTxi)=Var(xiTW)=iWTxixiTW=WT(ixixiT)W=WT(x1x1T+x2x2T+...+xmxmT)W=WT(itr(xixiT))W=tr(WTXXTW)(5)

于是优化目标可写成:
max ⁡ W tr ⁡ ( W T X X T W )  s.t.  W T W = E , (6) \begin{aligned} \max _{\mathbf{W}} & \operatorname{tr}\left(\mathbf{W}^{\mathrm{T}} \mathbf{X} \mathbf{X}^{\mathrm{T}} \mathbf{W}\right) \\ \text { s.t. } & \mathbf{W}^{\mathrm{T}} \mathbf{W}=\mathbf{E}, \end{aligned} \tag{6} Wmax s.t. tr(WTXXTW)WTW=E,(6)

显然式(4)和式(6)等价,故对式(4)或(6)使用拉格朗日乘子法,引入拉格朗日乘子矩阵 Λ \Lambda Λ,我们的目标是 :
L ( W , Λ ) = t r ( W T X X T W ) − t r ( Λ ( W T W − E ) ) (7) \mathcal{L}(\mathbf{W,\Lambda)}=tr(\mathbf{W^TXX^TW)}-tr(\mathbf{\Lambda(W^TW-E))} \tag{7} L(W,Λ)=tr(WTXXTW)tr(Λ(WTWE))(7)

现在我们分别对 W W W Λ \Lambda Λ求偏导,并令其为零有:

∂ L ∂ W = 2 X X T W − 2 Λ T W = 0 (8) \frac{\partial \mathcal{L}}{\partial \mathbf{W}}=2 \mathbf{X} \mathbf{X}^{\mathrm{T}} \mathbf{W}-2 \Lambda^{\mathrm{T}} \mathbf{W}=0 \tag{8} WL=2XXTW2ΛTW=0(8)

∂ L ∂ Λ = − ( W T W − E ) = 0 (9) \frac{\partial \mathcal{L}}{\partial \boldsymbol{\Lambda}}=-\left(\mathbf{W}^{\mathrm{T}} \mathbf{W}-\mathbf{E}\right)=0 \tag{9} ΛL=(WTWE)=0(9)

最终得到:

X X T W = Λ T W (10) \mathbf{XX^TW}=\mathbf{\Lambda^TW} \tag{10} XXTW=ΛTW(10)

W T W = E (11) \mathbf{W^TW=E} \tag{11} WTW=E(11)

其中 Λ = d i a g ( λ 1 , λ 2 , . . . , λ d ′ ) ∈ R d ′ × d ′ \Lambda=diag(\lambda_1,\lambda_2,...,\lambda_d^\prime) \in \mathbb{R}^{d^\prime\times d^\prime} Λ=diag(λ1,λ2,...,λd)Rd×d

将(10)式展开有:

X X T w i = λ i w i (12) \mathbf{XX^T}w_i=\lambda_iw_i\tag{12} XXTwi=λiwi(12)

最后我们只需要对 X X T \mathbf{XX^T} XXT进行特征值分解,其中 λ i \lambda_i λi是矩阵 X X T \mathbf{XX^T} XXT的特征值, w i w_i wi λ i \lambda_i λi所对应的单位特征向量。

最终我们选取前 d ′ d^\prime d个特征值所对应的特征向量构成的 W = ( w 1 , w 2 , . . . , w d ′ ) \mathbf{W}=(w_1,w_2,...,w_{d^\prime}) W=(w1,w2,...,wd),这就是我们所求的最终解。

其PCA算法流程图如下图所示:

在这里插入图片描述

这就出现了一个新的问题,低维空间维数 d ′ d^\prime d是由用户事先决定的,那么该如何确定 d ′ d^\prime d

我们可以从重构的角度来设置一个重构阈值,例如 t = 95 % t=95\% t=95%,然后选取使得下式成立的最小 d ′ d^\prime d值:

∑ i = 1 d ′ λ i ∑ i = 1 d λ i ⩾ t \frac{\sum_{i=1}^{d^{\prime}} \lambda_i}{\sum_{i=1}^d \lambda_i} \geqslant t i=1dλii=1dλit

对于式(8)和(9)求偏导过程如下:

∂ L ∂ W = ∂ (   t r ( W T X X T W ) − t r ( Λ ( W T W − E ) ) ) ∂ W = ∂   t r ( W T X X T W ) ∂ W − ∂   t r ( Λ ( W T W − E ) ) ∂ W (13) \begin{aligned} \frac{\partial \mathcal{L}}{\partial \mathbf{W}}&=\frac{\partial\bigg( \ tr(\mathbf{W^TXX^TW})-tr(\mathbf{\Lambda(W^TW-E))}\bigg)}{\partial \mathbf{W}}\\ &=\frac{\partial \ tr(\mathbf{W^TXX^TW})}{\partial \mathbf{W}}-\frac{\partial \ tr(\mathbf{\Lambda(W^TW-E))}}{\partial \mathbf{W}} \end{aligned} \tag{13} WL=W( tr(WTXXTW)tr(Λ(WTWE)))=W tr(WTXXTW)W tr(Λ(WTWE))(13)

对式(13)我们可以用迹的性质, t r ( A B ) = t r ( B A ) tr(AB)=tr(BA) tr(AB)=tr(BA),故我们可将 W T X X T W \mathbf{W^TXX^TW} WTXXTW Λ ( W T W − E ) \mathbf{\Lambda(W^TW-E)} Λ(WTWE)重新排列成 W W T X T X \mathbf{WW^TX^TX} WWTXTX Λ ( W W T − E ) \mathbf{\Lambda(WW^T-E)} Λ(WWTE),即:

∂ L ∂ W = ∂   t r ( W W T X T X ) ∂ W − ∂   t r ( Λ ( W W T − E ) ) ∂ W = ∂   t r ( W W T X T X ) ∂ ( W W T ) ⋅ ∂ ( W W T ) ∂ W − 2 Λ W = X T X ⋅ 2 W − 2 Λ W = 2 X X T W − 2 Λ T W (14) \begin{aligned} \frac{\partial \mathcal{L}}{\partial \mathbf{W}}&=\frac{\partial \ tr(\mathbf{WW^TX^TX})}{\partial \mathbf{W}}-\frac{\partial \ tr(\mathbf{\Lambda(WW^T-E))}}{\partial \mathbf{W}}\\ &=\frac{\partial\ tr(\mathbf{W W^T X^T X)}}{\partial \mathbf{(W W^T)}} \cdot \frac{\partial\mathbf{(W W^T)}}{\partial \mathbf{W}}-2\mathbf{\Lambda W}\\ &=\mathbf{X^TX}\cdot 2\mathbf{W}-2\mathbf{\Lambda W}\\ &=2 \mathbf{X} \mathbf{X}^{\mathrm{T}} \mathbf{W}-2 \Lambda^{\mathrm{T}} \mathbf{W} \end{aligned}\tag{14} WL=W tr(WWTXTX)W tr(Λ(WWTE))=(WWT) tr(WWTXTX)W(WWT)2ΛW=XTX2W2ΛW=2XXTW2ΛTW(14)

对于式(7)约束条件为什么可以写成迹的形式?

在这个问题中,我们要证明在优化问题中 t r ( Λ ( W T W − E ) ) tr(\mathbf{\Lambda(W^TW-E)}) tr(Λ(WTWE)) Λ ( W T W − E ) \mathbf{\Lambda(W^TW-E)} Λ(WTWE)是等价的,即它们对于最优解是相同的。下面我们来给出详细的证明!

为此,我们可以比较两者的梯度。考虑对拉格朗日函数 L ( W , Λ ) \mathcal{L}(\mathbf{W,\Lambda}) L(W,Λ)是关于 W W W的偏导数。首先计算 L \mathcal{L} L W \mathbf{W} W的梯度得到式(10),解出最优解 W ⋆ \mathbf{W^\star} W。现在我们比较两种形式对最优解的梯度。

  • 对于 t r ( Λ ( W T W − E ) ) tr(\mathbf{\Lambda(W^TW-E)}) tr(Λ(WTWE))
    ∂ t r ( Λ ( W T W − E ) ) ∂ W = 2 Λ W \frac{\partial tr(\mathbf{\Lambda(W^T W-E))}}{\partial \mathbf{W}}=2 \Lambda \mathbf{W} Wtr(Λ(WTWE))=W

  • 对于 Λ ( W T W − E ) \mathbf{\Lambda(W^TW-E)} Λ(WTWE)
    ∂ Λ ( W T W − E ) ∂ W = 2 Λ W \frac{\partial \mathbf{\Lambda(W^T W-E)}}{\partial \mathbf{W}}=2 \Lambda \mathbf{W} WΛ(WTWE)=W

从上面的梯度计算中,我们可以看到,两种形式的梯度在最优解处是相同的,因此在优化问题中 t r ( Λ ( W T W − E ) ) tr(\mathbf{\Lambda(W^TW-E)}) tr(Λ(WTWE)) Λ ( W T W − E ) \mathbf{\Lambda(W^TW-E)} Λ(WTWE)是等价。这意味着它们会产生相同的最优解。

我们将矩阵运算转化为迹(trace)形式在某些情况下具有优势,尤其是在涉及到矩阵的导数计算和优化问题时。以下是一些使用迹的好处:

  • 简化导数计算: 迹运算的导数计算相对简单,尤其是对于迹的线性性质,这可以简化复杂矩阵函数的导数计算。这种简化对于深度学习等领域中的梯度下降等优化问题很有用。

  • 矩阵的不可交换性: 在矩阵乘法中,矩阵的乘法是不可交换的,即 A B AB AB一般不等于 B A BA BA。但是,通过转化为迹形式,有时可以使计算更加简单。

  • 整合约束条件: 在优化问题中,通过引入拉格朗日乘子法,迹运算可以用于整合约束条件,使得问题的形式更加一致,更容易处理。

  • 向量化和矩阵形式: 将矩阵运算表示为迹形式有助于使用向量化和矩阵形式,从而更好地利用硬件加速(如GPU)来加速计算。

实验分析

数据集如下图所示:
在这里插入图片描述

读入数据集:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('data/correlated_dataset.csv')

# 提取特征列
features = data.drop('Target', axis=1)

计算协方差矩阵以及特征值分解:

# 计算协方差矩阵
cov_matrix = features.cov()

# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

选择最小 d ′ d^\prime d值:

# 选择重构阈值
reconstruction_threshold = 0.95

# 计算特征值的累积和
eigenvalue_cumsum = np.cumsum(eigenvalues) / np.sum(eigenvalues)

# 找到满足阈值条件的最小d'
selected_d_prime = np.argmax(eigenvalue_cumsum >= reconstruction_threshold) + 1

# 输出选择的最小d'
print("选择的最小降维维度 d' =", selected_d_prime)

选择的最小降维维度 d' = 7

重新计算特征值和特征向量:

# 根据选择的最小d'重新计算选取的特征值和特征向量
selected_indices_reconstructed = np.argsort(eigenvalues)[-selected_d_prime:][::-1]
selected_eigenvalues_reconstructed = eigenvalues[selected_indices_reconstructed]
selected_eigenvectors_reconstructed = eigenvectors[:, selected_indices_reconstructed]

# 投影数据到新的空间
reduced_data_reconstructed = features.dot(selected_eigenvectors_reconstructed)

可视化数据降维后的数据:

plt.scatter(reduced_data_reconstructed.iloc[:, 0], reduced_data_reconstructed.iloc[:, 1], c=data['Target'], cmap='viridis')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA of Correlated Dataset (Reconstructed)')
plt.show()

在这里插入图片描述

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

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

相关文章

web前端--------渐变和过渡

线性渐变&#xff0c;是指颜色沿一条直线进行渐变&#xff0c;例如从上到下、从左到右。 当然&#xff0c;CSS中也支持使用角度来设置渐变的方向&#xff0c;角度单位为deg。 0deg&#xff0c;为12点钟方向&#xff0c;表示从下到上渐变。 90deg&#xff0c;为3点钟方向&…

C++ | 部分和函数partial_sum的使用技巧

如果你需要处理一个数组的前缀和&#xff0c;或者数组中某一段元素的前缀和&#xff0c;你会怎么做呢&#xff1f; partial_sum函数是STL中的函数&#xff0c;用于计算范围的部分和&#xff0c;并从结果开始分配范围中的每个元素&#xff0c;range[first,last)中相应元素的部分…

nest.js实现登录验证码功能(学习笔记)

安装express-session npm i express-session 引入 注册session import * as session from express-session;import { NestFactory } from nestjs/core; import {DocumentBuilder,SwaggerModule, } from nestjs/swagger;import { AppModule } from ./app.module;async functio…

(五)springboot 配置多数据源连接mysql和hive

项目结构如下 mysql 执行如下建表语句&#xff0c;并插入一条测试数据 1 2 3 4 5 CREATE TABLE user ( id int(11) NOT NULL, name varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_ge…

计算机服务器中了DevicData勒索病毒如何解密,DevicData勒索病毒解密流程

网络数据安全一直是企业关心的主要话题&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了DevicData勒索病毒攻击&#xff0c;导致企业计算机服务器瘫痪无法正常工作&#xff0c;严重影响了工作业务开展。经过云天数据恢复中…

【C语言】大小写字母的相互转化:多种方法解析及原理说明

在 C 语言编程中&#xff0c;我们经常需要进行大小写字母的相互转化。这种转化可以用于实现字符串的大小写转换、字符的大小写比较等操作。本篇博客将介绍多种方法来实现大小写字母的相互转化&#xff0c;并说明其原理和使用场景。 目录 方法一&#xff1a;标准库函数 方法二…

C# Onnx yolov8 水表读数检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 水表读数检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-01-31T10:18:10.141465 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-…

在VMware Workstation上安装深度系统Deepin V23 Beta3

原文链接&#xff1a;在VMware上安装深度Deepin V23 Beta3 大家好&#xff01;深度系统&#xff08;Deepin&#xff09;以其美观的界面和用户友好的设计而受到广泛欢迎。最近&#xff0c;深度系统的最新版本Deepin V23 Beta3已经发布。今天&#xff0c;我将为大家带来如何在VMw…

Vivado_2018.3文件 source无法自动更新,并且tb仿真文件不显示set as top,需要关闭Vivado之后重启

如下图所示&#xff0c;如果没有set as top这个选项&#xff0c;在确认代码没有问题的情况下&#xff0c;则需要重启vivado. 正常情况下如果有多个_tb仿真文件&#xff0c;会在simulation sources——sim_1下显示&#xff0c;_tb文件前面会有箭头 点开箭头之后&#xff0c;会发…

Matomo 访问图形显示异常

近期我们的把 PHP 系统完全升级后&#xff0c;访问 Matomo 的站点有关访问的曲线无法显示。 出现的情况如下图&#xff1a; 我们可以看到图片中有关的访问曲线无法显示。 如果具体直接访问链接的话&#xff0c;会有下面的错误信息。 问题和解决 出现上面问题的原因是缺少 ph…

Chemkin模拟HFC-125对碳氢燃料燃烧抑制的影响

1 机理建立 抑制剂的详细机理包含四个子机理: (1)烷烃/空气燃烧子机理:(2) 氟碳抑制子机理;(3)氯氟交互作用子机理;(4)碳抑制子机理。对于碳氢火焰燃烧采用AramcoMech的 C1-C4 机理&#xff0c;包含 111 个组分&#xff0c;784 步基元反应。涉及到氟组分在碳氢火焰中的抑制反应…

【QT】贪吃蛇小游戏 -- 童年回忆

成品展示 项目分析&#xff1a; &#x1f40d;基本元素如下 &#x1f40d;小蛇的设计&#xff0c;初始大小蛇头占一个方块&#xff0c;蛇身占两个方块。 &#x1f40d;关于小蛇的移动&#xff0c;采用蛇头前进方向增加一个方块&#xff0c;蛇尾减掉一个方块的实现方法。 &#…

算法学习——华为机考题库3(HJ21 - HJ25)

算法学习——华为机考题库3&#xff08;HJ21 - HJ30&#xff09; HJ21 简单密码 描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应&#xff1a; 1–1&#xff0c; abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0&#xff0c;把密码…

2023年计算机视觉领域突破性研究有哪些?

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 ​回顾2023年&#xff0c;计算机视觉领域有哪些较为突出的研究成果&#xff1f;一起看看吧 SAM(Segment Anything Model) SAM 由 Meta AI 开发&#xff0c;是 CV 中分割任务的基础模型&#xff0c;彻…

富文本编辑器CKEditor4简单使用-05(开发自定义插件入门)

富文本编辑器CKEditor4简单使用-05&#xff08;开发自定义插件入门&#xff09; 1. CKEditor4插件入门1.1 关于CKEditor4插件的简单安装与使用1.2 参考 2. 开发自定义插件——当前时间插件2.1 创建插件文件目录结构2.2 编写插件原代码2.2.1 编写代码框架2.2.2 创建编辑器命令2.…

【blender插件】(1)快速开始

特性 blender的python API有如下特性: 编辑用户界面可以编辑的任意数据(场景,网格,粒子等)。修改用户首选项、键映射和主题。运行自己的配置运行工具。创建用户界面元素,如菜单、标题和面板。创建新的工具。场景交互式工具。创建与Blender集成的新渲染引擎。修改模型的数据…

迪文串口屏数据的隐藏功能

一、概述 由于项目中在使用迪文屏显示数据的时候&#xff0c;需要在数据为0的时候不显示0&#xff0c;而迪文屏默认的数据变量在无值的时候显示为0&#xff0c;此时可以使用数据的隐藏功能指令 二、具体实现方法 1、可以使用描述指针地址来实现数据的隐藏&#xff0c;查看应用…

「效果图渲染」效果图与3D影视动画渲染平台

效果图渲染和3D影视动画渲染都是视觉图像渲染的领域应用。效果图渲染主要服务于建筑、室内设计和产品设计等行业&#xff0c;这些领域通常对视觉呈现的精度和细节有较高要求。与之相比&#xff0c;3D影视动画渲染则普遍应用于电影、电视、视频游戏和广告等媒体领域&#xff0c;…

2024年第四届工业自动化、机器人与控制工程国际会议 | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第四届工业自动化、机器人与控制工程国际会议&#xff08;IARCE 2024&#xff09; 会议时间&#xff1a;2024年7月5 -7日 召开地点&#xff1a;中国成都 大会官网&#xff1a;www.iarce.org 2024年第四届工业自动化、机器人与控制工程国际会…

零基础学Python之核心基础知识

1.Python入门简介 &#xff08;1&#xff09;什么是Python Life is short, you need Python&#xff01;人生苦短&#xff0c;我用Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&#xff0c;相比其他语言…