主成分分析(principal component analysis, PCA)公式

2023-11-05

主成分分析(principal component analysis, PCA)公式

主成分分析

摘要

主成分分析作为一种常见的数据降维(dimension reduction)的方法,在数据科学的许多领域(比如图像压缩,时间序列预测等)都有广泛的应用。本文将简要介绍主成分分析的概念及相关公式。

什么是主成分

要对一组数据进行主成分分析(principal component analysis, PCA),我们首先要理解什么是主成分。概括地说,主成分是一个向量,这个向量在较低维度上概括了原来的较高维度数据的分布。假设我们的原始数据(红色的点)如下图中红色的点所示。

PCA示例
我们看到,每一个红色的点都有两个坐标,我们记为 ( x ,   y ) (x, \, y) (x,y)。但是我们发现红色点的分布可以用蓝色的直线来近似。如果对于每一个红色的点 ( x i ,   y i ) (x_i, \, y_i) (xi,yi),我们由 ( x i ,   y i ) (x_i, \, y_i) (xi,yi) 向蓝色的线做垂线(即做投影),那么我们将在蓝色的线上得到一个与 ( x i ,   y i ) (x_i, \, y_i) (xi,yi) 对应的点。如果我们在蓝色的线上规定一个原点,那么这个点在蓝色的线上对应的坐标就是一个实数,记为 z i z_i zi。于是,对于每一个红色的点 ( x i ,   y i ) (x_i, \, y_i) (xi,yi),我们有一个对应的点 z i z_i zi。这样,我们就把一个二维的数据转化为用一维数据来表示。这条蓝色的直线所代表的方向就是红色点集合的第一主成分。

对于三维的数据,类似的,我们同样可以根据数据点的分布找到能代表数据的主成分方向,如图2所示。图中蓝色的点代表原始的三维数据,而橙色的平面表示原始数据第一主成分与第二主成分所构成的平面。那么,我们将原始的数据向这个平面投影,每个三维的数据点 ( x i ,   y i ,   z i ) (x_i, \, y_i, \, z_i) (xi,yi,zi) 就会映射成一个二维的点 ( w 1 i ,   w 2 i ) (w_{1i}, \, w_{2i}) (w1i,w2i)

通过上面两个例子,我们看到主成分分析可以帮助我们将原始的高维数据用低维的数据来表示,从而实现数据降维(dimension reduction)的目的。这在数据维度非常多的情况下,可以大大减少数据维度与存储空间。

3维PCA示例

对于二维和三维的情况,我们尚且能通过画图看出数据的大致分布。但是对于 p p p ( p ≥ 3 ) (p \geq 3) (p3) 的数据,我们不能将数据绘制出来。这时候怎么办呢?这正是我们须要用主成分分析(principal component analysis, PCA)的地方。PCA 可以帮助我们将高维的数据转化成低维的表示。

当然,在这个过程中,我们只是用低维数据去近似表示原来的高维数据。也就是说,我们筛选出了原来高维数据中信息含量最大的那些维度。

求解 PCA 的公式

怎么去求PCA中的主成分方向(或是主成分向量)呢?我们先将问题用数学化的语言来描述。假设我们有 n n n 个数据,数据的维度是 p p p。这 n n n 个数据所组成的矩阵记为 X X X X X X 是一个 n × p n \times p n×p 的矩阵。 X X X 的每一行代表一个数据。我们可以将矩阵 X X X 写成
X = ( X 1 ,   X 2 ,   ⋯   ,   X p ) \displaystyle X = (X_1, \, X_2, \, \cdots, \, X_p) X=(X1,X2,,Xp)

