数学建模笔记—— 主成分分析(PCA)

news2024/12/22 19:44:46

数学建模笔记—— 主成分分析

  • 主成分分析
    • 1. 基本原理
      • 1.1 主成分分析方法
      • 1.2 数据降维
      • 1.3 主成分分析原理
      • 1.4 主成分分析思想
    • 2. PCA的计算步骤
    • 3. 典型例题
    • 4. 主成分分析说明
    • 5. python代码实现

主成分分析

1. 基本原理

在实际问题研究中,多变量问题是经常会遇到的。变量太多,无疑会增加分析问题的难度与复杂性,而且在许多实际问题中,多个变量之间是具有一定的相关关系的。因此,人们会很自然地想到,能否在相关分析的基础上,用较少的新变量代替原来较多的旧变量,而且使这些较少的新变量尽可能多地保留原来变量所反映的信息?

一个简单的例子:

例如,某人要做一件上衣要测量很多尺寸,如身长、袖长、胸围、腰围、肩宽、肩厚等十几项指标,但某服装厂要生产一批新型服装绝不可能把尺寸的型号分得过多?

我们可以把多种指标中综合成几个少数的综合指标,做为分类的型号,将十几项指标综合成3项指标,一项是反映长度的指标,一项是反映胖瘦的指标,一项是反映特殊体型的指标。

1.1 主成分分析方法

在分析研究多变量的课题时,变量太多就会增加课题的复杂性。人们自然希望变量个数较少而得到的信息较多。在很多情形,变量之间是有一定的相关关系的,可以解释为这两个变量反映此课题的信息有一定的重叠。主成分分析是对于原先提出的所有变量,将重复的变量(关系紧密的变量)删去多余,建立尽可能少的新变量,使得这些新变量是两两不相关的,且这些新变量在反映课题的信息方面尽可能保持原有的信息。设法将原来变量重新组合成一组新的互相无关的几个综合变量,同时根据实际需要从中可以取出几个较少的综合变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析或称主分量分析,也是数学上用来降维的一种方法。

1.2 数据降维

降维是将高维度的数据(指标太多)保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。

降维优点:

  1. 使得数据集更易使用
  2. 除噪声
  3. 降低算法的计算开销
  4. 使得结果容易理解

1.3 主成分分析原理

PCA的主要目标是将特征维度变小,同时尽量减少信息损失。就是对一个样本矩阵,**一是换特征,**找一组新的特征来重新标识;**二是减少特征,**新特征的数目要远小于原特征的数目。

通过PCA将n维原始特征映射到k维(k<n)上,称这k维特征为主成分。需要强调的是,不是简单地从n维特征中去除其余n-k维特征,而是重新构造出全新的k维正交特征,且新生成的k维数据尽可能多地包含原来n维数据的信息。例如,使用PCA将20个相关的特征转化为5个无关的新特征,并且尽可能保留原始数据集的信息。

怎么找到新的维度呢?实质是数据间的方差够大,通俗地说,就是能够使数据到了新的维度基变换下,坐标点足够分散,数据间各有区分。

如图所示的左图中有5个离散点,降低维度,就是需要把点映射成一条线。将其映射到右图中黑色虚线上则样本变化最大,且坐标点更分散,这
条黑色虚线就是第一主成分的投影方向。

image-20240829134429153

PCA是一种线性降维方法,即通过某个投影矩阵将高维空间中的原始样本点线性投影到低维空间,以达到降维的目的,线性投影就是通过矩阵变换的方式把数据映射到最合适的方向。

降维的几何意义可以理解为旋转坐标系,取前k个轴作为新特征。

对于下图所示的情况,我们发现这些数据都几乎排列在一条直线上,并且在x轴方向和y轴方向的方差都比较大。但是如果把坐标轴旋转一定角度,使得这些数据在某个坐标轴的投影的方差比较大,便可以用新坐标系下方差较大的一个坐标轴坐标作为主成分。对于左图,数据为(1,2)、(2,4)…旋转坐标轴后,坐标为 ( 5 , 0 ) 、 ( 2 5 , 1 ) … … (\sqrt5,0)、\begin{pmatrix}2\sqrt5,1\end{pmatrix}\ldots\ldots (5 ,0)(25 ,1)……这样主成分就是新坐标系下变量 x x x的数值 5 、 2 5 . . . . . . \sqrt{5}、2\sqrt{5}...... 5 25 ......

