【数理知识】奇异值分解,从数据的线性变换角度来理解

news2024/11/22 21:48:27
序号内容
1【数理知识】自由度 degree of freedom 及自由度的计算方法
2【数理知识】刚体 rigid body 及刚体的运动
3【数理知识】刚体基本运动,平动,转动
4【数理知识】向量数乘,内积,外积,matlab代码实现
5【数理知识】协方差,随机变量的的协方差,随机变量分别是单个数字和向量时的协方差
6【数理知识】旋转矩阵的推导过程,基于向量的旋转来实现,同时解决欧式变换的非线性局限

文章目录

1. 奇异值分解

讲解奇异值分解(Sigular Value Decomposition,SVD)的教程有很多,我这里不做赘述,仅记录下自己的理解。

针对以下奇异值分解公式:

M = U Σ V T \begin{aligned} M &= U \Sigma V^\text{T} \end{aligned} M=UΣVT

其中:
M M M 矩阵可以不是方阵,也就是其维度为 m × n m \times n m×n
U U U 矩阵是 m × m m \times m m×m 的方阵,表示分解后的基向量。
Σ \Sigma Σ 矩阵是非方阵维度为 m × n m \times n m×n 的对角矩阵,对角元素是奇异值。
V V V 矩阵是维度为 n × n n \times n n×n 的正交矩阵。


比如说,当 M M M 的矩阵维度为 4 × 2 4 \times 2 4×2 时,奇异值分解公式就可以写成如下形式

M = U Σ V T [ x 1 y 1 x 2 y 2 x 3 y 3 x 4 y 4 ] = [ — — — — — — — — — — — — — — — — ] [ a 0 0 b 0 0 0 0 ] [ — — — — ] \begin{aligned} M &= U \Sigma V^\text{T} \\ \left[\begin{matrix} x_1 & y_1 \\ x_2 & y_2 \\ x_3 & y_3 \\ x_4 & y_4 \\ \end{matrix}\right] &= \left[\begin{matrix} — & — & — & — \\ — & — & — & — \\ — & — & — & — \\ — & — & — & — \\ \end{matrix}\right] \left[\begin{matrix} a & 0 \\ 0 & b \\ 0 & 0 \\ 0 & 0 \\ \end{matrix}\right] \left[\begin{matrix} — & — \\ — & — \\ \end{matrix}\right] \end{aligned} M x1x2x3x4y1y2y3y4 =UΣVT= a0000b00 []

到这里可能不太明白,没关系,之前只是为了先把 SVD 公式回顾一下,往下继续看就行了。


2. 由数据的线性变换出发

数据的线性变换(Linear Transformation)是一个数学上的概念,通常用于更改数据的表示或基准,但不改变数据的本质结构或关系。而在向量空间中,线性变换可以通过乘以一个矩阵来实现。

假如存在一个二维平面的向量,线性变换可以是缩放、旋转、倾斜等操作。