这里的 X j ,   1 ≤ j ≤ p X_j, \, 1 \leq j \leq p Xj,1jp 是一个 n × 1 n \times 1 n×1 的列向量,表示第 i i i 个 feature 在每一个数据点的值。为了方便起见,我们假设每一个 feature 在 n n n 个数据点测得的值的均值为0。于是 ∑ i = 1 n x i j = 0 , ∀ j = 1 ,   2 ,   ⋯   ,   p \displaystyle \sum_{i = 1}^n x_{ij} = 0, \forall j = 1, \, 2, \, \cdots, \, p i=1nxij=0,j=1,2,,p。那么,我们所要求的第一主值向量 ϕ 1 = ( ϕ 11 , ϕ 21 , ⋯   ,   ϕ p 1 ) T \phi_1 = (\phi_{11}, \phi_{21}, \cdots, \, \phi_{p1})^T ϕ1=(ϕ11,ϕ21,,ϕp1)T 是使得线性映射
Z 1 = ϕ 11 X 1 + ϕ 21 X 2 + ⋯ + ϕ p 1 X p Z_1 = \phi_{11} X_1 + \phi_{21} X_2 + \cdots + \phi_{p1} X_p Z1=ϕ11X1+ϕ21X2++ϕp1Xp方差最大的那个向量 [1]。 注意,这里我们须要加一个限制条件,就是 ∑ i = 1 p ϕ i 1 2 = 1 \displaystyle \sum_{i = 1}^p \phi_{i1}^2 = 1 i=1pϕi12=1。否则,只要我们增大 ϕ i 1 \phi_{i1} ϕi1 Z 1 Z_1 Z1 的方差就可以变得无限大。

因为每个 X j X_j Xj 均为 n × 1 n \times 1 n×1 的向量,这里得到的 Z 1 Z_1 Z1 也将是一个 n × 1 n \times 1 n×1 的向量。我们记
Z 1 = ( z 11 z 21 ⋮ z n 1 ) Z_1 = \begin{pmatrix} z_{11} \\ z_{21} \\ \vdots \\ z_{n1} \\ \end{pmatrix} Z1= z11z21zn1
这里 z i 1 z_{i1} zi1 Z 1 Z_1 Z1 的第 i i i 个分量 ( i = 1 , 2 , ⋯   ,   n i = 1, 2, \cdots, \, n i=1,2,,n),
z i 1 = ϕ 11 x i 1 + ϕ 21 x i 2 + ⋯ + ϕ p 1 x i p z_{i1} = \phi_{11} x_{i1} + \phi_{21} x_{i2} + \cdots + \phi_{p1} x_{ip} zi1=ϕ11xi1+ϕ21xi2++ϕp1xip

事实上,我们可以将 Z 1 = ϕ 11 X 1 + ϕ 21 X 2 + ⋯ + ϕ p 1 X p Z_1 = \phi_{11} X_1 + \phi_{21} X_2 + \cdots + \phi_{p1} X_p Z1=ϕ11X1+ϕ21X2++ϕp1Xp 写成矩阵的形式: Z 1 = ϕ 11 X 1 + ϕ 21 X 2 + ⋯ + ϕ p 1 X p = X ϕ 1 Z_1 = \phi_{11} X_1 + \phi_{21} X_2 + \cdots + \phi_{p1} X_p = X \phi_1 Z1=ϕ11X1+ϕ21X2++ϕp1Xp=Xϕ1

那么, Z 1 Z_1 Z1 的样本方差就为 1 n ∑ i = 1 n ( Z i 1 − E ( Z 1 ) ) 2 \frac{1}{n} \sum_{i = 1}^n (Z_{i1} - \mathbb{E}(Z_1))^2 n1i=1n(Zi1E(Z1))2 E ( Z 1 ) \mathbb{E}(Z_1) E(Z1) 是样本平均数。

