当前位置: 首页 > news >正文

【AI绘图学习笔记】奇异值分解(SVD)、主成分分析(PCA)

这节的内容需要一些线性代数基础知识,如果你没听懂本文在讲什么,强烈建议你学习【官方双语/合集】线性代数的本质 - 系列合集

文章目录

  • 奇异值分解
    • 线性变换
    • 特征值和特征向量的几何意义
    • 什么是奇异值分解?
    • 公式推导
      • SVD推广到任意大小矩阵
    • 如何求SVD分解
  • 非负矩阵分解(NMF)
  • 主成分分析PCA
    • 我们为什么需要PCA?
    • 来找坐标原点
    • 来找坐标系
    • 怎么理解PCA
    • 什么是协方差矩阵
      • 公式推导
      • 重要思考!
      • 置信椭圆
      • PCA的缺点
    • PCA主成分与SVD的关系


奇异值分解

这段看的视频是【学长小课堂】什么是奇异值分解SVD–SVD如何分解时空矩阵

线性变换

在这里插入图片描述
大多数本科生接触的线性代数可能只是矩阵的运算,如果我们从几何意义上来理解会发现一个崭新的世界。

假设我们给出一个原矩阵D,D的矩阵如上所示,D由四个向量[x1,y1]T...[x4,y4]T[x_1,y_1]^T...[x_4,y_4]^T[x1,y1]T...[x4,y4]T构成。矩阵D的基(基底)是数轴正方形上的单位向量j=[0,1]T,i=[1,0]Tj=[0,1]^T,i=[1,0]^Tj=[0,1]T,i=[1,0]T,如图左所示,实际上任何一个向量我们都可以视作基的运算,如下图。
在这里插入图片描述
在这里插入图片描述
现在我们给出一个矩阵S=[2001]S=\begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix}S=[2001],然后我们将矩阵SD相乘,如果单纯运算我们当然知道SD的结果。现在让我们再看看新矩阵SD,我们会发现其中的向量[2x1,y1]....[2x4,y4][2x_1,y_1]....[2x_4,y_4][2x1,y1]....[2x4,y4]在x轴上都变为了原来的两倍。
实际上,矩阵运算AB=C,我们可以解读为:对B矩阵应用了A变换从而得到了新矩阵C
我们将D矩阵简写为D=[xy]D=\begin{bmatrix} x\\ y \end{bmatrix}D=[xy],也就是说SD=[2001][xy]=x[20]+y[01]SD=\begin{bmatrix} \textcolor{red}{2} & \textcolor{blue}{0} \\ \textcolor{red}{0} & \textcolor{blue}{1} \end{bmatrix}\begin{bmatrix} x\\ y \end{bmatrix}=x\begin{bmatrix} \textcolor{red}{2} \\ \textcolor{red}{0} \end{bmatrix}+y\begin{bmatrix} \textcolor{blue}{0} \\ \textcolor{blue}{1} \end{bmatrix}SD=[2001][xy]=x[20]+y[01]
因此S变换相当于将x乘以两倍,y乘以一倍,本质上SSS矩阵对DDD矩阵的基进行了线性变换j∗1→j^,i∗2→i^j*1 \to \hat j,i*2 \to \hat ij1j^,i2i^,因此如下图所示,SD会将D横向拉伸两倍。
在这里插入图片描述


在这里插入图片描述
如图我们对矩阵D乘以一个旋转矩阵R,其中R=[cos(θ)−sin(θ)sin(θ)cos(θ)]R=\begin{bmatrix} cos(θ)&-sin(θ) \\ sin(θ) &cos(θ) \end{bmatrix}R=[cos(θ)sin(θ)sin(θ)cos(θ)],其中θ角代表了旋转的角度,当然这个矩阵代表了整体的旋转,你可以想象整个网格以原点为旋转中心旋转。

矩阵的线性变换就包括拉伸和旋转两种,如果一个矩阵(向量)x在应用了变换矩阵A后,原点位置依旧不变,且基向量为直线,坐标上的网格线保持平行,我们就称这种变换为线性变换。

一种更直观的变换方式,就是将基向量移动到变换矩阵对应的坐标,想象整个网格随之运动。

在乘以R矩阵后,RSD相当于在SD的图像上应用了线性旋转得到了新的图像。

特征值和特征向量的几何意义

矩阵乘法核心思想(6):特征向量与特征值的几何意义
先说结论,其实我们刚才已经讲过了。

  • 矩阵乘法即线性变换——对向量进行旋转和长度伸缩,效果与函数相同;
  • 特征向量指向只缩放不旋转的方向;
  • 特征值即缩放因子;
  • 旋转矩阵无实数特征向量和特征值。
    在这里插入图片描述

单个向量的张成空间是一条直线,在大部分时候,线性变换后的向量会偏移原来的张成空间,然而某些时候一些向量仅仅只是将进行了拉伸,因此就被留在了原张成空间中,或者说所有处于这条直线上的向量都仅仅只是被拉伸。我们把这些应用了线性变换后仍然留在原张成空间的向量称为特征向量,其被拉伸的比例因子我们称为特征值,因此,拉伸为三倍的那个直线就是一个属于特征值3的特征向量。

在这里插入图片描述
那么假设我们找到了这个特征向量,然后对一个三维矩阵(我们将其看作一个三维空间)进行了一次旋转,我们知道特征向量经过旋转这种线性变换仍然留在原张成空间上,因此特征向量线性变换前后的位置保持不变,那么我们就可以视为对这个矩阵以特征向量为旋转轴进行了一次旋转。

在这里插入图片描述计算特征值的公式就是AV⃗=λV⃗A\vec V=\lambda \vec VAV=λV,其中λ\lambdaλ是特征值矩阵,寻找特征向量V⃗\vec VV就是求解(A−λE)V⃗=0(A-\lambda E)\vec V=0(AλE)V=0,这是一个齐次线性方程组,当det(A−λE)=0det(A-\lambda E)=0det(AλE)=0(A−λE)(A-\lambda E)(AλE)这个矩阵非满秩的时候存在非零解。