image-20240829135154880

对于大多数情况,数据各个变量基本服从正态分布,所以变量为2的数据散点分布大致为一个椭圆,变量为3的散点分布大致为一个椭球,p个变量的数据大致分布在一个超椭圆。而通过旋转坐标系,使得超椭圆的长轴落在一个坐标轴上,其次超椭圆另一个轴也尽量落在坐标轴上。这样各个新的坐标轴上的坐标值便是相应的主成分。

例如,对于图示的数据,在x轴和y轴的方差都很大,所以可以旋转坐标系,使得椭圆两个轴尽量落在坐标轴上。这样,我们便以散点在新坐标系下的x坐标作为第一主成分(因为x方向方差最大),y轴的坐标为第二主成分。

image-20240829135644616

主成分分析的理论推导较为复杂,需要借助投影寻踪,构造目标函数等方法来推导,在多元统计的相关书籍中都有详细讲解。但是其结论却是十分简洁。所以,如果只是需要实际应用,了解主成分分析的基本原理与实现方法便足够了。

降维的代数意义可以理解为:

m × n m\times n m×n阶的原始样本 X X X,与 n × k n\times k n×k阶矩阵 W W W做矩阵乘法运算 X × W X\times W X×W,即可得到 m × k m\times k m×k阶低维矩阵 Y Y Y,这里的 n × k n\times k n×k阶矩阵 W W W就是投影矩阵。

1.4 主成分分析思想