要使得 Z 1 Z_1 Z1 的方差最大,我们须要找到 ( ϕ 11 , ϕ 21 , ⋯   ,   ϕ p 1 ) (\phi_{11}, \phi_{21}, \cdots, \, \phi_{p1}) (ϕ11,ϕ21,,ϕp1),使得 1 n ∑ i = 1 n ( Z i 1 − E ( Z 1 ) ) 2 \frac{1}{n} \sum_{i = 1}^n (Z_{i1} - \mathbb{E}(Z_1))^2 n1i=1n(Zi1E(Z1))2 最大。这样求解第一主成分的问题就转化成了最大化某个函数值的过程。我们注意到,
E ( Z 1 ) = 1 n ∑ i = 1 n z i 1 = 1 n ∑ i = 1 n ( ϕ 11 x i 1 + ϕ 21 x i 2 + ⋯ + ϕ p 1 x i p ) = 1 n ∑ i = 1 n ∑ j = 1 p ϕ j 1 x i j = 1 n ∑ j = 1 p ϕ j 1 ∑ i = 1 n x i j \begin{aligned} \displaystyle \mathbb{E}(Z_1) &= \frac{1}{n} \sum_{i = 1}^n z_{i1} \\ &= \frac{1}{n} \sum_{i = 1}^n ( \phi_{11} x_{i1} + \phi_{21} x_{i2} + \cdots + \phi_{p1} x_{ip}) \\ &= \frac{1}{n} \sum_{i = 1}^n \sum_{j = 1}^p \phi_{j1} x_{ij} \\ &= \frac{1}{n} \sum_{j = 1}^p \phi_{j1} \sum_{i = 1}^n x_{ij} \end{aligned} E(Z1)=n1i=1nzi1=n1i=1n(ϕ11xi1+ϕ21xi2++ϕp1xip)=n1i=1nj=1pϕj1xij=n1j=1pϕj1i=1nxij
但是根据上面我们的约定,每一个 feature 在 n n n 个数据点测得的值的均值为0。于是 ∑ i = 1 n x i j = 0 , ∀ j = 1 ,   2 ,   ⋯   ,   p \displaystyle \sum_{i = 1}^n x_{ij} = 0, \forall j = 1, \, 2, \, \cdots, \, p i=1nxij=0,j=1,2,,p。我们就有 E ( Z 1 ) = 0 \displaystyle \mathbb{E}(Z_1) =0 E(Z1)=0。我们的最大化问题随之变成了:
maximize ϕ 11 ,   ϕ 21 ,   ⋯   , ϕ p 1 1 n ∑ i = 1 n ( ∑ j = 1 p ϕ j 1 x i j ) 2 \underset{\phi_{11},\, \phi_{21}, \, \cdots, \phi_{p1}}{\text{maximize}} \frac{1}{n} \sum_{i = 1}^n \left(\sum_{j = 1}^p \phi_{j1} x_{ij} \right)^2 ϕ11,ϕ21,,ϕp1maximizen1i=1n(j=1pϕj1xij)2

可以证明,这个最大化问题的解就是矩阵 1 n X T X \displaystyle \frac{1}{n} X^T X n1XTX 最大的那个特征值所对应的特征向量。我们称矩阵 1 n X T X \displaystyle \frac{1}{n} X^T X n1XTX 是 样本矩阵 X X X 的协方差矩阵。这个协方差矩阵是半正定的 (positive semidefinite)。所以它的特征值均是非负的。

数学证明

为什么矩阵 1 n X T X \displaystyle \frac{1}{n} X^T X n1XTX 最大的那个特征值所对应的特征向量就是第一主成分向量(即 ϕ 1 \phi_1 ϕ1)呢?这一部分我们将从数学上给出证明。
我们首先看要求的优化问题:
maximize ϕ 11 ,   ϕ 21 ,   ⋯   , ϕ p 1 1 n ∑ i = 1 n ( ∑ j = 1 p ϕ j 1 x i j ) 2 \underset{\phi_{11},\, \phi_{21}, \, \cdots, \phi_{p1}}{\text{maximize}} \frac{1}{n} \sum_{i = 1}^n \left(\sum_{j = 1}^p \phi_{j1} x_{ij} \right)^2 ϕ11,ϕ21,,ϕp1maximizen1i=1n(j=1pϕj1xij)2
我们可以将 1 n ∑ i = 1 n ( ∑ j = 1 p ϕ j 1 x i j ) 2 \displaystyle \frac{1}{n} \sum_{i = 1}^n \left(\sum_{j = 1}^p \phi_{j1} x_{ij} \right)^2 n1i=1n(j=1pϕj1xij)2 写成一个矩阵的形式。