现在让我们重新审视一下AV⃗=λv⃗A\vec V=\lambda \vec vAV=λv这个式子:

A代表了一个变换矩阵,v⃗\vec vv代表了特征向量,当矩阵*向量=向量,因此Av⃗A\vec vAv代表了对v⃗\vec vv的一次线性变换,在SVD中,我们可以将矩阵变换拆解为A=DRA=DRA=DR,即旋转和拉伸,因此Av⃗A\vec vAv相当于对向量v⃗\vec vv进行了旋转加拉伸的线性变换,它的结果AV⃗=λv⃗A\vec V=\lambda \vec vAV=λv,相当于对原向量拉伸了特征值λ\lambdaλ倍。也就是说,在特征向量上的线性变换A完全可以由λ\lambdaλ所定义!

那么特征值能不能是复数呢?能,这意味着特征向量缩放了一个虚数倍?在笛卡尔坐标系上实在是太难想象了,而且有些超纲了。
在这里插入图片描述
为什么对角矩阵的主元就是特征值?我们可以将基向量视为特征向量,因此主元上的元素就是特征值。

我们能进行SVD分解的基础之一就是特征值的这些特性,实际上SVD公式M=UΣVTM=U\Sigma V^TM=UΣVT中的U,V都代表旋转变换,只有Σ\SigmaΣ代表了缩放,而在后面我们也会知道,原来MMTMM^TMMT的特征值L=Σ2L=\Sigma^2L=Σ2,如果我们对一个非奇异矩阵进行了SVD分解,所得到的奇异值其实就是特征值,因此和我们现在所说的特征值代表缩放因子这一结论是一致的


什么是奇异值分解?

在这里插入图片描述
左图中的M是一个线性变换矩阵,想要从一个单位圆达到M这个效果,你可以想象一下,我们就是把这个圆拉长并且旋转。我们可以把整个操作分解为拉伸+旋转。在奇异值分解中,则是分解为了旋转VTV^TVT+拉伸Σ\SigmaΣ+旋转UUU,奇异值分解的公式则是M=UΣVTM=U\Sigma V^TM=UΣVT

在这里插入图片描述


公式推导

在这里插入图片描述
如图,V是原始域的标准正交基(即基为单位长度且正交),我们对其应用线性变换M得到了新的矩阵UΣU\SigmaUΣU=[u1→,u2→]U=[\overrightarrow{u_1},\overrightarrow{u_2}]U=[u1,u2]也是标准正交基(其基为原始域单位长度且正交),但是我们发现经过线性变换M的新矩阵U,它的基的长度实际上已经不是单位长度了(原始域的单位长度),相当于在U的基上进行了拉伸,我们用Σ\SigmaΣ表示这个拉伸矩阵,拉伸幅度用奇异值σ\sigmaσ表示。

因此我们可以得到MV=UΣMV=U\SigmaMV=UΣ,其中由于V是正交矩阵,因此VT=V−1V^T=V^{-1}VT=V1
M=UΣV−1=UΣVTM=U\Sigma V^{-1}=U\Sigma V^TM=UΣV1=UΣVT

SVD推广到任意大小矩阵

在这里插入图片描述
对于任意大小矩阵可化为m×n=(m×m)(m×n)(n×n)

在上图中举出的这个例子中,我们发现Σ\SigmaΣ矩阵中的最后一行是没有信息的,因此这一行可以忽略(在此例子中m=n+1),我们可以少计算一行,将其看作一个(m-1)*n的矩阵,那么UUU矩阵的最后一列也可以消去,因此可以得到一个更简单矩阵计算:

在这里插入图片描述
在这里我们稍微提一下后面要讲的主成分分析:其实就是选择主要元素,丢弃非主要元素从而实现信息压缩。
在这里插入图片描述现在让我们给Σ\SigmaΣ选择r个主成分,得到新的压缩过的三个矩阵

在这里插入图片描述
我们按照Σ\SigmaΣ中奇异值的个数进行模式拆分,由于压缩矩阵是(m×r)(r×r)(r×n),所以我们分别把UUU拆成rrr列,Σ\SigmaΣ拆成rrr个奇异值,VTV^TVT拆成rrr行,依次组合成三个模式(pattern)

在这里插入图片描述在这里插入图片描述

U,VTU,V^TU,VT拆出的成分相乘,得到一个新的矩阵,再分别乘以奇异值,最后将三个矩阵叠加在一起,就得到了原始矩阵M(由于选择了主成分,因此存在信息丢失)
在这里插入图片描述
我们再将其拆解出来,就是基向量u∗基向量v∗奇异值σ基向量u*基向量v*奇异值\sigma基向量u基向量v奇异值σ,因为奇异值有三个,所以我们拆分出了三种模式,我们可以给不同的模式定义不同的信息
在这里插入图片描述
虽然三种模式的保存的信息形式都是时间,空间和大小,但是三种模式保存的时间,空间的分布都是不同的。


如何求SVD分解

M=UΣVTMTM=(UΣVT)TUΣVTMTM=VΣUTUΣVT(Σ对称)MTM=VΣΣVTM=U\Sigma V^T\\ M^TM=(U\Sigma V^T)^TU\Sigma V^T\\ M^TM=V\Sigma U^TU\Sigma V^T(\Sigma对称)\\ M^TM=V\Sigma\Sigma V^TM=UΣVTMTM=(UΣVT)TUΣVTMTM=VΣUTUΣVT(Σ对称)MTM=VΣΣVT

我们令L=ΣΣL=\Sigma\SigmaL=ΣΣ,我们设MTMM^TMMTM的特征值为λ\lambdaλ,那么就有MTMv→=λv→M^TM\overrightarrow{v}=\lambda\overrightarrow{v}MTMv=λv
在这里插入图片描述
将上式子乘以V−1V^{-1}V1,我们得到
在这里插入图片描述
因此我们得到:
MTM=VLVTMTMV=VL=LVMMTU=UL=LU(V和U都是向量,所以能交换位置)M^TM=VLV^T\\ M^TMV=VL=LV\\ MM^TU=UL=LU(V和U都是向量,所以能交换位置)MTM=VLVTMTMV=VL=LVMMTU=UL=LU(VU都是向量,所以能交换位置)
所以V是MTMM^TMMTM的特征向量,U是MMTMM^TMMT的特征向量,因此Σ\SigmaΣ是矩阵MTM和MMTM^TM和MM^TMTMMMT的特征值L=Σ2L=\Sigma^2L=Σ2开方构成的对角阵,因此只需知道M,我们就可以进行SVD分解
在这里插入图片描述