假设有 n n n个样本, p p p个指标,则可构成大小为 n × p n\times p n×p的样本矩阵 x : x: x:
x = [ x 11 x 12 ⋯ x 1 p x 21 x 22 ⋯ x 2 p ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x n p ] = ( x 1 , x 2 , ⋯   , x p ) x=\begin{bmatrix}x_{11}&x_{12}&\cdots&x_{1p}\\x_{21}&x_{22}&\cdots&x_{2p}\\\vdots&\vdots&\ddots&\vdots\\x_{n1}&x_{n2}&\cdots&x_{np}\end{bmatrix}=\begin{pmatrix}x_1,x_2,\cdots,x_p\end{pmatrix} x= x11x21xn1x12x22xn2x1px2pxnp =(x1,x2,,xp)
假设我们想找到新的一组变量 z 1 , z 2 , ⋅ ⋅ ⋅ , z m ( m ≤ p ) z_1,z_2,\cdotp\cdotp\cdotp,z_m(m\leq p) z1,z2,⋅⋅⋅,zm(mp),且它们满足:
{ z 1 = l 11 x 1 + l 12 x 2 + ⋯ + l 1 p x p z 2 = l 21 x 1 + l 22 x 2 + ⋯ + l 2 p x p ⋮ z m = l m 1 x 1 + l m 2 x 2 + ⋯ + l m p x p \begin{cases}z_1=l_{11}x_1+l_{12}x_2+\cdots+l_{1p}x_p\\z_2=l_{21}x_1+l_{22}x_2+\cdots+l_{2p}x_p\\\vdots\\z_m=l_{m1}x_1+l_{m2}x_2+\cdots+l_{mp}x_p\end{cases} z1=l11x1+l12x2++l1pxpz2=l21x1+l22x2++l2pxpzm=lm1x1+lm2x2++lmpxp
系数 l i j l_{ij} lij的确定原则:

  1. z i z_i zi z j ( i ≠ j ; i , j = 1 , 2 , , m ) z_j(i\neq j;i,j=1,2,,m) zj(i=j;i,j=1,2,,m)相互无关
  2. z 1 z_1 z1是与 x 1 , x 2 , . . . , x p x_1,x_2,...,x_p x1,x2,...,xp 的一切线性组合中方差最大者
  3. z 2 z_2 z2 z 1 z_1 z1不相关的 x 1 , x 2 , . . . , x p x_1,x_2,...,x_p x1,x2,...,xp 的一切线性组合中方差最大者
  4. 以此类推, z m z_m zm是与 z 1 , z 2 , . . . , z m − 1 z_1,z_2,...,z_{m-1} z1,z2,...,zm1不相关的 x 1 , x 2 , . . . , x p x_1,x_2,...,x_p x1,x2,...,xp 的所有线性组合中方差最大者
  5. 新变量指标 z 1 , z 2 , . . . , z m z_1,z_2,...,z_m z1,z2,...,zm分别称为原变量指标 x 1 , x 2 , . . . , x p x_1,x_2,...,x_p x1,x2,...,xp的第一,第二,…,第m主成分

2. PCA的计算步骤

假设有 n n n个样本, p p p个指标,则可构成大小为 n × p n\times p n×p的样本矩阵 x : x: x:
x = [ x 11 x 12 ⋯ x 1 p x 21 x 22 ⋯ x 2 p ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x n p ] = ( x 1 , x 2 , ⋯   , x p ) x=\begin{bmatrix}x_{11}&x_{12}&\cdots&x_{1p}\\x_{21}&x_{22}&\cdots&x_{2p}\\\vdots&\vdots&\ddots&\vdots\\x_{n1}&x_{n2}&\cdots&x_{np}\end{bmatrix}=\begin{pmatrix}x_1,x_2,\cdots,x_p\end{pmatrix} x= x11x21xn1x12x22xn2x1px2pxnp =(x1,x2,,xp)

  1. 首先对其进行标准化处理

    按列计算均值 x ‾ j = 1 n Σ i = 1 n x i j \overline x_j=\frac1n\Sigma_{i=1}^nx_{ij} xj=n1Σi=1nxij和标准差 S j = ∑ i = 1 n ( x i j − x j ‾ ) 2 n − 1 S_j= \sqrt {\frac {\sum _{i= 1}^n( x_{ij}- \overline {x_j}) ^2}{n- 1}} Sj=n1i=1n(xijxj)2 , 计算得标准化数据 X i j = x i j − x j ‾ s j X_{ij}=\frac{x_{ij}-\overline{x_j}}{s_j} Xij=sjxijxj
    原始样本矩阵经过标准化变为:
    X = [ X 11 X 12 ⋯ X 1 p X 21 X 22 ⋯ X 2 p ⋮ ⋮ ⋱ ⋮ X n 1 X n 2 ⋯ X n p ] = ( X 1 , X 2 , ⋯   , X p ) \begin{aligned}&X=\begin{bmatrix}X_{11}&X_{12}&\cdots&X_{1p}\\X_{21}&X_{22}&\cdots&X_{2p}\\\vdots&\vdots&\ddots&\vdots\\X_{n1}&X_{n2}&\cdots&X_{np}\end{bmatrix}=\begin{pmatrix}X_1,X_2,\cdots,X_p\end{pmatrix}\end{aligned} X= X11X21Xn1X12X22Xn2X1pX2pXnp =(X1,X2,,Xp)

  2. 计算标准化样本的协方差矩阵/样本相关系数矩阵
    R = [ r 11 r 12 ⋯ r 1 p r 21 r 22 ⋯ r 2 p ⋮ ⋮ ⋱ ⋮ r n 1 r n 2 ⋯ r n p ] 其中 r i j = 1 n − 1 ∑ k = 1 n ( X k i − X i ‾ ) ( X k j − X j ‾ ) \begin{aligned}&R=\begin{bmatrix}r_{11}&r_{12}&\cdots&r_{1p}\\r_{21}&r_{22}&\cdots&r_{2p}\\\vdots&\vdots&\ddots&\vdots\\r_{n1}&r_{n2}&\cdots&r_{np}\end{bmatrix}\\&\text{其中}\quad r_{ij}=\frac{1}{n-1}\sum_{k=1}^{n}\Big(X_{ki}-\overline{X_{i}}\Big)\Big(X_{kj}-\overline{X_{j}}\Big)\end{aligned} R= r11r21rn1r12r22rn2r1pr2prnp 其中rij=n11k=1n(XkiXi)(XkjXj)

  3. 计算 R R R的特征值和特征向量
    特征值: λ 1 ≥ λ 2 ≥ . . . ≥ λ p ≥ 0 特征向量: a 1 = [ a 11 a 21 ⋮ a p 1 ] , a 2 = [ a 12 a 22 ⋮ a p 2 ] , ⋯   , a p = [ a 1 p a 2 p ⋮ a p p ] \begin{aligned}&\text{特征值:}\quad\lambda_1\geq\lambda_2\geq...\geq\lambda_p\geq0\\&\text{特征向量:}\quad a_1=\begin{bmatrix}a_{11}\\a_{21}\\\vdots\\a_{p1}\end{bmatrix},a_2=\begin{bmatrix}a_{12}\\a_{22}\\\vdots\\a_{p2}\end{bmatrix},\cdots, a_p=\begin{bmatrix}a_{1p}\\a_{2p}\\\vdots\\a_{pp}\end{bmatrix}\end{aligned} 特征值:λ1λ2...λp0特征向量:a1= a11a21ap1 ,a2= a12a22ap2 ,,ap= a1pa2papp

  4. 计算主成分贡献率以及累计贡献率
    贡献率 α i λ i ∑ k = 1 p λ k ( i = 1 , 2 , . . . , p ) 累计贡献率 ∑ G ∑ k − 1 i λ k ∑ k = 1 p λ k ( i = 1 , 2 , . . . , p ) \text{贡献率}\alpha_i\frac{\lambda_i}{\sum_{k=1}^p\lambda_k}(i=1,2,...,p)\quad\text{累计贡献率}\sum G\frac{\sum_{k-1}^i\lambda_k}{\sum_{k=1}^p\lambda_k}(i=1,2,...,p) 贡献率αik=1pλkλi(i=1,2,...,p)累计贡献率Gk=1pλkk1iλk(i=1,2,...,p)

  5. 写出主成分

    一般取累计贡献率超过80%的特征值所对应的第一、第二、…第 m ( m ≤ p ) m(m\le p) m(mp)个主成分。第 i i i个主成分:
    F i = a 1 i X 1 + a 2 i X 2 + . . . + a p i X p ( i = 1 , 2 , . . . , m ) F_{i}=a_{1i}X_{1}+a_{2i}X_{2}+...+a_{pi}X_{p} (i=1 ,2 ,... ,m) Fi=a1iX1+a2iX2+...+apiXp(i=1,2,...,m)

  6. 根据系数分析主成分代表的意义

    对于某个主成分而言,指标前面的系数越大,代表该指标对于该主成分的影响越大。

  7. 利用主成分的结果进行后续的分析

    • 主成分得分
    • 聚类分析
    • 回归分析

3. 典型例题

在制定服装标准的过程中,对128名成年男子的身材进行了测量,每人测得的指标中含有这样的六项:身高 ( x 1 ) (x_1) (x1)、坐高 ( x 2 ) (x_2) (x2)、胸围 ( x 3 ) (x_3) (x3)、手臂长 ( x 4 ) (x_4) (x4)、肋围 ( x 5 ) (x_5) (x5)、腰围 ( x 6 ) (x_6) (x6)。所得样本相关系数矩阵(对称矩阵)如下表:

x 1 x_{1} x1 x 2 x_{2} x2 x 3 x_{3} x3 x 4 x_{4} x4 x 5 x_{5} x5 x 6 x_{6} x6
x 1 x_1 x110.790.360.760.250.51
x 2 x_2 x20.7910.310.550.170.35
x 3 x_3 x30.360.3110.350.640.58
x 4 x_4 x40.760.550.3510.160.38
x 5 x_5 x50.250.170.640.1610.63
x 6 x_6 x60.510.350.580.380.631

注意:本题给我们的数据直接就是样本相关系数矩阵,一般来说,大家自己建模的时候,得到的是原始数据。

经过计算,相关系数矩阵的特征值、相应的特征向量以及贡献率列于下表:

特征向量 a 1 a_{1} a1 a 2 a_{2} a2 a 3 a_{3} a3 a 4 a_4 a4 a 5 a_5 a5 a 6 a_{6} a6
x 1 : x_1: x1: 身高0.469-0.3650.092-0.122-0.080-0.786
x 2 : x_2: x2: 坐高0.404-0.3970.6130.3260.0270.443
x 3 : x_3: x3: 胸围0.3940.397-0.2790.6560.405-0.125
x 4 : x_4: x4: 手臂长0.408-0.365-0.705-0.108-0.2350.371
x 5 : x_5: x5: 肋围0.3370.5690.164-0.019-0.7310.034
x 6 : x_6: x6: 腰围0.4270.3080.119-0.6610.4900.179
特征值3.2871.4060.4590.4260.2950.126
贡献率0.5480.2340.0770.0710.0490.021
累计贡献率0.5480.7820.8590.9300.9791.000

从表中可以看到前三个主成分的累计贡献率达85.9%,因此可以考虑只取三个主成分,他们能够很好地概括原始变量。

写出主成分并分析解释含义
F 1 = 0.469 X 1 + 0.404 X 2 + 0.394 X 3 + 0.408 X 4 + 0.339 X 5 + 0.427 X 6 F 2 = − 0.365 X 1   −   0.397 X 2 + 0.397   X 3   −   0.365 X 4 + 0.569 X 5 + 0.308 X 6 F 3 = 0.092 X 1   + 0.613 X 2   − 0.279 X 3   − 0.705 X 4   + 0.164 X 5   + 0.119 X 6 X i 均是标准化后的指标, x i : 身高、坐高、胸围、手臂长、肋围和腰围 F_{1}=0.469X_{1}+0.404X_{2}+0.394X_{3}+0.408X_{4}+0.339X_{5}+0.427X_{6}\\F_{2}=-0.365X_{1}\:-\:0.397X_{2}+0.397\:X_{3}\:-\:0.365X_{4}+0.569X_{5}+0.308X_{6}\\F_{3}=0.092X_{1}\:+0.613X_{2}\:-0.279X_{3}\:-0.705X_{4}\:+0.164X_{5}\:+0.119X_{6}\\ X_i均是标准化后的指标,x_i:身高、坐高、胸围、手臂长、肋围和腰围 F1=0.469X1+0.404X2+0.394X3+0.408X4+0.339X5+0.427X6F2=0.365X10.397X2+0.397X30.365X4+0.569X5+0.308X6F3=0.092X1+0.613X20.279X30.705X4+0.164X5+0.119X6Xi均是标准化后的指标,xi:身高、坐高、胸围、手臂长、肋围和腰围

  • 第一主成分 F 1 F_{1} F1对所有(标准化)原始变量都有近似相等的正载荷,故称第一主成分为**(身材)大小成分**
  • 第二主成分 F 2 F_2 F2 X 3 , X 5 , X 6 X_3,X_5,X_6 X3,X5,X6上有中等程度的正载荷,而在 X 1 , X 2 , X 4 X_1,X_2,X_4 X1,X2,X4上有中等程度的负载荷,称第二主成分为形状成分(或胖瘦成分)
  • 第三主成分 F 3 F_3 F3 X 2 X_2 X2上有大的正载荷,在 X 4 X_4 X4上有大的负载荷,而在其余变量上的载荷都较小,可称为第三主成分为臂长成分
  • 当然,由于第三主成分贡献率不算高,实际意义也不太重要,因此我们可以考虑只取前两个。

4. 主成分分析说明

在主成分分析中,我们首先应保证所提取的前几个主成分的累计贡献率达到一个较高的水平,其次对这些被提取的主成分必须都能够给出符合实际背景和意义的解释。

主成分的解释其含义一般多少带有点模糊性,不像原始变量的含义那么清楚、确切,这是变量降维过程中不得不付出的代价。因此,提取的主成分个数m通常应明显小于原始变量个数p(除非p本身较小),否则维数降低的“利”可能抵不过主成分含义不如原始变量清楚的“弊”。

如果原始变量之间具有较高的相关性,则前面少数几个主成分的累计贡献率通常就能达到一个较高水平,也就是说,此时的累计贡献率通常较易得到满足。主成分分析的困难之处主要在于要能够给出主成分的较好解释,所提取的主成分中如有一个主成分解释不了,整个主成分分析也就失败了。主成分分析是变量降维的一种重要、常用的方法,简单的说,该方法要应用得成功,一是靠原
始变量的合理选取,二是靠“运气”。

– 参考教材:《应用多元统计分析》王学民

5. python代码实现

数据data.csv内容如下:

年份,单产,种子费,化肥费,农药费,机械费,灌溉费
1990,1017.0,106.05,495.15,305.1,45.9,56.1
1991,1036.5,113.55,561.45,343.8,68.55,93.3
1992,792.0,104.55,584.85,414.0,73.2,104.55
1993,861.0,132.75,658.35,453.75,82.95,107.55
1994,901.5,174.3,904.05,625.05,114.0,152.1
1995,922.5,230.4,1248.75,834.45,143.85,176.4
1996,916.5,238.2,1361.55,720.75,165.15,194.25
1997,976.5,260.1,1337.4,727.65,201.9,291.75
1998,1024.5,270.6,1195.8,775.5,220.5,271.35
1999,1003.5,286.2,1171.8,610.95,195.0,284.55
2000,1069.5,282.9,1151.55,599.85,190.65,277.35
2001,1168.5,317.85,1105.8,553.8,211.05,290.1
2002,1228.5,319.65,1213.05,513.75,231.6,324.15
2003,1023.0,368.4,1274.1,567.45,239.85,331.8
2004,1144.5,466.2,1527.9,487.35,408.0,336.15
2005,1122.0,449.85,1703.25,555.15,402.3,358.8
2006,1276.5,537.0,1888.5,637.2,480.75,428.4
2007,1233.0,565.5,2009.85,715.65,562.05,456.9

源码如下:

import pandas as pd
import numpy as np

# 在python中导入scipy库的linalg模块
# scipy是python中的一个科学计算库,linalg模块包含了线性代数的函数
from scipy import linalg

# 读取csv文件的后五行
df = pd.read_csv('data.csv', usecols=[2, 3, 4, 5, 6])
# print(df)

# df.to_numpy()是pandas对象中的一个方法,用于将DataFrame转换为NumPy数组
x = df.to_numpy()
# print(x)

# 标准化数据
X = (x-np.mean(x, axis=0))/np.std(x, ddof=1, axis=0)

# 计算协方差矩阵
R = np.cov(X.T)

# 计算特征值和特征向量
eigvals, eigvecs = linalg.eigh(R)
# 将特征值数组按降序排列
eigvals = eigvals[::-1]
# 将特征向量数组按降序排列
eigvecs = eigvecs[:, ::-1]

# 计算主成分贡献率和累积贡献率
contribution_rate = eigvals/sum(eigvals)
# np.cumsum()是numpy中的一个函数,用于计算数组的累积和
cumulative_contribution_rate = np.cumsum(contribution_rate)

# 打印结果
print("特征值为:")
print(eigvals)
print("贡献率为:")
print(contribution_rate)
print("累积贡献率为:")
print(cumulative_contribution_rate)
print("与特征值对应的特征向量为:")
print(eigvecs)

输出结果:

特征值为:
[4.09453559 0.79266524 0.08165257 0.02069963 0.01044696]
贡献率为:
[0.81890712 0.15853305 0.01633051 0.00413993 0.00208939]
累积贡献率为:
[0.81890712 0.97744017 0.99377068 0.99791061 1.        ]
与特征值对应的特征向量为:
[[-0.48104689  0.23837363 -0.01782683 -0.0038534   0.84346859]
 [-0.48753322 -0.07920883 -0.33594594 -0.7565078  -0.26622096]
 [-0.28138862 -0.92242424 -0.00452323  0.24430868  0.10122639]
 [-0.47315152  0.26834026 -0.46128305  0.60577733 -0.35266544]
 [-0.47733984  0.11845256  0.82098722  0.03206562 -0.28821424]]

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

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

相关文章

通信工程学习:什么是PSK相移键控、2PSK/BPSK二进制相移键控

PSK相移键控、2PSK/BPSK二进制相移键控 PSK&#xff08;相移键控&#xff09;和2PSK/BPSK&#xff08;二进制相移键控&#xff09;是两种在通信系统中广泛使用的调制技术。以下是对它们的详细解释&#xff1a; 一、PSK&#xff1a;相移键控 1、PSK相移键控的定义&#xff1a;…

websocket client无法连接到websocket server 的问题

1. 问题描述 生产环境的websocket client和server无法通信 2. 日志现象 通过查看日志和问题复现&#xff0c;定位到是client连接到server失败&#xff0c;导致无法通信。 出现问题的代码 出现问题的日志 21:25:27.790 [main] INFO websocket.MyWebSocketClient - start to…

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目&#xff1a; 分析 我们首先使用哈希表来统计数字出现的频率&#xff0c;然后我们使用一个桶排序。我们首先定义一个长度为n1的数组&#xff0c;对于下图这个示例就是长度为7的数组。为什么需要一个长…

Redis进阶(七):分布式锁

在分布式系统下&#xff0c;涉及到多个节点访问同一个公共资源的情况&#xff0c;此时需要通过 锁 进行互斥控制&#xff1a;避免出现 线程安全问题。 1.分布式锁的基本实现 超卖问题&#xff1a; 解决: 采用redis实现分布式锁 可用采取&#xff1a;在购票的时候&#xff0…

C语言 | Leetcode C语言题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step step << 1;}return …