1 n ∑ i = 1 n ( ∑ j = 1 p ϕ j 1 x i j ) 2 = 1 n ∣ ∣ X ϕ 1 ∣ ∣ 2 \displaystyle \frac{1}{n} \sum_{i = 1}^n \left(\sum_{j = 1}^p \phi_{j1} x_{ij} \right)^2 = \frac{1}{n} || X \phi_1 || ^2 n1i=1n(j=1pϕj1xij)2=n1∣∣Xϕ12。回忆 X X X n × p n \times p n×p 的矩阵, ϕ 1 \phi_1 ϕ1 p × 1 p \times 1 p×1 的列向量。而 ∣ ∣ X ϕ 1 ∣ ∣ 2 \displaystyle || X \phi_1 || ^2 ∣∣Xϕ12 又可以写成 ϕ 1 T X T X ϕ 1 \phi_1^T X^T X \phi_1 ϕ1TXTXϕ1。所以我们的优化问题就转化成了:
maximize ϕ 11 ,   ϕ 21 ,   ⋯   , ϕ p 1 1 n ϕ 1 T X T X ϕ 1 = maximize ϕ 11 ,   ϕ 21 ,   ⋯   , ϕ p 1 ϕ 1 T ( 1 n X T X ) ϕ 1 \underset{\phi_{11},\, \phi_{21}, \, \cdots, \phi_{p1}}{\text{maximize}} \frac{1}{n} \phi_1^T X^T X \phi_1 = \underset{\phi_{11},\, \phi_{21}, \, \cdots, \phi_{p1}}{\text{maximize}} \phi_1^T \left( \frac{1}{n} X^T X \right) \phi_1 ϕ11,ϕ21,,ϕp1maximizen1ϕ1TXTXϕ1=ϕ11,ϕ21,,ϕp1maximizeϕ1T(n1XTX)ϕ1

为了证明使得 ϕ 1 T ( 1 n X T X ) ϕ 1 \phi_1^T \left( \frac{1}{n} X^T X \right) \phi_1 ϕ1T(n1XTX)ϕ1 最大化的 ϕ 1 \phi_1 ϕ1 就是 1 n X T X \frac{1}{n} X^T X n1XTX 最大的特征值对应的特征向量,我们先证明下面的引理。

Lema
如果 A ∈ R p × p A \in \mathbb{R}^{p \times p} ARp×p 是一个对称的positive semidefinite 的矩阵。 A A A 的 特征值为 λ 1 > λ 2 ⋯ > λ p \lambda_1 > \lambda_2 \cdots > \lambda_p λ1>λ2>λp,对应的特征向量为 ϕ 1 ,   ϕ 2 , ⋯   , ϕ p \phi_1, \, \phi_2, \cdots, \phi_p ϕ1,ϕ2,,ϕp。那么 ϕ 1 \phi_1 ϕ1 就是下面优化问题的解。
max ⁡ x ∈ R p , ∣ ∣ x ∣ ∣ 2 = 1 x T A x \max\limits_{x \in \mathbb{R}^p, ||x||^2 = 1} x^T A x xRp,∣∣x2=1maxxTAx