非负矩阵分解(NMF)

在这里插入图片描述视频中只简单的提了一嘴,简单来说非负矩阵分解类似于SVD,将MMM分解为SBSBSB,这两个矩阵中的每个向量,每个元素都是非负的,然后将S的每一列*B的每一行,得到右下角三个秩为1的矩阵并相加,最终结果近似于原始矩阵M,假设S列代表空间,B行代表时间,当时间空间为正值的时候我们比较方便讨论其物理意义。由于缺失了奇异值σ\sigmaσ,所以我们不太好判断哪种模式主要,所以可能我们需要求出矩阵范数来判断每种模式的大小。


主成分分析PCA

我们为什么需要PCA?

在这里插入图片描述

我们来看看一个特殊的例子,如果在二维坐标上保存了这些样本,我们发现实际上它们几乎处于同一条直线,现在我们建立一个新的坐标系,那么如果以新坐标系为原点,就会发现所有的样本基本分布在一维数轴上,也就是说,如果我们使用新的坐标系来保存样本数据,那么我们只需要一维的矩阵就能保存所有信息,这样我们就实现了数据的降维,并且保证了较少的信息损失。
在这里插入图片描述

因此,PCA的本质就是重构一个新的坐标系,使得我们在进行数据降维的时候,尽可能多地保存信息,使得信息损失较少。


来找坐标原点

让我们来看一个例子:

在这里插入图片描述
假设我们有6只小鼠,每只测定了两种基因。(其中小鼠意味着个体样本,基因代表每个样本测量的变量)

在这里插入图片描述假设我们只有一个变量,那么我们可以将数据放在一维数轴上,123处于较高位,456处于较低位,不难发现123是相似的,456是相似的。而这两堆之间的相似性不强。
在这里插入图片描述
如果有两个变量,拓展到二维坐标上也是同理的。甚至于三维。

但是如果拓展到四维,那我们就没法通过四维图像来判断这些样本的近似度了。

在这里插入图片描述如果我们分别计算样本在变量1和变量2上的平均测度(图中红X),我们可以用这个平均值坐标代表数据的中心,我们将这一步称为"去中心化"。确定数据的中心,是为了将其作为坐标原点。


来找坐标系

在这里插入图片描述现在我们将中心移动到了原点,让我们找到一条直线来拟合这些数据

在这里插入图片描述怎么寻找最佳拟合直线应该不用我们多说了,最小二乘法。
在这里插入图片描述现在让我们以一个样本为例,用点到直线的距离和原点构造出三角形,根据勾股定理,a固定,b越短,c越长,b和c是负相关的。也就是说最小二乘法使得所有点到直线的距离bib_ibi之和最小,如果我们换个角度,那么cic_ici之和将会达到最大
在这里插入图片描述因此,我们在PCA中可以通过计算点的投影到原点的距离did_idi来判断是否找到了最佳拟合直线。需要注意的是,和线性回归不同,由于PCA的坐标存在着正负,因此得到的距离did_idi也有可能是负数,为了避免负数,因此我们要对其进行平方和计算,其实距离did_idi意味着方差。
在这里插入图片描述
我们将距离平方和称为SS,接下来为了找到这个最佳直线,我们开始旋转,最终找到了这条线,此时的SS是最大的。

我们把现在找到的这条最佳拟合直线称为主成分1(或PC1,Principal Component),假设它的斜率是0.25,也就是14\frac{1}{4}41,意味着我们每往横轴前进四个单位,在纵轴上会上升一个单位。
在这里插入图片描述
也就是说对于每个数据而言,因为它们的分布是近似于这条直线的,因此每个样本在横轴Gene1的方向上扩散更宽,而在纵轴Gene2的方向上的扩散就相对较小。(就像上图第一象限的样本,它们更偏向右边而不是上面,第三象限的样本更偏向左边而非下面)

我们也可以将PC1这条直线,视为Gene1和Gene2两个变量的线性组合

在这里插入图片描述
根据勾股定理,我们想要得到单位长度1的PC1,那么我们就需要44.12\frac{4}{4.12}4.124的Gene1和14.12\frac{1}{4.12}4.121的Gene2,我们将这个单位长度向量称为PC1的奇异向量或特征向量,我们将每种变量Gene的比例称为载荷得分(Loading Scores),SS就是PC1的特征值L=ΣΣL=\Sigma\SigmaL=ΣΣ,因此SS\sqrt{SS}SS就是PC1的奇异值

在这里插入图片描述
在二维数轴上,PC2就是简单的一条经过原点且垂直于PC1的直线。所以PC2的斜率和PC1的斜率之积是-1,所以当前PC2的斜率为-4。然后我们再求PC2方向上单位长度的特征向量,奇异值以及载荷得分。同时也能得到PC2的SS。
在这里插入图片描述
要绘制最终的PCA图,我们需要旋转所有内容,并且使得PC1呈水平状态。然后根据投影位置找到样本,

以上内容是在几何上对PCA的理解,实际上,我们可以将PCA理解为:寻找一个方便我们进行数据降维的特征空间的方法。PC1和PC2都是这个特征空间的轴,而我们之所以要SS(方差)达到最大,是因为方差可以用于解释平行于特征空间轴方向的数据传播

那么我们结合公式推导看看PCA的过程


怎么理解PCA

