【高中生讲机器学习】17. 讲人话的主成分分析,它来了!(上篇)

news2024/11/13 9:24:27

创建时间:2024-08-13
首发时间:2024-09-05
最后编辑时间:2024-09-05
作者:Geeker_LStar

你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~
我是 Geeker_LStar,一名准高一学生,热爱计算机和数学,我们一起加油~!
⭐(●’◡’●) ⭐
那就让我们开始吧!

诶嘿!这一篇想写很久啦,现在终于来了!(什么玩意都拖到开学了还没写完
如果想比较好的理解这两篇(这篇 & 下篇)的数学细节,需要你具有【矩阵特征值分解】和【矩阵奇异值分解】的前置知识,你可以在这一篇:【高中生讲机器学习】16. 线代小白也能看懂的矩阵奇异值分解!中找到对应的内容~!

话不多说,我们开始这一篇吧!!

文章目录

  • 前置知识
    • 方差和标准差
    • 协方差
    • 相关系数
    • 协方差矩阵
  • 主成分分析概述
  • 主成分分析的几何解释
  • 下篇

前置知识

okay,在正式开始讲主成分分析之前,按照惯例,我们还是需要补充一点数学知识…
不过别担心()不会像上一篇那样一补充就 “补充” 五千字线性代数基础(论《补充》(bushi)
今天要补充的东西还是相对好理解的,有一点点线性代数基础就够~

方差和标准差

啊这个其实应该不用补充吧()不过为了连贯一点,还是简单提一下吧~(看我如何 100 字内解决

协方差

嗯,上面讲的方差是衡量一维变量自身的波动程度的,但是如果我的变量是二维的呢?我怎么衡量这一堆二维变量之间的 “方差”?
well,现在就要协方差上场了!
还是老规矩,先放公式再解释。
假设我们现在有 n n n 个二维变量 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) (x_1,y_1), (x_2, y_2), ..., (x_n, y_n) (x1,y1),(x2,y2),...,(xn,yn),则它们的协方差为:
Cov ( X , Y ) = 1 n ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y}) Cov(X,Y)=n1i=1n(xixˉ)(yiyˉ)

其中, x ˉ , y ˉ \bar{x}, \bar{y} xˉ,yˉ x , y x, y x,y 的均值。
okaya(ok 呀(《自创词》)),我们来看看这个公式的意思。
首先 x , y x, y x,y 分别减去均值,这一步和计算方差时减去均值的目的是一样的,都是为了将数据中心化,以消除数据绝对大小的影响。
然后,我们分别计算每一对 x i x_i xi y i y_i yi(中心化后)的乘积,并把所有对的结果加起来,再取均值,就得到了 X X X Y Y Y 的协方差。

协方差衡量的是什么?yes,它衡量的是两个变量之间的相关性
具体来说,如果协方差为正,反映出 X , Y X,Y X,Y 之间有较强的正相关关系(即 X X X 变大时 Y Y Y 也变大);如果协方差为负,反映出 X , Y X,Y X,Y 之间有较强的负相关关系;而如果协方差接近于 0,则说明 X , Y X,Y X,Y 之间不太存在相关关系。

emm 再详细解释一下,就是,如果 X , Y X,Y X,Y 之间有较强的正相关关系,那么(在中心化后), x > 0 x>0 x>0 y y y 也应该(或者大部分情况下) > 0 >0 >0 x < 0 x<0 x<0 同理。这样的话,每一项 ( x i − x ˉ ) ( y i − y ˉ ) (x_i - \bar{x})(y_i - \bar{y}) (xixˉ)(yiyˉ) 都应该 > 0 >0 >0,最终加起来协方差也大于 0。
负相关关系同理。
(不是,我着了什么魔,我刚才潜意识打出来的是 “特征值也大于 0”。。。)

okay,现在协方差应该很好理解了!我们来看一个和它高度相关的东西(和它的协方差为正的东西())——相关系数。

相关系数