简要证明:
因为 A ∈ R p × p A \in \mathbb{R}^{p \times p} ARp×p 是一个对称的positive semidefinite 的矩阵,我们可以将 A A A 分解为 A = Φ D Φ T A = \Phi D \Phi^T A=ΦDΦT。其中 Φ \Phi Φ A A A 的特征向量组成的矩阵。即 Φ = ( ϕ 1 ,   ϕ 2 , ⋯   , ϕ p ) \Phi = (\phi_1, \, \phi_2, \cdots, \phi_p) Φ=(ϕ1,ϕ2,,ϕp) A ϕ i = λ i ϕ i A \phi_i = \lambda_i \phi_i Aϕi=λiϕi,这里每一个 ϕ i \phi_i ϕi 均为 p × 1 p \times 1 p×1 的列向量。并且 Φ Φ T = I p × p \Phi \Phi^T = \mathbb{I}_{p \times p} ΦΦT=Ip×p

D D D 是由特征值 λ i \lambda_i λi 组成的对角矩阵, D = ( λ 1 ⋱ λ p ) D = \begin{pmatrix} \lambda_1 & & \\ & \ddots & \\ & & \lambda_p \end{pmatrix} D= λ1λp

对于任意的列向量 x ∈ R p ,   ∣ ∣ x ∣ ∣ 2 = 1 x \in \mathbb{R}^p, \, ||x||^2 = 1 xRp,∣∣x2=1,我们有
x T A x = x T Φ D Φ T x = ∑ i = 1 p λ i x T ϕ i ϕ i T x = ∑ i = 1 p λ i ∣ ∣ ϕ i T x ∣ ∣ 2 ≤ ∑ i = 1 p λ 1 ∣ ∣ ϕ i T x ∣ ∣ 2 = λ 1 ∑ i = 1 p ∣ ∣ ϕ i T x ∣ ∣ 2 = λ 1 ∣ ∣ Φ x ∣ ∣ 2 = λ 1 ( x T Φ T Φ x ) = λ 1 x T x = λ 1 \begin{aligned} x^T A x &= x^T \Phi D \Phi^T x \\ &= \sum_{i = 1}^p \lambda_i x^T \phi_i \phi_i^T x \\ &= \sum_{i = 1}^p \lambda_i || \phi_i^T x||^2 \\ &\leq \sum_{i = 1}^p \lambda_1 || \phi_i^T x||^2 \\ &= \lambda_1 \sum_{i = 1}^p || \phi_i^T x||^2 \\ &= \lambda_1 || \Phi x||^2 \\ &= \lambda_1 (x^T \Phi^T \Phi x) = \lambda_1 x^T x = \lambda_1 \end{aligned} xTAx=xTΦDΦTx=i=1pλixTϕiϕiTx=i=1pλi∣∣ϕiTx2i=1pλ1∣∣ϕiTx2=λ1i=1p∣∣ϕiTx2=λ1∣∣Φx2=λ1(xTΦTΦx)=λ1xTx=λ1

于是我们知道 max ⁡ x ∈ R p , ∣ ∣ x ∣ ∣ 2 = 1 x T A x ≤ λ 1 \max\limits_{x \in \mathbb{R}^p, ||x||^2 = 1} x^T A x \leq \lambda_1 xRp,∣∣x2=1maxxTAxλ1。如果我们取 x = ϕ 1 x = \phi_1 x=ϕ1,我们有 x T A x = ϕ 1 A ϕ 1 = λ 1 x^T A x = \phi_1 A \phi_1 = \lambda_1 xTAx=ϕ1Aϕ1=λ1。所以, ϕ 1 \phi_1 ϕ1 就是最优问题 max ⁡ x ∈ R p , ∣ ∣ x ∣ ∣ 2 = 1 x T A x \max\limits_{x \in \mathbb{R}^p, ||x||^2 = 1} x^T A x xRp,∣∣x2=1maxxTAx 的解。

程序验证

我们先用求特征值的方法来求主成分向量。我们的数据是有2个feature,一共有10 个数据。即 X.shape = (10, 2)

np.random.seed(1)
m = 20
x = np.random.uniform(1, 10, m)
y = 2 * x + 1 + np.random.normal(0, 1, m)
x = x - np.mean(x)
y = y - np.mean(y)
X = np.vstack((x, y)).T # X is the data set, X.shape = (m, 2)