在这里插入图片描述
让我们来看看两组数据,第一组数据,它在x,y方向上都是正态分布,并且x和y不相关,我们把第一组数据称为白数据(white data),由于是标准正态分布,因此其均值是0,方差是1。
右边的数据是我们手上去中心化后的数据,x和y都是正态分布但不是标准正态分布,并且x和y相关,意味着随着数据在x方向上的增大,在y方向上也会增大。
在这里插入图片描述
在学习了SVD分解后,我们知道可以通过线性变换将DDD转化为D′D'D这个矩阵,其中SSS代表我们往方差最大的方向进行拉伸,而RRR则是旋转方向最大的方向的角度,因此我们解决PCA问题可以转化为找到这个旋转矩阵RRR
在这里插入图片描述
同样的,我们也可以通过逆运算,从手上的数据D′D'D来计算白数据DDD,值得一提的是,由于RRR是一个旋转矩阵,因此基一定是正交的,也就意味着它是一个正交矩阵,因此R−1=RTR^{-1}=R^TR1=RT,而SSS矩阵是对角矩阵,因此其逆矩阵相当于对角元素的倒数。

什么是协方差矩阵

因此,想要解决PCA问题,我们需要找到旋转矩阵RRR,那么怎么找到它呢?我们需要协方差矩阵的帮助
在这里插入图片描述
在刚才从几何上理解PCA的过程,我们知道寻找到PC1的条件是要使得方差最大,但是如果运用到计算中,我们的方差公式σ(x)或者σ(y)\sigma(x)或者\sigma(y)σ(x)或者σ(y)只能表示数据在x轴方向上或者y轴方向上的方差,而你可以翻回上面的图看看,我们寻找PC1的时候需要的是对角方向(斜线)上的方差,因此我们需要引入一个新的概念:协方差

协方差,我们用cov(x,y)cov(x,y)cov(x,y)来表示,它代表的是两个变量在变化过程中是同方向变化还是反方向变化?其同向或反向程度如何?它代表了数据在x和y上的相关程度,也就是斜线方向上传播的相关关系。
其中当协方差cov(x,y)>0cov(x,y)>0cov(x,y)>0代表x和y在同方向上相关,反之cov(x,y)<0cov(x,y)<0cov(x,y)<0代表反方向相关,且协方差的绝对值越大代表了方向上的相关程度(变化比例)越大。

协方差公式:cov(x,y)=∑i=1n(xi−x‾)(yi−y‾)n−1cov(x,y)=\frac{\sum^n_{i=1}(x_i-\overline x)(y_i-\overline y)}{n-1}cov(x,y)=n1i=1n(xix)(yiy)

其中x‾,y‾\overline x,\overline yx,y代表了各个样本的x和y在数轴上的均值,由于我们已经完成了去中心化,因此坐标原点处于样本中心,所以x‾=0,y‾=0\overline x=0,\overline y=0x=0,y=0,因此协方差化简为cov(x,y)=∑i=1n(xi)(yi)n−1cov(x,y)=\frac{\sum^n_{i=1}(x_i)(y_i)}{n-1}cov(x,y)=n1i=1n(xi)(yi),如果我们求x与x 的协方差,其结果就是x的方差

在这里插入图片描述
协方差矩阵就是由协方差构成的矩阵,其中对角线元素是方差,n阶矩阵代表了n维坐标。初始的白数据我们说过,由于满足标准正态分布,所以协方差是0,方差是1,因此协方差矩阵C=[1001]C=\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}C=[1001]

协方差在我们进行矩阵的线性变换的时候是怎么变动的呢?你可以想象一下,由于协方差矩阵C=[cov(x,x)cov(x,y)cov(x,y)cov(y,y)]C=\begin{bmatrix} cov(x,x) & cov(x,y) \\ cov(x,y)& cov(y,y) \end{bmatrix}C=[cov(x,x)cov(x,y)cov(x,y)cov(y,y)],所以当x,y上的向量变动会导致对应的协方差产生变动,因此你可以将其等价为基向量的线性变换所产生的相关性变化。

假设我们将数据向x轴两边拉伸,那么与x相关的协方差cov(x,x),cov(x,y)cov(x,x),cov(x,y)cov(x,x),cov(x,y)会发生变化,而cov(y,y)cov(y,y)cov(y,y)不会,因此想象一下整体数据往x轴两边扩张,y不变,因此x和x,x和y的相关性都会变大,意味着协方差的正负号不变,绝对值增大。反之若是向x轴内收缩,则协方差正负号不变,绝对值缩小。

当数据整体进行旋转的时候,我们以当前xy方向作为对比,想象一下当整体旋转九十度,那么原来的x坐标指向y坐标,而y坐标指向了x坐标的反向,因此方差cov(x,x),cov(y,y)cov(x,x),cov(y,y)cov(x,x),cov(y,y)相关程度不变,协方差cov(x,y)cov(x,y)cov(x,y)符号会产生正负变化,相当于每旋转90度,cov(x,y)∗−1cov(x,y)*-1cov(x,y)1。形状上来看如果形状类似“/”那协方差cov(x,y)>0cov(x,y)>0cov(x,y)>0,反之形状类似""则协方差cov(x,y)<0cov(x,y)<0cov(x,y)<0

详见协方差矩阵的几何解释

公式推导

在这里插入图片描述

还是要提一下,上式的矩阵D其实就是SVD里的矩阵M,让我们详解一下协方差矩阵的求法:
C=[cov(x,x)cov(x,y)cov(x,y)cov(y,y)]=[∑i=1nxi2n−1∑i=1nxiyin−1∑i=1nxiyin−1∑i=1nyi2n−1]C=\begin{bmatrix} cov(x,x) & cov(x,y) \\ cov(x,y)& cov(y,y) \end{bmatrix}=\begin{bmatrix} \frac {\sum^n_{i=1}x_i^2}{n-1} & \frac {\sum^n_{i=1}x_iy_i}{n-1} \\ \frac {\sum^n_{i=1}x_iy_i}{n-1}& \frac {\sum^n_{i=1}y_i^2}{n-1} \end{bmatrix}C=[cov(x,x)cov(x,y)cov(x,y)cov(y,y)]=[n1i=1nxi2n1i=1nxiyin1i=1nxiyin1i=1nyi2]
这个矩阵相乘结果可以提取1n−1\frac{1}{n-1}n11最终化为协方差矩阵C=1n−1DDTC=\frac{1}{n-1}DD^TC=n11DDT的矩阵与其转置的乘积形式