咳咳咳,相关系数和协方差的相关系数接近于 1.((抖机灵

嗯,书接上文,协方差的计算方法有效,但是它忽略了一个对于数据来说很重要的东西——量纲
具体怎么说呢,就是如果两个变量都在 10^4 这个数量级(,和两个变量都在 10^1 这个数量级,哪怕这两组都是强正相关,最终计算出来的协方差也会相差很多——10^4 数量级的变量的协方差通常来讲会远大于 10^1 量级的变量。

okay,为了缓解量纲不同带来的协方差差距,我们有两种选择。

  • 在计算协方差之前就对原始数据进行处理。即除了中心化外,再做一步标准化操作。
  • 对得到的协方差进行处理,以消除量纲的影响。

在下面主成分分析的内容里面,我们会讲到具体的数据预处理方法。在相关系数这个部分,我们先来看第二种选择——对我们已有的协方差进行处理。

前面说过,协方差没有考虑数据的量纲问题,那解决这个问题要怎么办捏——没错,那就自己处理量纲呀。或者说,那就把计算协方差之前没有处理好的量纲放到计算之后处理。

okay,so 我们怎么统一量纲?
这其实也好办,通常量纲可以使用标准差来统一。也就是说,当两个数据的量纲不统一导致无法比较的时候,我们可以把两个数据都除以它的标准差,这样就避免了量纲的影响。
至于为什么可以这样,很简单,在标准化之前我们已经进行了中心化,即把均值变为了 0。而标准化又允许我们把数据的标准差变为 1,这样我们就消除了数据原始量纲的影响。或者说,现在的数据可以被看作是无量纲的了。

so,既然协方差会受到量纲的影响,那我们就让协方差再除以两个维度的标准差就可以了呀。
据此,我们得到了一个公式:

r = Cov ( X , Y ) σ X σ Y = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \bar{x})^2 \sum_{i=1}^{n} (y_i - \bar{y})^2}} r=σXσYCov(X,Y)=i=1n(xixˉ)2i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