我们来求协方差矩阵的特征值和特征向量。

eig_vals, eig_vecs = np.linalg.eig(1 / 2 * np.dot(X.T, X))

eig_vals

array([ 1.12975274, 236.75469475])

eig_vecs # The eigenvectors are eig_vecs[:,1], eig_vecs[:, 2]

array([[-0.89631173, -0.44342449],
[ 0.44342449, -0.89631173]])

我们看到,最大的特征值是 236.75,对应的特征向量(即第一主成分)为 (-0.443, -0.896)。第二主成分为 (-0.896, 0.443)。

我们可以检验这两个主成分与用 sklearn 中的PCA 方法得到的结果是一样的。

pca = PCA(n_components=2, svd_solver='full')
pca.fit(X)
pca_phis = pca.components_

PCA(copy=True, iterated_power=‘auto’, n_components=2, random_state=None,
svd_solver=‘full’, tol=0.0, whiten=False)

array([[ 0.44342449, 0.89631173],
[-0.89631173, 0.44342449]])

可以看到,得到的第一主成分是(0.443, 0.896),第二主成分是 (-0.896, 0.443)。这些结果与求解特征值与特征向量得到的结果相同。

原始数据 X X X(红色) 与第一主成分(蓝色)、第二主成分(绿色)如下图所示。

PCA demo

参考文献

[1] An introduction to statistical learning: with applications in R, Gareth James, Daniela Witten, Trevor Hastie, and Robert Tibshirani, Springer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主成分分析(principal component analysis, PCA)公式 的相关文章