在这里插入图片描述
让我们将C′=1n−1D′DTC'=\frac {1}{n-1}D'D^TC=n11DDT这个式子拆开
=1n−1RSD(RSD)T=1n−1RSDDTSTRT=RS(1n−1DDT)STRT=\frac{1}{n-1}RSD(RSD)^T\\ =\frac{1}{n-1}RSDD^TS^TR^T\\ =RS(\frac{1}{n-1}DD^T)S^TR^T=n11RSD(RSD)T=n11RSDDTSTRT=RS(n11DDT)STRT
因为我们知道白数据的方差是0,协方差是1,所以白数据的协方差矩阵C=1n−1DDT=[1001]C=\frac{1}{n-1}DD^T=\begin{bmatrix} 1 & 0 \\ 0& 1 \end{bmatrix}C=n11DDT=[1001],因此白数据的协方差矩阵是单位矩阵,所以原式子:
=RSSTRT=RSS^TR^T=RSSTRT
而我们之前说了,拉伸矩阵SSS是一个对角矩阵,所以S=STS=S^TS=ST,旋转矩阵RRR是一个正交矩阵,因此RT=R−1R^T=R^{-1}RT=R1

原式=RLR−1原式=RLR^{-1}原式=RLR1

因此我们得出D′D'D的协方差矩阵 C′=RLR−1C'=RLR^{-1}C=RLR1,其中L=SST=[a200b2]L=SS^T=\begin{bmatrix} a^2 & 0 \\ 0& b^2 \end{bmatrix}L=SST=[a200b2]

那么其实到这里我们就已经很熟悉了,这个协方差矩阵和我们在SVD中学到的M=UΣVTM=U\Sigma V^TM=UΣVT的形式已经完全一致了,实际上两者本质上可以说就是同一个式子,

在这里插入图片描述
假设C′C'C的特征值是λ\lambdaλ,我们来对其进行变形,由于是二维矩阵,所以有两个特征值,我们把特征值v1v2v_1v_2v1v2看作矩阵R,λ\lambdaλ看作矩阵L,得到如上图所示的矩阵变换。
在这里插入图片描述
因此变换后的协方差矩阵C′=RLR−1C'=RLR^{-1}C=RLR1就相当于C′=特征向量∗特征值矩阵∗特征向量的转置C'=特征向量*特征值矩阵*特征向量的转置C=特征向量特征值矩阵特征向量的转置
由于协方差代表了两个坐标的相关度,就相当于我们要求的线性变换后的矩阵D′D'D其PCA的横轴PC1为第一列特征向量v⃗1\vec v_1v1,而纵轴PC2就为v⃗2\vec v_2v2,而L这个特征值矩阵代表了在白数据的xy方向上进行拉伸的倍数a,ba,ba,b的平方,λ1=a2,λ2=b2\lambda_1=a^2,\lambda_2=b^2λ1=a2,λ2=b2。为什么会这样呢?

重要思考!

协方差和方差存在着什么关系?这一点我们需要特别指出,我们之前说过协方差代表了数据在斜线上的传播关系,而方差代表了数据在x轴或者y轴上的传播关系。也就是说,方差和协方差是负相关的,当数据在斜线上的传播相关越大,则在横轴纵轴上的传播相关越小,也就是说,当协方差达到最大的时候,x和y的方差=0!同理当方差达到最大的时候,协方差=0。

让我们思考一个问题:方差在什么时候能够达到最大?

当然是协方差=0的时候,此时数据在斜方向上不相关,但是我们能不能直接确定一个最大方差?

或者我们换一个提问,能不能存在一个协方差矩阵,使得数据仅仅在轴方向上变换?

或者有没有一个矩阵,能使得线性变换相当于向量的拉伸?

魔法解开了,答案是特征向量!当数轴是特征向量,应用的矩阵相当于特征值的时候,Av⃗=λv⃗A\vec v=\lambda \vec vAv=λv,能够满足我们的条件!因此方差在什么时候能取到最大?也就是方差=λ\lambdaλ,协方差=0的时候!

现在再让我们看看这个公式
在这里插入图片描述
现在我们理解了,此时白数据的x轴就是v⃗1\vec v_1v1,y轴就是v⃗2\vec v_2v2,那么要使得方差最大,所以特征矩阵就是L=SST=[a200b2]L=SS^T=\begin{bmatrix} a^2 & 0 \\ 0& b^2 \end{bmatrix}L=SST=[a200b2]

在这里插入图片描述

C′C'CD′D'D的协方差,LLLD′D'D中用红蓝线画出的新坐标系下的协方差,我们对D′D'D应用一下R−1R^{-1}R1将其旋转回去,这样坐标就回归到了白数据的坐标(后两张图的红蓝坐标轴是将原点重新换到新坐标后的图片,后两张的红蓝坐标相当于新建的标准笛卡尔坐标系,与第一张图的红蓝轴不是同一个东西,由于网格没有对应发生变换所以可能看的有点迷糊),方差就代表了在白数据轴方向的拉伸倍数λ\lambdaλ,实际上此处的方差方向才是第一张图上的红蓝轴方向。
在这里插入图片描述
因此,PCA的方法实际上是将变换后的特征向量作为PC轴的方法,其方差最大的时候也就是对应协方差矩阵C=RLR−1C=RLR^{-1}C=RLR1,相当于把特征方向旋转到标准坐标系上再应用LLL的特征值变换。

在这里插入图片描述

此外,三维降二维的PCA和我们刚才讲的类似,只不过我们要寻找的不止PC1,三维降二维是想让数据投影到我们寻找到的平面,所以我们寻找到方差最大的轴PC1之后,还需要寻找到过原点垂直于PC1且方差最大的PC2。在找到这两个轴后,PC3是一条过原点且同时垂直于PC1和PC2的轴,因此是唯一确定的。

置信椭圆

在这里插入图片描述

置信椭圆就是我们之前提到的置信域,它代表了一个搜索的区间范围。