该公式的计算结果被称为相关系数,是一个在 -1 和 1 之间的值。(别看这玩意很长,其实就是协方差除以标准差的乘积
嗯,或许你已经想到了,如果我先对数据进行标准化,然后再算协方差,那其实和我先算协方差再整体除以标准差是一样的,得到的结果都等于相关系数。
(为什么我要在这里提一句这个呢,因为后面会用到,嘿嘿。

嗯,既然相关系数只是标准化后的协方差,它的含义肯定也与协方差类似:它衡量的也是两个变量之间的线性相关程度。具体来说,我们有:

  • 相关系数 = 1,完全正相关(斜率 >0 的直线)
  • 相关系数 = 0,不存在任何相关性
  • 相关系数 = -1,完全负相关(斜率 <0 的直线)

相关系数比线性相关/线性无关包含的范围更广一点(这两个在上一篇讲过定义),相关系数为 ±1 对应两个变量线性相关,相关系数为 0 对应两个变量线性无关。相关系数在 0–1 或 -1–0 之间的都代表有相关性,相关系数的绝对值越大,代表相关性越强(越近似于线性相关)。(别着急,后面我们会遇到一个例子

协方差矩阵

weeeell,前面讲过了方差和协方差。方差衡量的是一个变量自身的波动程度,协方差则是衡量两个维度(变量)的相关程度。

嗯,到目前为止一切都好说,可是,如果我现在有三个或者更多维度,我也想计算它们的协方差,怎么办?
很显然,这个时候一个值就不够用了。那我们就要邀请矩阵出场了…

其实我感觉协方差矩阵这里会有点绕()为了避免绕晕,我们先把符号规定好。
我们有 n n n 个数据,每个数据有 m m m 个维度,对于第 i i i 个数据的第 j j j 个维度,我们记作 x i ( j ) x_{i}^{(j)} xi(j),即下标为第几个数据,上标为这个数据的第几维。

我们把所有数据的记录在一个大的矩阵 X X X 里,即:
X = [ x 1 ( 1 ) x 1 ( 2 ) . . . x 1 ( m ) x 2 ( 1 ) x 2 ( 2 ) . . . x 2 ( m ) . . . . . . . . . . . . x n ( 1 ) x n ( 2 ) . . . x n ( m ) ] X = \begin{bmatrix} x_1^{(1)} & x_1^{(2)} & ... & x_1^{(m)}\\ x_2^{(1)} & x_2^{(2)} & ... & x_2^{(m)} \\ ... & ... & ... & ... \\ x_n^{(1)} & x_n^{(2)} & ... & x_n^{(m)} \\ \end{bmatrix} X= x1(1)x2(1)...xn(1)x1(2)x2(2)...xn(2)............x1(m)x2(m)...xn(m)

这是一个 n ∗ m n*m nm 的矩阵,其中每一行代表一个数据,每一列代表一个特定的维度(变量)。

现在我们要干什么?yes,我们要计算【每一个维度之间】【彼此】的协方差。
也就是说,我们想要计算维度 1(第一列)和维度 2 到 m 的所有维度的协方差,维度 2 和维度 1,维度 3 到 m 的所有维度的协方差…
显然,最终计算出的值需要被存储在一个矩阵中。

weeeell,还是一样的,我们先写出计算的式子,然后再分析这个式子。
Cov ( X , X ) = E [ X T X ] \text{Cov}(X,X)=E[X^TX] Cov(X,X)=E[XTX]

X X X 是一个 n ∗ m n*m nm 的矩阵, X T X X^TX XTX 的结果则是一个 m ∗ m m*m mm 的方阵。我们不妨把这个方阵记作 C C C(cov 的简写)。
嗯,这很好。为什么好呢?因为 m ∗ m m*m mm 方阵中每一个位置都是一个协方差,这些协方差共同构成了我们想要的协方差矩阵!
具体来说, C i j C{ij} Cij 代表了数据的第 i i i 个维度和第 j j j 个维度的协方差。
在我们探讨 C C C 的更多细节和特点之前,我们还是先来看看为什么 C C C 就是我们想要的协方差矩阵吧。

我们不妨把整个算式写出来:
[ x 1 ( 1 ) x 2 ( 1 ) . . . x n ( 1 ) x 1 ( 2 ) x 2 ( 2 ) . . . x n ( 2 ) . . . . . . . . . . . . x 1 ( m ) x 2 ( m ) . . . x n ( m ) ] m ∗ n ∗ [ x 1 ( 1 ) x 1 ( 2 ) . . . x 1 ( m ) x 2 ( 1 ) x 2 ( 2 ) . . . x 2 ( m ) . . . . . . . . . . . . x n ( 1 ) x n ( 2 ) . . . x n ( m ) ] n ∗ m = [ C 11 C 12 . . . C 1 m C 21 C 22 . . . C 2 m . . . . . . . . . . . . C m 1 C m 2 . . . C m m ] m ∗ m \begin{bmatrix} x_1^{(1)} & x_2^{(1)} & ... & x_n^{(1)}\\ x_1^{(2)} & x_2^{(2)} & ... & x_n^{(2)} \\ ... & ... & ... & ... \\ x_1^{(m)} & x_2^{(m)} & ... & x_n^{(m)} \\ \end{bmatrix}_{m*n} * \begin{bmatrix} x_1^{(1)} & x_1^{(2)} & ... & x_1^{(m)}\\ x_2^{(1)} & x_2^{(2)} & ... & x_2^{(m)} \\ ... & ... & ... & ... \\ x_n^{(1)} & x_n^{(2)} & ... & x_n^{(m)} \\ \end{bmatrix}_{n*m}= \begin{bmatrix} C_{11} & C_{12} & ... & C_{1m} \\ C_{21} & C_{22} & ... & C_{2m} \\ ... & ... & ... & ... \\ C_{m1} & C_{m2} & ... & C_{mm} \\ \end{bmatrix}_{m*m} x1(1)x1(2)...x1(m)x2(1)x2(2)...x2(m)............xn(1)xn(2)...xn(m) mn x1(1)x2(1)...xn(1)x1(2)x2(2)...xn(2)............x1(m)x2(m)...xn(m) nm= C11C21...Cm1C12C22...Cm2............C1mC2m...Cmm mm

wow 你想不到这个算式对应的 latex 有多少(((
我们随便选取第一个矩阵 X T X^T XT 的一行和第二个矩阵 X X X 的一列,来看一下这个计算过程。嗯那就第一个矩阵的第一行和第二个矩阵的第二列吧。
也就是:
[ x 1 ( 1 ) x 2 ( 1 ) . . . x n ( 1 ) ] 1 ∗ n ∗ [ x 1 ( 2 ) x 2 ( 2 ) . . . x n ( 2 ) ] n ∗ 1 = C 12 \begin{bmatrix} x_1^{(1)} & x_2^{(1)} & ... & x_n^{(1)} \end{bmatrix}_{1*n} * \begin{bmatrix} x_1^{(2)} \\ x_2^{(2)} \\ ... \\ x_n^{(2)}\\ \end{bmatrix}_{n*1}=C_{12} [x1(1)x2(1)...xn(1)]1n x1(2)x2(2)...xn(2) n1=C12

展开成算式:
C 12 = ∑ i = 1 n x i ( 1 ) ∗ x i ( 2 ) C_{12}=\sum_{i=1}^{n}x_i^{(1)}*x_i^{(2)} C12=i=1nxi(1)xi(2)

okay,我们发现,这不计算的就是第一个维度和第二个维度的协方差嘛!
好嘞,这样一来,为什么最终的矩阵是协方差矩阵就很好理解了。

接下来我们继续来看这个协方差矩阵的特征…
有一个特征很显然——它是对称的。
回到上面说的这句话——“具体来说, C i j C{ij} Cij 代表了数据的第 i i i 个维度和第 j j j 个维度的协方差。”
同理, C j i C{ji} Cji 代表了数据的第 j j j 个维度和第 i i i 个维度的协方差。而两个维度的协方差只有一个,所以 C i j = C j i C_{ij}=C_{ji} Cij=Cji,即这个矩阵是对称的。

嗯,这很好!
说到方阵,说到(实)对称,你想到了什么。
——这是特征值分解的天然条件啊!

嗯好的,不过我们还得再等亿会(或者说在下篇)才能谈到它,先让我们切入到主题…(我感觉我扯了三四千字《数学基础》(好吧没事比上一篇的五千多字线性代数基础好那么点(

主成分分析概述

主成分分析要干什么?我们首先需要解决这个问题。
其实上一篇文章中我有一个不错的例子,直接抄到这里来吧。

比如说你现在要买房子,你的预算和时间都有限,所以你需要快速地通过一个房子的信息去判断这个房子(的价格)是否值得你考虑。不过,决定一个房子价格的因素可太多了——面积、朝向、户型、年限、是不是二手的、旁边有没有好学校…在估计一个房子价格的时候,我们不可能把所有这些因素都考虑进去,那这时候怎么办呢——没错,先看最能决定房子价格的因素,然后再做下一步决定。而对于一个房子来说,直接决定价格范围的、最重要的因素一般而言是它的面积。这样我们就把一个需要考虑很多(大多数时候没有那么有用)的因素的问题转化成了只需要考虑几个比较重要的信息的问题。

嗯,主成分分析就是干这个的——它是一种无监督学习算法,通常用于数据降维。它通过提取数据中的主要模式/特征/信息来减少数据的维度(特征数量)。换言之,它尝试(在尽量减少数据损失的条件下)使用更少的维度的信息去近似原始高维数据所包含的全部信息。这有利于提取出数据中真正有用的信息(去掉一些噪声或贡献很小的部分),同时减少数据所占的空间以及对数据进行分析所需的时间。

再举一个例子,很多图像压缩算法就使用了主成分分析,在尽量保证图片清晰度的情况下减少图片的大小。

and,理解主成分分析还有一个不错的角度——原始的数据可能在一些维度上线性相关或近似线性相关(强相关性),但是对数据进行主成分分析后的数据在任意维度上都线性无关(强相关性意味着相关系数接近于 ± 1)。这代表着什么呢?
well,(强)线性相关意味着有大量的数据是不必要的,因为其中一些数据可以用另一些数据的线性组合来近似表示。所以在这种情况下,我们大可以用主成分分析去掉其中的一些数据,同时只损失很少的信息。

豪德,说了这么多,主成分分析到底是怎么做的呢?它怎么就提取出了数据中最重要的信息?

okay,简单来讲,主成分分析寻找原始数据中变化最大的几个方向 (这是什么话) ,或者说方差最大的方向,并以这些方向为新的坐标轴(相当于对坐标系进行变换)。至于最终要选取几个方向作为新的坐标轴方向,取决于你希望保留多少数据,具体的计算方法后面会讲到。
(补充一句,如果不对数据进行降维,即不减少坐标轴的数量,则主成分分析可以看作对原始坐标系的旋转变换。)
你可能好奇为什么主成分分析要找数据中变化最大(方差最大)的方向,这其实也很好解释:方差大意味着数据在这个方向上比较分散,数据之间的相似度比较低,那每个数据的 “辨识度” 自然就更高。也就是说我们就更能通过这个方向上的值去把数据区分开来。这对于很多机器学习任务来说是非常有用且关键的。

ok 我想你现在或许有点懵,so maybe 几何会是一种更直观的解释,let us have a loook!

主成分分析的几何解释

weeell,休息一下脑子,这一部分我们来看一些直观但其实非常重要的东西(可以说这里面包含主成分分析思想的核心),也可以看作对上一部分的详细解释。

首先我们来看一个坐标系:

主成分分析的几何解释

先看左边那个图(a),这是原始的坐标系,数据由两个变量 x 1 , x 2 x_1, x_2 x1,x2 表示。可以看到这两个变量之间存在一种类似于线性关系的关系,即具有较强的相关性,目测一下相关系数估计 0.4-0.6?换言之,对于图(a),当我们知道 x 1 , x 2 x_1, x_2 x1,x2 中其一时,对另一个的预测不是完全随机的(因为我们知道大概的趋势,所以可以进行一个粗略的预测)。

okay,接下来我们走一遍主成分分析的流程。
首先选取数据方差最大的方向,这里的数据像一个椭圆,那么方差最大的方向就是椭圆的长轴,我们把这个方向记作 y 1 y_1 y1,也就是第一主成分。
可以看到, y 1 y_1 y1 和之前的坐标轴相比,更有助于我们区分数据
接下来我们选取和 y 1 y_1 y1 垂直且方差次之的方向,作为新坐标系的第二坐标轴,记作 y 2 y_2 y2,也就是第二主成分。这里因为是一个二维坐标系所以只剩下一个可选择的方向了,如果是 n n n 维坐标系的话就还会有 n − 1 n-1 n1 个可以选择的方向。

可以看到,在新的坐标系中,两个变量 y 1 , y 2 y_1, y_2 y1,y2 间是线性无关的,也就是知道其中一个的值并不能对我们预测另一个的值提供任何有用的信息。
同时,如果我们只选取第一主成分,那么等价于把数据投影到这个方向上,把二维数据变成了一维,实现了数据降维。

(感觉现在可能比较直观了!

okay,看完流程,我们不妨换一个角度,从几何上看看 “方差最大” 的含义。
为什么要选取方差最大的方向之前已经说过了,主成分分析的目的是在提取出数据中最重要的特征(在降低数据维度的同时保留大部分重要信息),而方差最大的方向可以说就是具有最多信息的方向

综上所述,我们可以用几句话简单地概括一下主成分分析:

  • 主成分分析是一种无监督学习算法,常用于数据降维和数据压缩
  • 主成分分析的目的是在保证数据内容损失较少的前提下尽可能降低数据维度,去除数据中的噪声和一些不那么重要的特征
  • 主成分分析可以找出原始数据中变化最大(方差最大,具有最多信息)的方向
  • 主成分分析选择方差最大(即包含最多信息)的方向作为主成分的方向
  • 经过主成分分析后的数据在任何维度上都是线性无关的

okay!!! 现在你已经基本了解主成分分析在干什么了!very nice!!!

嗯,不过,理解它在干什么只能说是第一步,或者说是入门级别的。主成分分析真正的精髓在于它的数学推导,这一部分我将放在下篇中进行详细阐述!!(真的非常有意思!!

下篇

aaaa 下篇还在更新!!很快就能看到啦!

那这一篇就到这里啦~我们下篇再见!

这篇文章对主成分分析做了,希望对你有所帮助!⭐
欢迎三连!!一起加油!🎇
——Geeker_LStar

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

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

相关文章

Redis 集群高可用详解及配置

关型数据库 关系型数据库&#xff1a; 是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据 主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库 关型数据库的优缺点 特点&#xff1a; 1、数据关系模型基于关系…

Redis使用——Redis的redis.conf配置注释详解(三)

Redis使用——Redis的redis.conf配置注释详解&#xff08;三&#xff09; 背景 日常我们开发时&#xff0c;我们会遇到各种各样的奇奇怪怪的问题&#xff08;踩坑o(╯□╰)o&#xff09;&#xff0c;这个常见问题系列就是我日常遇到的一些问题的记录文章系列&#xff0c;这里整…

鸿蒙轻内核M核源码分析系列四 中断Hwi

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 持续更新中…… 在鸿蒙轻内核源码分析系列前几篇文章中&#xff0c;剖析了重要的数据结构。本文&#xff0c;我们讲述一下中断&#xff0c;会给读者介绍中…

Ubuntu固定USB串口名(包括1拖N的USB串口)

在运行Ubuntu系统的开发板上,如果使用可插拔的USB串口,有时候程序正在运行时,如果突然连接传感器的USB串口设备被插拔了一下,这时,会发现系统中的USB串口名发生了改变。例如,插拔之前是/dev/ttyUSB0,插拔之后变成了/dev/ttyUSB3。发生这种情况的时候,有时候会导致程序无…

Windows I/O系统

硬件存储体系 寄存器 处理器内部定义的存储体&#xff0c;它们除了存储功能&#xff0c;往往还兼有其他的能力&#xff0c;比如参与运算&#xff0c;地址解析&#xff0c;指示处理器的状态&#xff0c;等等。寄存器是由处理器内部专门的触发器电路实现的&#xff0c;处理器往…

jupyter里怎么设置代理下载模型

使用如下方式: %env http_proxyhttp://10.110.146.100:7890 %env https_proxyhttp://10.110.146.100:7890

【SLAM】GNSS的定义,信号原理以及RTK在多传感器融合中的使用方法

【SLAM】GNSS的定义&#xff0c;信号原理以及在多传感器融合中的使用方法 1. GNSS的定义2. GNSS信号原理3. RTK - Real Time Kinematic4。 如何使用RTK做融合和优化 1. GNSS的定义 GPS&#xff08;Global Positioning System&#xff09;和GNSS&#xff08;Global Navigation …

Ubuntu22.04安装colmap

首先上这里查看自己电脑GPU的CMAKE_CUDA_ARCHITECTURES 终端输入以下内容安装预先的前置依赖 sudo apt-get install \git cmake ninja-build build-essential \libboost-program-options-dev libboost-filesystem-dev \libboost-graph-dev libboost-system-dev libboost-tes…

【操作系统存储篇】操作系统的设备管理

目录 一、广义的IO设备 分类 按使用特性分类 按信息交换的单位分类 按设备的共享属性分类 按传输速率分类 二、IO设备的缓冲区 三、SPOOLing技术 一、广义的IO设备 输入设备&#xff1a;对CPU而言&#xff0c;凡是对CPU进行数据输入的。 输出设备&#xff1a;对CPU而…

深度解析:基于离线开发的数据仓库转型落地案例

在当今这个数据驱动的时代&#xff0c;各行各业都正经历着前所未有的变革。伴随技术的飞速发展&#xff0c;数据仓库作为企业数据管理与分析的核心&#xff0c;如何更好地发挥作用&#xff0c;助力企业保持业务的敏捷性与成本效益&#xff0c;成为大家关心的焦点问题。本文将通…

vue使用html2Canvas导出图片 input文字向上偏移

vue使用html2Canvas导出图片 input文字向上偏移 图中 用的是element的输入框 行高 32px,经常测试 你使用原生的input 还是会出现偏移。 解决方法&#xff1a;修改css样式 1.怎么实现导出 网上随便找很多 2.在第一步 获取你要导出的元素id 克隆后 修改他的样式或者 你直接在你需…

web渗透:SSRF漏洞

SSRF漏洞的原理 SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请求伪造&#xff09;是一种安全漏洞&#xff0c;它允许攻击者构造请求&#xff0c;由服务端发起&#xff0c;从而访问服务端无法直接访问的内部或外部资源。这种漏洞通常发生在应用程序允许用…

v$session_longops监控 PDB clone 进度

How to Monitor PDB Clone / Move On Create Pluggable Database with COPY Clause Statement Execution (Doc ID 2866302.1)​编辑To Bottom In this Document Goal Solution References APPLIES TO: Oracle Database - Enterprise Edition - Version 19.14.1.0.0 and later…

leetcode:908. 最小差值 I(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums&#xff0c;和一个整数 k 。 在一个操作中&#xff0c;您可以选择 0 < i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] x &#xff0c;其中 x 是一个范围为 [-k, k] 的整数。对于每个索引 i &#xff0c;最多 只能…

【赛题已出】2024数学建模国赛A-E题已发布

2024年高教社杯全国大学生数学建模各题赛题已发布&#xff01; A题 B题 C题 D题 E题

Linux开源监控工具netdata

Netdata 是一个免费、开源、实时、专业的服务器监控工具&#xff0c;它以可视化的形式实时展现监控主机的性能变化&#xff0c;提供了一个交互式 Web 界面来查看您的服务器指标。它可以帮助我们了解监控主机的系统或应用程序中正在发生的事情以及刚刚发生的事情&#xff0c;并且…

macos系统内置php文件列表 系统自带php卸载方法

在macos系统中, 自带已经安装了php, 根据不同的macos版本php的版本号可能不同, 我们可以通过 which php 命令来查看mac自带的默认php安装路径, 不过注意这个只是php的执行文件路径. 系统自带php文件列表 一下就是macos默认安装的php文件列表. macos 10.15内置PHP文件列表配置…

iOS——GCD再学习

GCD 使用GCD好处&#xff0c;具体如下&#xff1a; GCD 可用于多核的并行运算&#xff1b;GCD 会自动利用更多的 CPU 内核&#xff08;比如双核、四核&#xff09;&#xff1b;GCD 会自动管理线程的生命周期&#xff08;创建线程、调度任务、销毁线程&#xff09;&#xff1b…

面试软件测试需要掌握的技能有哪些?

一、测试用例的编写 1、在测试中最重要的文档&#xff0c;他是测试工作的核心&#xff0c;是一组在测试时输入输出的标准&#xff0c;是软件需求的具体对照。编写测试用例&#xff0c;是测试人员的基本功&#xff0c;真正能写好的人并不多。 测试用例包含的内容&#xff1a; …

windows手工杀毒-寻找可疑进程之进程模块

上篇回顾&#xff1a;windows手工杀毒-寻找可疑进程之进程启动文件-CSDN博客 上篇我们介绍了如何通过进程启动文件寻找可疑进程&#xff0c;首先我们查看文件的数字签名&#xff0c;如果签名是合法的&#xff0c;且是正规公司的证书。基本可疑排除进程是可疑进程&#…