随机推荐

  • OSI七层参考模型和数据封装

    OSI七层参考模型和数据封装 一 网络基础原理 1 分层思想 二 OSI七层参考模型 三 TCP IP协议簇和OSI参考模型 1 TCP IP五层模型常见协议 2 ARP是地址解析协议 3 RARP是反地址解析协议 四 PDU协议数据单元数
  • Flash概念简述

    1 Flash全名叫做Flash Memory Flash存储芯片的一种 通过特定的程序可以修改里面的数据 Flash属于非易失性存储设备 Non volatile Memory Device 与此相对应的是易失性存储设备 Volatile
  • RK3568 HDMI EDID处理过程

    一 简介 EDID是什么 EDID的全称是Extended Display Identification Data 扩展显示标识数据 VGA DVI的EDID由主块128字节组成 HDMI的EDID增加扩展块 128字节 扩展块的内容主要是
  • Jupyter notebook 如何设定默认的保存目录?

    前言 做智能车的时候 Jupter Notebook的默认保存在可怜的C盘 本来就很紧张的C肯定受不了 要改到别的地方 网上找了一些参考 说变更一下配置地址就可以了 照着做 99 的博客说 设置完了 关闭重启就好了 试了几次 根本不是关闭重
  • Proxmox VE 使用ACME 自动获取证书(DNSPOD)

    前言 PVE中自带了ACME 的支持 但是在国内对DNSPOD的支持似乎不是很好 所以只能采取手动的方式 一 使用步骤 以下步骤均在pve 的管理界面中 打开节点的shell 窗口中执行 安装ACME wget O acme1 sh htt
  • 页面访问量和网站访问量的统计

    网页点击计数器 以下是实现一个简单的基于 Servlet 生命周期的网页点击计数器需要采取的步骤 在 init 方法中初始化一个全局变量 每次调用 doGet 或 doPost 方法时 都增加全局变量 如果需要 您可以使用一个数据库表来存储
  • c++ 四元数转欧拉角

    c 四元数转欧拉角 两种方法 供你选择 方法 输入 x y z w 为四元数 输出 roll pitch yaw欧拉角 static void toEulerAngle const double x const double y const
  • FPGA驱动0.96oled显示屏 (4线 SPI) verilog语言

    之前也陆陆续续看了很多博客 也都能在自己的屏幕上显示出来 但是问题就是不知道怎么修改代码显示自己希望显示的东西 而且由于没注释原因看不太懂 最终的实现效果最终实现效果视频 b站视频链接1 评论区有人给了源码的百度网盘链接 csdn博客链接1
  • 1、若依服务网关

    文章目录 一 基础介绍 二 使用网关 1 添加依赖 2 resources application yml 配置文件 3 网关启动类 三 路由规则 1 Datetime 2 Cookie 3 Header 4 Host 5 Method 6
  • LeetCode Week 2

    LeetCode Week 2 保护好你的身体 和病痛比起来 其他的困难都不值一提 问题集合 1 Invert Binary Tree Easy 226 Invert a binary tree 4 2 7 1 3 6 9 to 4 7 2
  • Navicat远程连接MySQL服务器

    文章目录 一 准备 二 配置Navicat允许远程连接MySQL数据库 1 使用Navicat直接连接MySQL 2 使用 Navicat 通过 SSH 远程登录后再本地方式连接 MySQL 3 查看连接 为什么使用ssh登录 1 便捷性
  • AI工程师职业经验指南——转转推荐算法部负责人告诉你如何能够成为一名合格的机器学习算法工程师

    文章转载自 程序员杂志 2017 11 成为一名合格的开发工程师不是一件简单的事情 需要掌握从开发到调试到优化等一系列能力 这些能力中的每一项掌握起来都需要足够的努力和经验 而要成为一名合格的机器学习算法工程师 以下简称算法工程师 更是难上
  • 网络内安全试验场第三次CTF答题夺旗赛

    最近参加了网络内安全试验场第三次CTF答题夺旗赛 写wp 以后要做一个每次比赛完立马写wp的菜鸡 个人习惯 我做题一般喜欢从杂项 隐写开始 第一题 下载完成之后发现是个word 打开时需要密码 但是在题目中给提示了 所以直接输入密码 我以为
  • 自己手动搭建ssm框架实现增删改查、图片的上传、排序的移动所遇到问题的总结

    如图所示实现的增删改查 上移和下移 总结一下自己的不足之处 以前的公司都是自己有封装的框架而且有一段时间没做mvc了对此没有那么的熟悉 1 controller层返回的ModelAndView 后面希望能够改成String 然后再通过视图解
  • UTXO详解

    UTXO详解 https blog csdn net ztemt sw2 t 1 https blog csdn net yzpbright article details 82218759 比特币交易中的基础构建单元是交易输出 交易输出是
  • DBeaver连接clickhouse

    一 安装DBeaver 下载地址 Download DBeaver Community 1 选择自己电脑的安装包 2 安装完成之后 启动安装程序 3 选择语言及安装路径等 确认安装 4 安装成功 二 连接clickhouse 1 启动dbe
  • 一文带你梳理React面试题(2023年版本)

    前言 一 React18有哪些更新 setState自动批处理 在react17中 只有react事件会进行批处理 原生js事件 promise setTimeout setInterval不会 react18 将所有事件都进行批处理 即多
  • nginx 基础 域名、dns 、虚拟主机

    Nginx 基础应用实战 02 域名 dns与http协议 mashibing com server 相关配置 listen 80 监听端口 server name www mashibing com mashibing com 域名可以有
  • 16-3_Qt 5.9 C++开发指南_使用QStyle 设置界面外观_实现不同系统下的界面效果的匹配

    文章目录 1 QStyle的作用 实现不同系统下的界面效果的匹配 2 Qt内置样式的使用 3 源码 3 1 可视化UI设计 3 2 mainwindow cpp 1 QStyle的作用 实现不同系统下的界面效果的匹配 Qt 是一个跨平台的类
  • 主成分分析(principal component analysis, PCA)公式

    主成分分析 principal component analysis PCA 公式 主成分分析 摘要 什么是主成分 求解 PCA 的公式 数学证明 程序验证 参考文献 主成分分析 摘要 主成分分析作为一种常见的数据降维 dimension