在白噪声上的置信域是一个圆形,当我们对D进行了线性变换后,置信域被拉伸成了一个椭圆,由于是整体进行了变换,因此无论是变换前还是变换后,置信椭圆内包含的点的比例依旧是不变的,也就是若D中的s包含了95%的点,D’中的s依旧包含95%的点。置信椭圆的大小由s决定,可以查表得。

PCA的缺点

在这里插入图片描述

PCA相较于其他降维算法,的一个缺点就是离群点对于整体的影响较大,


PCA主成分与SVD的关系

在这里插入图片描述

我们知道V是MTMM^TMMTM的特征向量,而PCA主成分的方向是协方差矩阵C=1n−1D′TD′C=\frac{1}{n-1}{D'}^TD'C=n11DTD的特征向量,因此二者的特征向量是同一个方向上的不同大小的向量,所以SVD的V就是PCA主成分的方向。

SVD的U矩阵是MMTMM^TMMT的特征向量,U的作用就是SVD里讲的,用三个矩阵压缩存储原矩阵。奇异值分解中的Σ\SigmaΣ奇异值选择其实就相当于PCA中的主成分选择,因此在这两式子中,特征值矩阵的对角元素个数就代表了保存的维度数量。

此外,奇异值分解相较于PCA,只需知道原矩阵M即可计算出U,V了,不需要计算协方差矩阵,而PCA需要先计算出协方差矩阵才能计算出新矩阵D′D'D,因此相对而言SVD应该更高效。

相关文章:

【AI绘图学习笔记】奇异值分解(SVD)、主成分分析(PCA)

这节的内容需要一些线性代数基础知识&#xff0c;如果你没听懂本文在讲什么&#xff0c;强烈建议你学习【官方双语/合集】线性代数的本质 - 系列合集 文章目录奇异值分解线性变换特征值和特征向量的几何意义什么是奇异值分解&#xff1f;公式推导SVD推广到任意大小矩阵如何求SV…...

【设计模式】模板方法模式和门面模式

模板方法模式和门面模式模板方法模式代码示例门面模式代码示例门面模式的应用场景模板方法模式 模板方法模式非常简单&#xff0c;就是定义了一个固定的公共流程&#xff0c;整个流程有哪些步骤是事先定义好的&#xff0c;具体的步骤则交由子类去实现。属于行为型设计模式。 简…...

Kubernetes未来十年的四大发展趋势

作者&#xff1a;李翔 跟大家已经感受到的一样&#xff0c;Kubernetes已经成为了云计算领域最具统治力的平台&#xff0c;成为了云原生开发的绝对标准&#xff0c;而伴随Kubernetes诞生的CNCF (Cloud Native Computing Foundation) 也因此成为了业界影响力巨大的组织。在成为云…...

一、sql 基础知识、函数和子查询

MySQL 是一种流行的关系型数据库管理系统&#xff0c;使用 SQL 语言进行数据管理和操作。在 MySQL 中&#xff0c;常用的语句包括 SELECT 查询语句、WHERE 条件语句、算术表达式、函数、聚合函数、自定义函数、逻辑表达式、子查询和连接。这些语句可以帮助用户快速地进行数据查…...

产品射频认证笔记

文章目录1. 射频监管认证的目的&#xff1a;1.1 确保 RF 产品在其预期环境中按预期运行1.2 确保射频产品不会干扰其他电子或射频设备2. 射频认证地区规范3. FCC简介4. FCC认证需要准备的内容&#xff1a;5. 射频监管测量会话期间测量以下射频属性&#xff1a;6. 调整射频参数6.…...

做了个springboot接口参数解密的工具,我给它命名为万能钥匙(已上传maven中央仓库,附详细使用说明)

前言&#xff1a;之前工作中做过两个功能&#xff0c;就是之前写的这两篇博客&#xff0c;最近几天有个想法&#xff0c;给它做成一个springboot的start启动器&#xff0c;直接引入依赖&#xff0c;写好配置就能用了 springboot使用自定义注解实现接口参数解密&#xff0c;普通…...

【Flutter从入门到入坑】Flutter 知识体系

学习 Flutter 需要掌握哪些知识&#xff1f; 终端设备越来越碎片化&#xff0c;需要支持的操作系统越来越多&#xff0c;从研发效率和维护成本综合考虑&#xff0c;跨平台开发一定是未来大前端的趋势&#xff0c;我们应该拥抱变化。而 Flutter 提供了一套彻底的移动跨平台方案…...

顺序表的基本操作

目录 一.什么是顺序表 二.顺序表的基本操作 1.初始化 2.增容 3.尾插 4.头插 5.尾删 6.头删 7.指定位置插入 8.指定位置删除 9.打印 10.查找 11.销毁 一.什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组…...

设计模式——创建型模型——单列模式(8种实现)

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;计算机基础专栏 &#x1f4e7;如果文章知识点有错误的地方&#…...

【软考中级】软件设计师笔记

计算机系统的性能一般包括两个方面&#xff1a;一方面是它的可用性&#xff0c;也就是计算机系统能正常工作的时间&#xff0c;其指标可以是能够持续工作的时间长度&#xff0c;也可以是在一段时间内&#xff0c;能正常工作的时间所占的百分比 另一方面是处理能力&#xff0c;又…...

包教包会的ES6

自学参考&#xff1a;http://es6.ruanyifeng.com/ 一、ECMAScript 6 简介 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在 2015 年 6 月正式发布了。它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大…...

python学习——【第四弹】

前言 上一篇文章 python学习——【第三弹】 中学习了python中的流程控制语句&#xff0c;这篇文章我们接着学习python中的序列。先给大家介绍不可变序列 字符串和可变序列 列表&#xff0c;下一篇文章接着补充元组&#xff0c;集合和字典。 序列 指的是一块可以存放多个值的…...

Web3中文|无聊猿Otherside元宇宙启动第二次旅行

3月9日消息&#xff0c;无聊猿Bored Ape Yacht Club母公司Yuga Labs公布了其Otherside元宇宙游戏平台第二次测试的最新细节。Yuga Labs公司称&#xff0c;“第二次旅行”将于3月25日举行&#xff0c;由四位Otherside团队长带领完成近两小时的游戏故事。本次旅行对Otherdeed NFT…...

SpringCloud-7_OpenFeign服务调用

OpenFeign介绍OpenFeign是什么1.OpenFeign是个声明式WebService客户端&#xff0c;使用OpenFeign让编写Web Service客户端更简单2.它的使用方法是定义一个服务接口然后在上面添加注解3.OpenFeign也支持可拔插式的编码器和解码器4.Spring Cloud对OpenFeign进行了封装使其支持了S…...

解决docker容器之间网络互通

docker容器之间相互访问 1.查看当前的网络 Copy [roothost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 3dd4643bb158 bridge bridge local 748b765aca52 host host …...

测试微服务:快速入门指南

在过去几年中&#xff0c;应用程序已经发展到拥有数百万用户并产生大量数据。使用这些应用程序的人期望快速响应和 24/7 可用性。为了使应用程序快速可用&#xff0c;它们必须快速响应增加的负载。 一种方法是使用微服务架构&#xff0c;因为在单体应用程序中&#xff0c;主要…...

MySQL Show Profile分析

6 Show Profile分析&#xff08;重点&#xff09; Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量 官网文档 默认情况下&#xff0c;参数处于关闭状态&#xff0c;并保存最近15次的运行结果 分析步骤&#xff1a; 1、是否…...

基于Docker快速搭建蜜罐Dionaea(30)

实验目的 1. 快速搭建Dionaea蜜罐 2. 使用Nmap扫描测试Dionaea蜜罐预备知识1. 初步认识Dionaea dionaea&#xff0c;中文的意思即捕蝇草&#xff0c;是否形容蜜罐很形象&#xff1f;dionaea是nepenthes&#xff08;猪笼草&#xff09;的发展和后续&#xff0c;更加容易被部署和…...

WP_Query 的所有参数及其讲解和实用案例

WP_Query 是 WordPress 提供的一个强大的查询工具&#xff0c;用于获取与当前页面或文章相关的内容。下面是 WP_Query 的所有参数及其讲解&#xff1a;author: 查询特定作者的文章。可以是作者 ID、作者登录名或作者昵称。实用案例&#xff1a;查询作者为 "John Smith&quo…...

100个网络运维工作者必须知道的小知识!(上)

1&#xff09;什么是链接&#xff1f; 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2&#xff09;OSI参考模型的层次是什么&#xff1f; 有7个OSI层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输…...

Python如何获取大量电影影评,做可视化演示

前言 《保你平安》今天上映诶&#xff0c;有朋友看过吗&#xff0c;咋样啊 这是我最近比较想看的电影了&#xff0c;不过不知道这影评怎么样&#xff0c;上周末的点映应该是有蛮多人看的吧&#xff0c;可以采集采集评论看过的朋友发出来的评论&#xff0c;分析分析 这周刚好…...

【C语言】详讲qsort库函数

qsort函数介绍具体作用qsort函数是一种用于对不同类型数据进行快速排序的函数&#xff0c;排序算法有很多最常用的冒泡排序法仅仅只能对整形进行排序,qsort不同,排序类型不受限制,qsort函数的底层原理是一种快速排序.基本构造qsort( void* arr, int sz, int sizeof, cmp_code);…...

SEO技术风口来了|SEO能否抓住全球约93%的网络用户?

开篇词作者/出品人 | 美洽 SEO 流量专家 白桦为什么要做一个 SEO 专栏&#xff1f;在一部分人眼中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经是老掉牙的玩意儿&#xff0c;在这个信息爆炸的年代&#xff0c;它似乎已经无法承担吸引流量的主要作用。但&#xff…...

mxnet版本与numpy,requests等都不兼容问题

简介 跟着李沐学AI时遇到的mxnet环境问题。 问题 使用pip install mxnet时会重新安装相匹配的numpy和requests&#xff0c;而这新安装的这两个版本不满足d2l所需的版本。 然后报错&#xff1a; ERROR: pips dependency resolver does not currently take into account all …...

逆向分析——壳

你脑海中的壳是什么 壳在自然界是动物的保护壳&#xff0c;软件同样有保护壳&#xff0c;为了防止破解 也许大海给贝壳下的定义是珍珠&#xff0c;也许时间给煤炭下的定义是钻石 ——沙与沫 壳的由来 在DOS时代&#xff0c;壳一般指的是磁盘加密软件中的一段加密程序 后来发展…...

为 Argo CD 应用程序指定多个来源

在 Argo CD 2.6 中引入多源功能之前,Argo CD 仅限于管理来自 单个 Git 或 Helm 存储库 的应用程序。用户必须将每个应用程序作为 Argo CD 中的单个实体进行管理,即使资源存储在多个存储库中也是如此。借助多源功能,现在可以创建一个 Argo CD 应用程序,指定存储在多个存储库…...

verilog specify语法

specify block用来描述从源点&#xff08;source&#xff1a;input/inout port&#xff09;到终点&#xff08;destination&#xff1a;output/inout port&#xff09;的路径延时&#xff08;path delay&#xff09;&#xff0c;由specify开始&#xff0c;到endspecify结束&…...

CMake编译学习笔记

CMake学习笔记CMake编译概述CMake学习资源CMake编译项目架构cmake指令CMakeList基础准则CMakeList编写项目构建cmake_minimum_required() 和 project()set()find_package()add_executable()aux_source_directory()连接库文件include_directories()和target_include_directories…...

Day913.反向代理和网关是什么关系 -SpringBoot与K8s云原生微服务实践

反向代理和网关是什么关系 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于反向代理和网关是什么关系的内容。 一、反向代理 反向代理 是一种网络技术&#xff0c;用于将客户端的请求转发到一个或多个服务器上&#xff0c;并将响应返回给客户端。与正向代理不同&am…...

IT行业就业趋势显示:二季度平均月薪超8千

我国的IT互联网行业在近些年来规模迅速扩大&#xff0c;技能和技术水平也明显提升&#xff0c;目前IT互联网行业已经成为社会发展中新型产业的重要组成部分&#xff0c;行业的人才队伍也在不断的发展壮大&#xff0c;选择进入入互联网行业工作的人也越来越多。 根据58同城前段…...

【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)

简介 五子棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用&#xff0c;客户端…...

C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator

今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;DrawMoveIndicator属性&#xff1a;表示确定移动分隔符时是否绘制移动…...

Java的jar包打包成exe应用

将springboot项目使用maven打出的jar包&#xff0c;打成windows平台下exe应用程序包&#xff08;自带jre环境&#xff09;。 工具&#xff1a;1、exe4j 2、Inno Setup 工具放到网盘&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1ZHX8P7u-7GBxaC6uaIC8Ag 提取码&#x…...

Latex学习笔记

Latex 学习笔记 快速入门 编译软件: TeX Live TexStudio, Ctex, 线上: Overleaf第一个示例代码&#xff1a; \documentclass{article} % 设置文档使用的文档类 % 导言区 \title{my first Latex document} \author{Jclian91} \date{\today} \begin{document} % 正文区\maket…...

【c++复习】C++的基础知识(常用关键字、缺省参数、函数重载、引用)

C基础写在开头C基础常用关键字using namespace流插入和流提取操作符内联函数(inline)宏auto关键字 (c11nullptr (c11缺省参数函数重载引用写在开头 C基础部分我想介绍如下几个关键点&#xff1a; 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函…...

Docker入门建议收藏 第二部分

二、Docker 容器技术与虚拟机的区别 Docker 到底是个什么东西呢&#xff1f;我们在理解 Docker 之前&#xff0c;首先得先区分清楚两个概念&#xff0c;容器和虚拟机。 虚拟机 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在…...

蓝桥杯三月刷题 第7天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;三角回文数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数组切分&#x1f914;一、思路:&#x1f60e;二、…...

面试官问百万数据excel导出功能如何实现?

文章目录 背景实现1.异步处理1.1 使用job1.2 使用mq2.使用easyexcel4.多个sheet5.计算limit的起始位置6.文件上传到OSS7.通过WebSocket推送通知8.总条数可配置9.order by商品编号总结背景 用户在UI界面上点击全部导出按钮,就能导出所有商品数据。 咋一看,这个需求挺简单的。…...

理解HTTPS及配置

HTTP的弊端及HTTPS的由来 众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种.那么在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数据本身存在的安全问题:(1)、通信使用明文(不…...

IP-guard浏览器上传下载智能加解密,让管理更省心省力

现在员工日常工作中经常会通过浏览器访问公司的业务系统&#xff08;OA、JIRA等&#xff09;&#xff0c;或者访问其他外部系统&#xff0c;访问下载服务器的文档变得更便捷&#xff0c;工作地点也不再局限于办公室中。为确保应用系统机密安全且又不影响员工的正常工作&#xf…...

leetcode day22 位运算

位运算咋这么老难 剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案&#xff1a;nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba&(-a)最低位为1的二进制&#xff08;从又到左&#xff09;所有的异或结果得到sum2^108flag-8&88可分为两组&#xff0c;一组为与…...

java中如何判断map是否为空

java中判断map是否为空的方法是&#xff1a;利用isEmpty()函数来判断。函数介绍&#xff1a;isEmpty()是Java中用于判断某种容器是否有元素的系统库函数。如用来判断ArrayList&#xff0c;HashSet&#xff0c;HashMap是否有元素等。在Java中&#xff0c;可以用isEmpty();判断一…...

C语言数据结构:链表的增删改查及动态创建

目录 一&#xff0c;链表与数组 ① 定义区别 ② 实现区别 二&#xff0c;链表遍历和计算链表中节点数量 ① 链表遍历 ② 计算节点数量 三&#xff0c;查找链表节点 四&#xff0c;增加节点到链表中 ① 在节点后方插入 ② 在节点前方插入 ● 在头节点前方插入 ● 在…...

「Python 基础」I/O 编程、正则表达式

文章目录1. I/O 编程文件读写StringIO 和 BytesIO操作文件和目录序列化2. 正则表达式进阶re 模块1. I/O 编程 I/O指Input/Output&#xff1b; Input Stream 从外面&#xff08;磁盘、网络&#xff09;流进内存&#xff1b; Output Stream 从内存流到外面&#xff1b; 同步 …...

java 把pdf图片文档和文章文档转成文字的方法

java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。 Apache PDFBox&#xff1a;这是一个开源的 PDF 库&#xff0c;可以用来提取 PDF 文件中的文本内容。 iText&#xff1a;这是一个用于创建和处理 PDF 文件的库&#xff0c;可以用来提取 PDF 文件中的文本内容。…...

JavaScript 中的全部对象

宿主对象&#xff08;host Objects&#xff09;&#xff1a;由 JavaScript 宿主环境提供的对象&#xff0c;它们的行为完全由宿主环境决定。 【 浏览器环境宿主&#xff0c;全局对象window&#xff0c;window 上又有很多属性&#xff0c;如 document。 全局对象 window 上的属…...

【教学典型案例】23.部分服务总是频繁出现掉线情况

目录一&#xff1a;背景介绍问题描述解决二&#xff1a;问题分析过程解决过程设计到的知识1、nacos的data目录作用。2、nacos data目下的protocol目录3、nacos ip混乱问题三&#xff1a;总结一&#xff1a;背景介绍 问题描述 因为某些特殊原因需要把nacos迁移到另一个版本的n…...

线程安全 List 效率测试

List 常见类以及各自优缺点可自行参考 https://blog.csdn.net/weixin_39883065/article/details/111197724 本机环境 java 版本&#xff1a;1.8.0_161 window 信息&#xff1a; 测试代码 下面通过代码测试 List 线程安全类 Vector、Collections.synchronizedList(List lis…...

LeetCode 热题 C++ 581. 最短无序连续子数组 617. 合并二叉树

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…...

鉴源论坛 · 观模丨模型检查综述

作者 | 李建文 华东师范大学软件工程学院博导 版块 | 鉴源论坛 观模 01 模型检查的历史 模型检查是一种起源于20世纪70年代末的形式化验证技术。该技术最初由Edmund M. Clarke、E. Allen Emerson和Joseph Sifakis提出&#xff0c;他们因在模型检查领域的贡献而获得了2007年的…...