提示:仅供自己学习、复习需要,有任何问题可在评论区提出。
一、主成分分析PCA
PCA是一种常见的数据降维方法,以下介绍PCA的原理。
1.数据的向量表示及降维问题?
一般情况下,在机器学习中,数据被表示为向量。例如淘宝店铺某天的交易记录,格式如下:(日期, 浏览量, 访客数, 下单数, 成交数, 成交金额),每条记录是一个六维向量。其中浏览量跟访客数、下单数跟成交数的关系相对紧密,我们可以这么认为,在访客数高的情况下,浏览量也会高。而且我们关注的往往是成交金额、成交数等,如果我们忽略日期这个字段,得到的就是一个五维向量,这就是降维。
降维当然意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。
2.向量的表示及基变换
内积与投影:假设A和B是两个n维向量,A与B的夹角是a,A在B上的投影可以表示为
∣
A
∣
c
o
s
(
a
)
|A|cos(a)
∣A∣cos(a),
∣
A
∣
=
x
1
2
+
y
1
2
|A|=\sqrt{x_1^2+y_1^2}
∣A∣=x12+y12是向量A的模。A与B的内积可以表示为
A
⃗
⋅
B
⃗
=
∣
A
∣
∣
B
∣
cos
(
a
)
\vec{A} \cdot \vec{B}=|A||B|\cos(a)
A⋅B=∣A∣∣B∣cos(a),我们可以得出结论:设向量B的模为1,则A与B的内积值等于A向B所在直线投影!
基:二维坐标系中的任何向量,都可以用向量的基表示,也就是说:要准确描述向量,首先要确定一组基,然后给出在基所在的各个直线上的投影值,就可以了!
上图默认以(1,0)和(0,1)为基,(3,2)可以由这组基进行表示。
上图,(1,1)和(-1,1)也可以为一组基,为了方便计算,我们希望基的模是1,从内积的意义可以看到,如果基的模是1,那么就可以方便的用向量点乘基而直接获得其在新基上的坐标了,所以上面的基可以变成
(
1
2
,
1
2
)
({1\over{\sqrt{2}}},{1\over{\sqrt{2}}})
(21,21)和
(
−
1
2
,
1
2
)
({-1\over{\sqrt{2}}},{1\over{\sqrt{2}}})
(2−1,21)。现在我们想获得(3,2)在新基上的坐标,即在两个方向上的投影,那么根据内积的几何意义,我们只要分别计算(3,2)和两个新基的内积,得到新的坐标为
(
5
2
,
−
1
2
)
({5\over{\sqrt{2}}},{-1\over{\sqrt{2}}})
(25,2−1)。这里需要注意,正交基有较好的性质,所以一般使用的基都是正交的。
基变换的矩阵表示
以上面的过程为例,基变换的过程可以用矩阵相乘的方式表示:
(
1
/
2
1
/
2
−
1
/
2
1
/
2
)
(
3
2
)
=
(
5
/
2
−
1
/
2
)
(\begin{matrix} {1/{\sqrt{2}}} & {1/{\sqrt{2}}} \\ {-1/{\sqrt{2}}} & {1/{\sqrt{2}}} \end{matrix})\ (\begin{matrix} 3 \\2 \\ \end{matrix})=(\begin{matrix} {5/{\sqrt{2}}} \\{-1/{\sqrt{2}}} \\ \end{matrix})
(1/2−1/21/21/2) (32)=(5/2−1/2)
其中矩阵的两行分别为两个基,乘以原向量,其结果刚好为新基的坐标。我们可以推广一下,如果我们有m个二维向量,只要将二维向量按列排成一个两行m列矩阵,然后用“基矩阵”乘以这个矩阵,就得到了所有这些向量在新基下的值。例如(1,1),(2,2),(3,3),想变换到刚才那组基上,则可以这样表示:
于是一组向量的基变换被表示为矩阵的相乘。
如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。
数学表示为:
其中
p
i
p_i
pi是一个行向量,表示第i个基,
a
j
a_j
aj是一个列向量,表示第j个原始数据记录。
注意:R可以小于N,而R决定了变换后数据的维数。也就是说,我们可以将一N维数据变换到更低维度的空间中去,变换后的维度取决于基的数量。因此这种矩阵相乘的表示也可以表示降维变换。
最后我们得出结论:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。
3.协方差矩阵及优化目标
上面我们讨论了选择不同的基可以对同样一组数据给出不同的表示,而且如果基的数量少于向量本身的维数,则可以达到降维的效果。那么怎样选择基才算是最优秀的?或者说,如果我们有一组N维向量,现在要将其降到K维(K小于N),那么我们应该如何选择K个基才能最大程度保留原有的信息?
我们以一个例子展开:假设有数据由五条记录组成,表示成矩阵形式:
为了后续处理方便,我们首先将每个字段内所有值都减去字段均值,其结果是将每个字段都变为均值为0。
变换后为:
在坐标系下为:
我们要将上面的二维数据降到一维,怎样才能尽可能的多保留原始信息,一种直观的看法是:希望投影后的投影值尽可能分散。以上图为例,如果我们向x轴或者y轴投影都会导致两个点叠加在一起,这是一种严重的信息丢失。如果向通过第一象限和第三象限的斜线投影呢?
我们发现这样投影后是可以区分的。
方差
上文说到,我们希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述。此处,一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,即:
由于上面我们已经将每个字段的均值都化为0了,因此方差可以直接用每个元素的平方和除以元素个数表示:
于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
协方差
对于二维降到一维,找到方差最大的方向就可以了,但是对于更高维来说,比如三维降到二维,我们找到一个方向使得投影后方差最大,但是我们还有要选择第二个投影方向。如果还是选择方差最大的方向,会与第一个方向重合,这样是没有意义的。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
可以看到,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。
为了使两个字段独立,即协方差为0时,我们选择的两个方向一定是正交的。
我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
协方差矩阵
假设我们有个矩阵X包含a合b两个字段:
然后我们用X乘以X的转置,并乘上系数1/m:
这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。两者被统一到了一个矩阵的。
把它推广到一般情况:
设我们有m个n维数据记录,将其按列排成n乘m的矩阵X,设
C
=
1
m
X
X
T
C = \frac{1}{m}XX^T
C=m1XXT,则C是一个对称矩阵,其对角线分别个各个字段的方差,而第i行j列和j行i列元素相同,表示i和j两个字段的协方差。
协方差矩阵对角化
根据上述推导,我们发现要达到优化目前,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。这样说可能还不是很明晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系:
设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据。设Y的协方差矩阵为D,我们推导一下D与C的关系:
我们要找的P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足
P
C
P
T
PCP^T
PCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
现在我们只需将协方差矩阵对角化即可。协方差矩阵C是一个是对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:
- 实对称矩阵不同特征值对应的特征向量必然正交。
- 设特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为 e 1 , e 2 , … , e n e_1,e_2,\ldots,e_n e1,e2,…,en,我们将其按列组成矩阵:
则对协方差矩阵C有如下结论:
其中Λ为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。
我们发现矩阵P就是 P = E T P = E^T P=ET
P是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。如果设P按照Λ中特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。
4.算法及实例
PCA的算法流程
如下:
实例:
上文提到的
我们用PCA方法将这组二维数据其降到一维。因为这个矩阵的每行已经是零均值,这里我们直接求协方差矩阵:
然后求其特征值和特征向量,具体求解方法不再详述,可以参考相关资料。求解后特征值为:
λ
1
=
2
,
λ
2
=
2
/
5
\lambda_1=2,\lambda_2=2/5
λ1=2,λ2=2/5
其对应的特征向量分别是:
其中对应的特征向量分别是一个通解,
c
1
c_1
c1和
c
2
c_2
c2
可取任意实数。那么标准化后的特征向量为:
因此我们的矩阵P是:
可以验证协方差矩阵C的对角化:
最后我们用P的第一行乘以数据矩阵,就得到了降维后的表示:
降维投影结果如下图:
二、核主成分分析KPCA
KPCA是对PCA的改进,它通过非线性映射将数据转化到高维空间中,然后在高维空间中进行PCA分析。
核方法的核心思想是通过映射将输入空间中的数据点转换到一个特征空间中,从而使得在特征空间中的数据点能够更容易地被处理和分析。而这种映射通常是通过核函数(Kernel Function)来实现的。
核函数可以直接对特征向量的内积进行变换,等价于先对特征向量做核映射然后做内积
公式如下:
K
(
x
,
y
)
=
<
f
(
x
)
,
f
(
y
)
>
K(x,y) = <f(x),f(y)>
K(x,y)=<f(x),f(y)>其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常,m>>n)。<x, y>是x和y的内积。
举例说明:假设两个向量:
x
=
(
x
1
,
x
2
,
x
3
)
,
y
=
(
y
1
,
y
2
,
y
3
)
x = (x_1,x_2,x_3),y=(y_1,y_2,y_3)
x=(x1,x2,x3),y=(y1,y2,y3)
定义映射函数:
f
(
x
)
=
(
x
1
x
1
,
x
1
x
2
,
x
1
x
3
,
x
2
x
1
,
x
2
x
2
,
x
2
x
3
,
x
3
x
1
,
x
3
x
2
,
x
3
x
3
)
f(x)=(x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3)
f(x)=(x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3)
定义核函数:
K
(
x
,
y
)
=
(
<
f
(
x
)
,
f
(
y
)
>
)
2
K(x,y)=(<f(x),f(y)>)^2
K(x,y)=(<f(x),f(y)>)2
假设:
x
=
(
1
,
2
,
3
)
,
y
=
(
4
,
5
,
6
)
x=(1,2,3),y=(4,5,6)
x=(1,2,3),y=(4,5,6)
如果不用核函数求解如下:
先通过映射函数转换:
f
(
x
)
=
(
1
,
2
,
3
,
2
,
4
,
6
,
3
,
6
,
9
)
f(x)=(1,2,3,2,4,6,3,6,9)
f(x)=(1,2,3,2,4,6,3,6,9)
f
(
y
)
=
(
16
,
20
,
24
,
20
,
25
,
36
,
24
,
30
,
36
)
f(y)=(16,20,24,20,25,36,24,30,36)
f(y)=(16,20,24,20,25,36,24,30,36)
再进行内积运算:
<
f
(
x
)
,
f
(
y
)
>
=
1
×
16
+
2
×
20
+
3
×
24
+
2
×
20
+
4
×
25
+
6
×
36
+
3
×
24
+
6
×
30
+
9
×
36
=
16
+
40
+
72
+
40
+
100
+
180
+
72
+
180
+
324
=
1024
<f(x),f(y)>=1×16+2×20+3×24+2×20+4×25+6×36+3×24+6×30+9×36 =16+40+72+40+100+180+72+180+324 =1024
<f(x),f(y)>=1×16+2×20+3×24+2×20+4×25+6×36+3×24+6×30+9×36=16+40+72+40+100+180+72+180+324=1024
如果用核函数求解如下:
K
(
x
,
y
)
=
(
1
×
4
+
2
×
5
+
3
×
6
)
2
=
(
4
+
10
+
18
)
2
=
3
2
2
=
1024
K(x,y)=(1×4+2×5+3×6) ^2=(4+10+18) ^2=32^2=1024
K(x,y)=(1×4+2×5+3×6)2=(4+10+18)2=322=1024
我们发现计算量大大减小。
常见的核函数如下:
KPCA优点
1.更好的数据可分性,KPCA在将数据映射到高维空间后,能够更好地区分不同类别的数据,提高了数据的可分性。
2.善于处理非线性数据。PCA只能处理线性数据。KPCA使用核函数,将原始数据映射到一个高维的特征空间上,该空间具有更强的表达能力,能够处理非线性关系。
3.更加灵活的使用方式,KPCA的核函数还可以通过调整参数来进一步调整模型的复杂度和鲁棒性。
参考:
http://blog.codinglabs.org/articles/pca-tutorial.html
https://blog.csdn.net/fengzhuqiaoqiu/article/details/129483461?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-129483461-blog-30492433.235v43pc_blog_bottom_relevance_base4&spm=1001.2101.3001.4242.1&utm_relevant_index=3
https://blog.csdn.net/l8947943/article/details/127520662?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171083543216800188565858%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171083543216800188565858&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-127520662-null-null.142v99pc_search_result_base9&utm_term=%E6%A0%B8%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187