例如,

  • 一个缩放操作可以使用矩阵 S = [ 2 0 0 1 ] S = \left[\begin{matrix} 2 & 0 \\ 0 & 1 \\ \end{matrix}\right] S=[2001] 表示,此矩阵会将 x x x 坐标乘以 2, y y y 坐标乘以 1。

  • 一个旋转操作可以使用矩阵 R = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] R = \left[\begin{matrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \\ \end{matrix}\right] R=[cos(θ)sin(θ)sin(θ)cos(θ)] 表示,此矩阵会将 x x x y y y 旋转 θ \theta θ 角度。


上述两个矩阵 S S S R R R 也可以从正交基 i ⃗ , j ⃗ \vec{i}, \vec{j} i ,j 的变换上分别看到 S S S R R R 矩阵的变换效果。

如果原本正交基为 i ⃗ = [ 1 0 ] , j ⃗ = [ 0 1 ] \vec{i} = \left[\begin{matrix} 1 \\ 0 \\ \end{matrix}\right],\vec{j} = \left[\begin{matrix} 0 \\ 1 \\ \end{matrix}\right] i =[10]j =[01],经过 S S S 矩阵的变换后,
变换后正交基变为 S i ⃗ = [ 2 0 ] , S j ⃗ = [ 0 1 ] S\vec{i} = \left[\begin{matrix} 2 \\ 0 \\ \end{matrix}\right],S\vec{j} = \left[\begin{matrix} 0 \\ 1 \\ \end{matrix}\right] Si =[20]Sj =[01]

如果原本正交基为 i ⃗ = [ 1 0 ] , j ⃗ = [ 0 1 ] \vec{i} = \left[\begin{matrix} 1 \\ 0 \\ \end{matrix}\right],\vec{j} = \left[\begin{matrix} 0 \\ 1 \\ \end{matrix}\right] i =[10]j =[01],经过 R R R 矩阵的变换后,
变换后正交基变为 R i ⃗ = [ cos ⁡ ( θ ) sin ⁡ ( θ ) ] , R j ⃗ = [ − sin ⁡ ( θ ) cos ⁡ ( θ ) ] R\vec{i} = \left[\begin{matrix} \cos(\theta) \\ \sin(\theta) \\ \end{matrix}\right],R\vec{j} = \left[\begin{matrix} -\sin(\theta) \\ \cos(\theta) \\ \end{matrix}\right] Ri =[cos(θ)sin(θ)]Rj =[sin(θ)cos(θ)]


在视频【学长小课堂】什么是奇异值分解SVD–SVD如何分解时空矩阵 - bilibili中,举例用的是一组向量

D = [ x 1 x 2 x 3 x 4 y 1 y 2 y 3 y 4 ] D = \left[\begin{matrix} x_1 & x_2 & x_3 & x_4 \\ y_1 & y_2 & y_3 & y_4 \\ \end{matrix}\right] D=[x1y1x2y2x3y3x4y4]

也可以理解为一群二维平面的数据点。

接下来再看一下这一群数据点的拉伸和旋转操作,因为视频中有相应的动画,更便于理解。


1. 缩放

针对上述 D D D 数据点矩阵,看一下变换矩阵 S S S 的效果。

从形式上可以看到矩阵 S S S 的作用是缩放,这一点也可以从以下数据运算上看出,即当 D D D 左乘一个变换矩阵 S S S 后, D D D 变为

S D = [ 2 0 0 1 ] [ x 1 x 2 x 3 x 4 y 1 y 2 y 3 y 4 ] = [ 2 x 1 2 x 2 2 x 3 2 x 4 y 1 y 2 y 3 y 4 ] \begin{aligned} SD = \left[\begin{matrix} 2 & 0 \\ 0 & 1 \\ \end{matrix}\right] \left[\begin{matrix} x_1 & x_2 & x_3 & x_4 \\ y_1 & y_2 & y_3 & y_4 \\ \end{matrix}\right] =\left[\begin{matrix} 2x_1 & 2x_2 & 2x_3 & 2x_4 \\ y_1 & y_2 & y_3 & y_4 \\ \end{matrix}\right] \end{aligned} SD=[2001][x1y1x2y2x3y3x4y4]=[2x1y12x2y22x3y32x4y4]


上述变换也可以从以下动态图上看到数据的变换效果。

在这里插入图片描述


2. 旋转

接下来看一下旋转矩阵 R R R 的效果。

从形式上可以看到矩阵 R R R 的作用是旋转,这一点也可以从以下数据运算上看出,即当经过拉伸的 S D SD SD 矩阵再左乘一个变换矩阵 R R R 后, S D SD SD 变为

R S D = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] [ x 1 x 2 x 3 x 4 y 1 y 2 y 3 y 4 ] = [ x 1 cos ⁡ ( θ ) − y 1 sin ⁡ ( θ ) x 2 cos ⁡ ( θ ) − y 2 sin ⁡ ( θ ) ⋯ x 1 sin ⁡ ( θ ) + y 1 cos ⁡ ( θ ) x 2 sin ⁡ ( θ ) + y 2 cos ⁡ ( θ ) ⋯ ] \begin{aligned} RSD = \left[\begin{matrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \\ \end{matrix}\right] \left[\begin{matrix} x_1 & x_2 & x_3 & x_4 \\ y_1 & y_2 & y_3 & y_4 \\ \end{matrix}\right] =\left[\begin{matrix} x_1 \cos(\theta) - y_1 \sin(\theta) & x_2 \cos(\theta) - y_2 \sin(\theta) & \cdots \\ x_1 \sin(\theta) + y_1 \cos(\theta) & x_2 \sin(\theta) + y_2 \cos(\theta) & \cdots \\ \end{matrix}\right] \end{aligned} RSD=[cos(θ)sin(θ)sin(θ)cos(θ)][x1y1x2y2x3y3x4y4]=[x1cos(θ)y1sin(θ)x1sin(θ)+y1cos(θ)x2cos(θ)y2sin(θ)x2sin(θ)+y2cos(θ)]


数据 S D SD SD 的旋转效果可观察如下动态图。

在这里插入图片描述


3. 补充知识:如何分辨矩阵的变换效果

要分析一个矩阵的变换效果(是否是缩放、旋转或倾斜),我们需要考虑矩阵如何操作基向量或观察它的特定属性。

  1. 缩放:
    缩放矩阵会在对角线上有非 1 的值,其它位置为 0。例如,二维空间中的缩放矩阵为:
    [ s x 0 0 s y ] \left[\begin{matrix} s_x & 0 \\ 0 & s_y \\ \end{matrix}\right] [sx00sy]
    其中 s x , s y s_x, s_y sx,sy 分别是 x x x 方向和 y y y 方向的缩放因子。

  2. 旋转:
    旋转矩阵在二维空间中具有以下形式:
    [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] \left[\begin{matrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \\ \end{matrix}\right] [cos(θ)sin(θ)sin(θ)cos(θ)]
    其中 θ \theta θ 是旋转的角度。旋转矩阵的行列式为 1,且其逆矩阵是它的转置。
    另外,三维空间旋转矩阵的基向量形式请参考【数理知识】旋转矩阵的推导过程,基于向量的旋转来实现,同时解决欧式变换的非线性局限,欧拉角形式请参考:第3章-数理知识基础 -> 坐标转换。

  3. 倾斜或剪切:
    在二维空间中, x x x y y y 方向的倾斜矩阵为:
    [ 1 s 0 1 ] , [ 1 0 s 1 ] \left[\begin{matrix} 1 & s \\ 0 & 1 \\ \end{matrix}\right], \quad \left[\begin{matrix} 1 & 0 \\ s & 1 \\ \end{matrix}\right] [10s1],[1s01]
    其中 s s s 是剪切或倾斜的量。


在实际的应用中,一个矩阵可能同时表示了多种变换,也就是一个矩阵是多种变化的组合。为了确定其作用,我们通常需要对其进行分解,例如常见的 SVD 分解可以得到旋转、缩放和剪切矩阵。

同时,如果想直观地了解矩阵是如何操作的,也可以将其应用在标准基向量(如二维空间中的 [ 1 0 ] \left[\begin{matrix} 1 \\ 0 \\ \end{matrix}\right] [10] [ 0 1 ] \left[\begin{matrix} 0 \\ 1 \\ \end{matrix}\right] [01])上,观察向量基的变换结果。


3. 从 2 × 2 2 \times 2 2×2 矩阵中得到 SVD 公式

有了上述基础知识,现在我们假设存在一个 2 × 2 2 \times 2 2×2 的矩阵 M M M。可以知道 M M M 矩阵一定是表示了某种线性变换,至于是一种还是多种的组合,我们需要进一步分析。


假设 M M M 矩阵的变换效果如下图所示

在这里插入图片描述

我们可以在变换前的坐标轴上找到一组标准正交基,称为 v ⃗ 1 , v ⃗ 2 \vec{v}_1, \vec{v}_2 v 1,v 2,经过 M M M 线性变换后, v ⃗ 1 \vec{v}_1 v 1 变为 u ⃗ 1 \vec{u}_1 u 1 v ⃗ 2 \vec{v}_2 v 2 变为 u ⃗ 2 \vec{u}_2 u 2,同时长度分别为 σ 1 \sigma_1 σ1 σ 2 \sigma_2 σ2。此过程可以用如下关系式表示

M v ⃗ 1 = σ 1 u ⃗ 1 M v ⃗ 2 = σ 2 u ⃗ 2 \begin{aligned} M \vec{v}_1 &= \sigma_1 \vec{u}_1 \\ M \vec{v}_2 &= \sigma_2 \vec{u}_2 \end{aligned} Mv 1Mv 2=σ1u 1=σ2u 2


解析来用矩阵来表示正交基,也就是

V = [ v ⃗ 1 v ⃗ 2 ] , U = [ u ⃗ 1 u ⃗ 2 ] , Σ = [ σ 1 0 0 σ 2 ] \begin{aligned} V=\left[\begin{matrix} \vec{v}_1 & \vec{v}_2 \\ \end{matrix}\right] , \quad U &= \left[\begin{matrix} \vec{u}_1 & \vec{u}_2 \\ \end{matrix}\right] , \quad \Sigma = \left[\begin{matrix} \sigma_1 & 0 \\ 0 & \sigma_2 \\ \end{matrix}\right] \end{aligned} V=[v 1v 2],U=[u 1u 2],Σ=[σ100σ2]

那么有

M [ v ⃗ 1 v ⃗ 2 ] = [ u ⃗ 1 u ⃗ 2 ] [ σ 1 0 0 σ 2 ] M V = U Σ M V V − 1 = U Σ V − 1 M = U Σ V T ( V 是正交矩阵,故 V − 1 = V T ) \begin{aligned} M \left[\begin{matrix} \vec{v}_1 & \vec{v}_2 \\ \end{matrix}\right] &= \left[\begin{matrix} \vec{u}_1 & \vec{u}_2 \\ \end{matrix}\right] \left[\begin{matrix} \sigma_1 & 0 \\ 0 & \sigma_2 \\ \end{matrix}\right] \\ MV &= U \Sigma \\ MVV^{-1} &= U \Sigma V^{-1} \\ M &= U \Sigma V^{\text{T}} \quad (V 是\text{正交矩阵,故} V^{-1} = V^\text{T}) \end{aligned} M[v 1v 2]MVMVV1M=[u 1u 2][σ100σ2]=UΣ=UΣV1=UΣVTV正交矩阵,故V1=VT

在这里插入图片描述


从图形变换上来看 SVD 分解,矩阵 M M M 等价于先经过旋转矩阵 V T V^\text{T} VT 进行旋转,再经过缩放矩阵 Σ \Sigma Σ 进行缩放,最后通过旋转矩阵 U U U 进行旋转,就达到了和 M M M 矩阵一样的线性变换效果。

在这里插入图片描述


4. SVD 推广到 m × n m \times n m×n 矩阵

上述奇异值分解例子中

M = U Σ V T \begin{aligned} M &= U \Sigma V^{\text{T}} \end{aligned} M=UΣVT

矩阵的维度分别为:
M M M 2 × 2 2 \times 2 2×2
U U U 2 × 2 2 \times 2 2×2
Σ \Sigma Σ 2 × 2 2 \times 2 2×2
V V V 2 × 2 2 \times 2 2×2

M M M 的矩阵维度为 m × n m \times n m×n,那么有
U U U m × m m \times m m×m
Σ \Sigma Σ m × n m \times n m×n
V V V n × n n \times n n×n

到这里也就与我们第一步所讲述的对应上了。


5. 求 SVD 分解

我们知道 SVD 分解的基本形式为

M = U Σ V T \begin{aligned} M &= U \Sigma V^{\text{T}} \end{aligned} M=UΣVT

那么
M T M = ( U Σ V T ) T U Σ V T M T M = V Σ T U T U Σ V T \begin{aligned} M^\text{T} M &= (U \Sigma V^{\text{T}})^\text{T} U \Sigma V^{\text{T}} \\ M^\text{T} M &= V \Sigma^\text{T} U^\text{T} U \Sigma V^{\text{T}} \end{aligned} MTMMTM=(UΣVT)TUΣVT=VΣTUTUΣVT

因为 U U U 是正交矩阵,所以有 U T U = I U^\text{T} U = I UTU=I,那么

M T M = V Σ T U T U Σ V T M T M = V Σ T I Σ V T M T M = V Σ T Σ V T \begin{aligned} M^\text{T} M &= V \Sigma^\text{T} U^\text{T} U \Sigma V^{\text{T}} \\ M^\text{T} M &= V \Sigma^\text{T} I \Sigma V^{\text{T}} \\ M^\text{T} M &= V \Sigma^\text{T} \Sigma V^{\text{T}} \end{aligned} MTMMTMMTM=VΣTUTUΣVT=VΣTIΣVT=VΣTΣVT

又因为 Σ \Sigma Σ 是对角矩阵,所以有 Σ T = Σ \Sigma^\text{T} = \Sigma ΣT=Σ,即

M T M = V Σ T Σ V T M T M = V Σ Σ V T \begin{aligned} M^\text{T} M &= V \Sigma^\text{T} \Sigma V^{\text{T}} \\ M^\text{T} M &= V \Sigma \Sigma V^{\text{T}} \end{aligned} MTMMTM=VΣTΣVT=VΣΣVT

L = Σ Σ L = \Sigma \Sigma L=ΣΣ,有

M T M = V Σ Σ V T M T M = V L V T \begin{aligned} M^\text{T} M &= V \Sigma \Sigma V^{\text{T}} \\ M^\text{T} M &= V L V^{\text{T}} \end{aligned} MTMMTM=VΣΣVT=VLVT

因为 V V V 也是正交矩阵,故可以进行如下移项

M T M = V L V T M T M V = V L V T V = V L V − 1 V M T M V = V L \begin{aligned} M^\text{T} M &= V L V^{\text{T}} \\ M^\text{T} M V &= V L V^{\text{T}} V = V L V^{-1} V \\ M^\text{T} M V &= V L \end{aligned} MTMMTMVMTMV=VLVT=VLVTV=VLV1V=VL


这里需要使用特征向量的定义,忘记的可以参考文章【数理知识】特征值、特征向量、左特征向量。

当我们想去求取 M T M M^\text{T} M MTM 的特征向量时,根据定义式有

M T M v ⃗ 1 = λ 1 v ⃗ 1 M T M v ⃗ 2 = λ 2 v ⃗ 2 \begin{aligned} M^\text{T} M \vec{v}_1 &= \lambda_1 \vec{v}_1 \\ M^\text{T} M \vec{v}_2 &= \lambda_2 \vec{v}_2 \end{aligned} MTMv 1MTMv 2=λ1v 1=λ2v 2

换种形式写一下有

M T M [ v ⃗ 1 v ⃗ 2 ] = [ v ⃗ 1 v ⃗ 2 ] [ λ 1 0 0 λ 2 ] \begin{aligned} M^\text{T} M \left[\begin{matrix} \vec{v}_1 & \vec{v}_2 \\ \end{matrix}\right] &= \left[\begin{matrix} \vec{v}_1 & \vec{v}_2 \\ \end{matrix}\right] \left[\begin{matrix} \lambda_1 & 0 \\ 0 & \lambda_2\\ \end{matrix}\right] \end{aligned} MTM[v 1v 2]=[v 1v 2][λ100λ2]


再看一下之前得到的结论

M T M V = V L \begin{aligned} M^\text{T} M V &= V L \end{aligned} MTMV=VL

所以 V V V M T M M^\text{T} M MTM 矩阵的特征向量, L L L 是其特征值。

L = Σ Σ L = \Sigma \Sigma L=ΣΣ 矩阵是对角线矩阵 Σ \Sigma Σ 的乘,即

L = Σ Σ = [ σ 1 0 0 σ 2 ] [ σ 1 0 0 σ 2 ] = [ σ 1 2 0 0 σ 2 2 ] = [ λ 1 0 0 λ 2 ] \begin{aligned} L &= \Sigma \Sigma = \left[\begin{matrix} \sigma_1 & 0 \\ 0 & \sigma_2 \\ \end{matrix}\right] \left[\begin{matrix} \sigma_1 & 0 \\ 0 & \sigma_2 \\ \end{matrix}\right] = \left[\begin{matrix} \sigma_1^2 & 0 \\ 0 & \sigma_2^2 \\ \end{matrix}\right] \\ &= \left[\begin{matrix} \lambda_1 & 0 \\ 0 & \lambda_2 \\ \end{matrix}\right] \end{aligned} L=ΣΣ=[σ100σ2][σ100σ2]=[σ1200σ22]=[λ100λ2]

同时 Σ \Sigma Σ 矩阵中的元素 σ 1 \sigma_1 σ1 我们称之为奇异值。

通过上式我们也知道为什么奇异值和特征值之间是一个平方的关系了。


同理,我们可以得到

M M T U = U L \begin{aligned} M M^\text{T} U &= U L \end{aligned} MMTU=UL

往下也是同样的结论,即 U U U M M T MM^\text{T} MMT 矩阵的特征向量。


总结下来,求解 SVD 的过程为

  1. M T M M^\text{T}M MTM 的特征向量得到 V V V
  2. M M T MM^\text{T} MMT 的特征向量得到 U U U
  3. M T M M^\text{T}M MTM M M T MM^\text{T} MMT 的特征值,开方得到奇异值,
  4. 用奇异值构成对角阵 Σ \Sigma Σ

在这里插入图片描述


Ref

  1. 如何通俗易懂地讲解什么是 PCA(主成分分析)? - 知乎
  2. 【机器学习】降维——PCA(非常详细) - 知乎
  3. 【学长小课堂】什么是奇异值分解SVD–SVD如何分解时空矩阵 - bilibili
  4. 如何通俗地理解奇异值? - 马同学

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

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

相关文章

学习电气工程的关键要点

基础知识:学习电路原理、电子器件、电机原理等基础知识。可以通过自学、培训或相关专业课程来学习。 编程技能:掌握一门编程语言,如C语言或MATLAB。电气工程常需要编程来设计和实现控制系统。 自动化控制理论:了解自动化控制系…

Python web实战之Django 的 RESTful API 设计详解

关键词: Python, Web 开发, Django, RESTful API 1 API的一些事儿 1.1 什么是API? API是应用程序编程接口(Application Programming Interface)的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和…

【LeetCode】数据结构题解(10)[有效的括号]

有效的括号 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 😘😘😘😘😘😘😘😘😘😘😘&#x1…

机器学习笔记:李宏毅ChatGPT Finetune VS Prompt

1 两种大语言模型:GPT VS BERT 2 对于大语言模型的两种不同期待 2.1 “专才” 2.1.1 成为专才的好处 Is ChatGPT A Good Translator? A Preliminary Study 2023 Arxiv 箭头方向指的是从哪个方向往哪个方向翻译 表格里面的数值越大表示翻译的越好 可以发现专门做翻…

vue3 table动态合并,自定义参数合并单元格

<template><div><el-table :data"tableData" :span-method"objectSpanMethod" border:header-cell-style"{ textAlign: center}"><el-table-column prop"area" label"区域" align"center"&g…

如何在页面中嵌入音频和视频?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 嵌入音频⭐ 嵌入视频⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

《合成孔径雷达成像算法与实现》Figure3.2

代码参数说明&#xff1a;Sf1为书中公式3.19&#xff0c;Sf2为时域信号快速傅里叶表达式&#xff0c;两种频谱表达式所做出的图可看出其区别 代码如下&#xff1a; clc clear all close all%参数设置 TBP 720; %时间带宽积 T 10e-6; %脉冲持续时间%参数计…

20.5 HTML 媒体

1. video视频标签 video视频标签: 是HTML中用于在网页上嵌入视频的元素.常用的视频标签属性: - src属性: 指定视频文件的URL地址. - controls属性: 用于显示视频播放控件(如播放按钮, 进度条等), 使用户能够控制视频的播放. - width和height: 指定视频的宽度和高度. - autopla…

ESP32 Max30102 (3)修复心率误差

1. 运行效果 2. 新建修复心率误差.py 代码如下: from machine import sleep, SoftI2C, Pin, Timer from utime import ticks_diff, ticks_us from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM from hrcalc import calc_hr_and_spo2BEATS = 0 # 存储心率 FINGER_F…

MATLAB详细安装教程(亲测有效!!)

1.复制以下链接&#xff0c;用百度网盘打开&#xff0c;下载 链接&#xff1a;https://pan.baidu.com/s/19AwQeCRYofGAV8sfDIm5PQ 提取码&#xff1a;mads 我是下载到D盘自己创建的文件中 2.下载完毕后打开此文件夹&#xff0c;点击最后一项 3.点击右上角高级选项&#xff0…

ESP32 Max30102 (2)检测 血氧、温度

1. 运行效果 thonny终端打印的信息如下 注意: 上述的心率值是有很大的误差的,会在下一节课解决这个问题2. 新模块hrcalc.py 在Micorpython端,新建文件hrcalc.py,内容如下 这个文件的作用,可以计算出 【血氧值】 # -*-coding:utf-8# 25 samples

基于身份的安全威胁正在迅速增长

根据端点安全和威胁情报供应商 CrowdStrike 发布的一份报告&#xff0c;目前最危险的网络安全威胁是能够访问给定系统合法身份信息的攻击者。 根据该报告&#xff0c;交互式入侵&#xff08;该公司将其定义为攻击者积极工作以在受害者系统上实现某种非法目的的入侵&#xff09;…

做接口测试如何上次文件

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

FOHEART H1数据手套:连接虚拟与现实,塑造智能交互新未来

在全新交互时代背景中&#xff0c;数据手套无疑是一种重要的科技产物。它不仅彻底改变了我们与虚拟世界的互动方式&#xff0c;更为我们提供了一种全新、更为直观的交互形式。 FOHEART H1数据手套结合了虚拟现实、手势识别等高新技术&#xff0c;用先进的传感技术和精准的数据…

DDR4信号仿完整性仿真

在硬件电路设计中&#xff0c;DDR一直是电路设计中的难点。目前正在进行DDR4的电路设计&#xff0c;将基本的仿真设计过程进行一下记录。 主流的仿真工具都是支持DDR4的仿真的&#xff0c;目前使用的主力工具为Sigrity及Hyperlynx&#xff0c;下面以Sigrity系统软件为例说明一…

微服务01-SpringCloud

1、简介 SpringCloud集成了各种微服务功能组件&#xff0c;并基于SpringBoot实现了这些组件的自动装配&#xff0c;从而提供了良好的开箱即用体验。 其中常见的组件包括&#xff1a; 2、服务拆分和远程调用 2.1 服务拆分 这里总结了微服务拆分时的几个原则&#xff1a; …

干货 | 详述 Elasticsearch 向量检索发展史

1. 引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象&#xff08;例如文本、图像或声音&#xff09;转换为数值向量&#xff0c;并在多维空间中进行相似性搜索&#xff0c;它能够实现高效的查询匹配和推荐。 图片来自&#xff1a;向量数据库技术鉴赏【上…

企业文件传输软件安全性分析与对比

随着科技的日新月异和应用领域的日益广泛&#xff0c;文件传输软件在人们生活和工作中发挥的作用越来越重大&#xff0c;因此出现了许多不同种类的文件传输软件。但是&#xff0c;随着网络安全问题的严峻&#xff0c;如何确保文件传输软件的安全性成为了一个亟待解决的问题。所…

编写简单的.gitlab-ci.yml打包部署项目

服务器说明&#xff1a; 192.168.192.120&#xff1a;项目服务器 192.168.192.121&#xff1a;GitLab 为了可以使用gitlab的cicd功能&#xff0c;我们需要先安装GitLab Runner 安装GitLab Runner参考&#xff1a; GitLab实现CICD自动化部署_gitlab cidi_程序员xiaoQ的博客-CS…

深入浅出对话系统——闲聊对话系统进阶

引言 本文主要关注生成式闲聊对话系统的进阶技术。 基于Transformer的对话生成模型 本节主要介绍GPT系列文章&#xff0c;这是由OpenAI团队推出的&#xff0c;现在大火的ChatGPT也是它们推出的。 GPT : Improving Language Understanding by Generative Pre-Traini ng 在自…