【机器学习】和【人工智能】在量子力学的应用及代码案例分析

知孤云出岫 这里写目录标题 一、机器学习和人工智能在量子力学中的应用概述二、量子态的表示与模拟2.1 变分自编码器&#xff08;VAE&#xff09;用于量子态模拟 三、量子系统的哈密顿量学习3.1 使用机器学习推断哈密顿量 四、量子计算中的算法优化4.1 变分量子算法&#xff08…

AI大模型日报#0908:OpenAI计划年底推出GPT Next、Roblox官宣AI秒生3D物体模型

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

如果文件从存储卡中被误删除,存储卡数据恢复如何恢复?

如果文件被误从存储卡中删除&#xff0c;如何从Android 手机、相机或其他数码设备&#xff08; SD/CF/MicroSD/xD ...&#xff09;恢复照片视频&#xff1b;存储卡已格式化&#xff0c;原始 0 字节&#xff0c;空白&#xff1b;存储卡要求格式化&#xff1b;存储卡未显示、无法…

基于ONNX-YOLOv10-Object-Detection项目实现yolov10模型onnx-python推理

项目地址&#xff1a;https://github.com/ibaiGorordo/ONNX-YOLOv10-Object-Detection 项目依赖&#xff1a;onnxruntime-gpu、opencv-python、imread-from-url、cap-from-youtube、ultralytics 1、代码修改 代码改动说明&#xff1a;yolov10/yolov10.py中的第18行修改为以下…

Docker部署tenine实现后端应用的高可用与负载均衡

采用Docker方式的Tengine 和 keepalived 组合模式可以实现小应用场景的高可用负载均衡需求 目录 网络架构一、环境准备二、软件安装1. 下载Tenine镜像2. 下载Keepalived镜像3. 制作SpringBoot镜像 三、软件配置1. 创建应用容器2. 代理访问应用3. 创建Keepalived4. 测试高可用 网…

基于YOLOv5的积水检测模型训练:从数据到模型的全面解析

之前给大家带来了Yololov5Pyqt5Opencv 实时城市积水报警系统&#xff0c; 详见&#xff1a; Yololov5Pyqt5Opencv 实时城市积水报警系统_yolo opencv pyqt5-CSDN博客 今天详细解析一下积水检测模型训练部分的内容 在积水检测项目中&#xff0c;实时性和准确性是至关重要的。…

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介 1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 &#xff08;OTA&#xff09; 3在线编程&#xff08;ICP把整个程序都更新掉&#xff09; 1 系统的Bootloader写死了&#xff0c;只能用串口下载到指定的位置&a…

Spring Boot事务管理

事务管理 事务进阶 如果在删除了部门之后&#xff0c;出现了异常。那么就会出现部门被删除之后其中的员工并未被删除。 Transactional注解&#xff0c;在事务执行完成之后自动提交或者回滚。只需要在执行多次数据修改的事务上加上该注解即可。&#xff08;比如两次Update或者…

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建 首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件…

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…

11.5.软件系统分析与设计-面向对象的程序设计与实现

面向对象的程序设计与实现 设计模式 Java代码 C代码

Android13_SystemUI下拉框新增音量控制条

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Android13_SystemUI下拉框新增音量控制条 一、必备知识二、源码分析对比1.brightness模块分析对比2.statusbar/phone 对应模块对比对比初始化类声明对比构造方法 三、源码修改…

操作系统week1

操作系统学习 一.操作系统概述 1.概念、功能 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff0c;以提供给用户和其他软件方便的接口和环境 #mermaid-svg-SpFSwhrPg2GwVnYt {font-family:"trebuch…

【Python 千题 —— 算法篇】数字反转

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 整数反转是一个经典的算法问题&#xff0c;常见于各种编程竞赛和技术面试中。它要求我们将给定的整数按位进行翻转&#xff0c;并返…

c++ string类的模拟实现的注意事项

一.构造函数 第一种形式&#xff0c;使用字符指针赋值 为了防止修改&#xff0c;我们传入了常量字符串。但是这里的初始化列表出错了&#xff0c;因为_str是一个变量&#xff0c;将常量给到一个变量涉及到权限的放大&#xff0c;是错误的。那该怎么写呢&#xff1f;对_str的赋…