\qquad 非监督学习算法。
\qquad 通过正交变换将数据换到新坐标中,从而将原本可能相关的便便(特征)投影到线性无关的变量(特征)。如果变换后的维度小于变换前的维度,则实现降维。
\qquad 中心化后,计算方差,协方差,协方差矩阵等运算更加方便。
\qquad 投影方差越大,意味着数据越分散,相对于原始数据来说,能够保留的信息越多。如果方差很小,则表示数据很大部分重叠,保留信息少。
\qquad 对于PCA来说,作为分类回归等任务的前置步骤(数据预处理阶段)。特征方差越大,说明样本之间区分越明显,这样就越容易完成分类或回归任务
\qquad 如果没有限制,则第一主成分和第二主成分相同,无意义。
\qquad 选择正交的基,是因为正交的基相关性为0。这样能够保留最大的信息。如果基之间是相关的,当样本数据向基向量投影时,也就一定相关,选在重叠。
\qquad 向单位向量上投影时,投影值计算更方便,向量内积即可。
向量v在w上的投影为:pro=|v| ∗ * ∗cosθ
由:v ∗ * ∗w=|v| ∗ * ∗|w| ∗ * ∗cosθ
得到cosθ= v ∗ w ∣ v ∣ ∗ ∣ w ∣ v*w\over |v|*|w| ∣v∣∗∣w∣v∗w
上式带入投影:pro= v ∗ w ∣ w ∣ v*w\over |w| ∣w∣v∗w
如果w为单位向量,则投影为内积,直接点成就行。
\qquad 假设我们要将数据投影到k个坐标轴上,需要新基k个向量。步骤如下:
数据集(假定已经去中心化):X=( x 1 x_1 x1, x 2 x_2 x2… x m x_m xm)∈ R n × m {R^{n×m}} Rn×m。n维m个
x 1 x_1 x1∈ R n × 1 {R^{n×1}} Rn×1
待求:W=( w 1 w_1 w1, w 2 w_2 w2… w d w_d wd)∈ R n × d {R^{n×d}} Rn×d。d为降维后维数
w 1 w_1 w1∈ R n × 1 {R^{n×1}} Rn×1,w用原基表示,所以仍然是n维。
约束条件: W T {W^T} WTW=I(单位矩阵)∈ R d × d {R^{d×d}} Rd×d
新基下的数据集:Z=( z 1 z_1 z1, z 2 z_2 z2… z m z_m zm)∈ R d × m {R^{d×m}} Rd×m。d维m个
\qquad z 1 T z_1^T z1T={ z 11 z_{11} z11, z 12 z_{12} z12… z 1 d z_{1d} z1d}
\qquad\;\;\;\; ={ w 1 T w_1^T w1T x 1 x_1 x1, w 2 T w_2^T w2T x 1 x_1 x1… w d T w_d^T wdT x 1 x_1 x1}
z i j z_{ij} zij= w j T w_j^T wjT x i x_i xi
z i z_{i} zi= W T W^T WT x i x_i xi
\qquad 重构 x i x_i xi:新基的各个方向拉长相应投影倍,再全部加和。(向量相加)
\qquad 则重构的 x i x_i xi可表示为: ∑ j = 1 d \sum_{j=1}^{d} ∑j=1d z i j z_{ij} zij w j w_j wj=W z i z_{i} zi
\qquad 重构后误差最小,得到目标函数:
\qquad \qquad a r g m i n w argmin_w argminw \;\;\; ∑ i = 1 m \sum_{i=1}^{m} ∑i=1m|| x i x_i xi- ∑ j = 1 d \sum_{j=1}^{d} ∑j=1d z i j z_{ij} zij w j w_j wj ∣ ∣ 2 ||^2 ∣∣2
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d( x i x_i xi-W z i z_{i} zi ) T )^T )T( x i x_i xi-W z i z_{i} zi)
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d[ x i T x_i^T xiT x i x_i xi- x i T x_i^T xiTW z i z_{i} zi- z i T z_i^T ziT W T W^T WT x i x_{i} xi+ z i T z_i^T ziT W T W^T WTW z i z_{i} zi]
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d[ x i T x_i^T xiT x i x_i xi-2 z i T z_i^T ziT W T W^T WT x i x_{i} xi+ z i T z_i^T ziT z i z_{i} zi]
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d[ x i T x_i^T xiT x i x_i xi-2 z i T z_i^T ziT z i z_{i} zi+ z i T z_i^T ziT z i z_{i} zi]
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d[- z i T z_i^T ziT z i z_{i} zi+ x i T x_i^T xiT x i x_i xi]
notes: \qquad x i T x_i^T xiTW z i z_{i} zi以及 z i T z_i^T ziT W T W^T WT x i x_{i} xi互为转置,且都是一个数,可以合并
\qquad \qquad 约束条件: W T {W^T} WTW=I(单位矩阵)∈ R d × d {R^{d×d}} Rd×d
\qquad \qquad x i T x_i^T xiT x i x_i xi为原始数据方差,是一个常数,可省略
此时目标函数可优化为:
\qquad \qquad a r g m i n w argmin_w argminw \;\;\; ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d- z i T z_i^T ziT z i z_{i} zi
\qquad \qquad \qquad \qquad =- ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d z i T z_i^T ziT z i z_{i} zi
\qquad \qquad \qquad \qquad =- ∑ i = 1 d \sum_{i=1}^{d} ∑i=1dtr( z i z_{i} zi z i T z_i^T ziT)
\qquad \qquad \qquad \qquad =- ∑ i = 1 d \sum_{i=1}^{d} ∑i=1dtr( W T W^T WT x i x_i xi x i T x_i^T xiT W W W)
\qquad \qquad \qquad \qquad =-tr( W T W^T WT ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d x i x_i xi x i T x_i^T xiT W W W)
令C= ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d x i x_i xi x i T x_i^T xiT=X X T X^T XT(为散度矩阵,再除以个数减一就是协方差矩阵)
\qquad \qquad \qquad \qquad =-tr( W T W^T WTC W W W) \qquad \qquad \qquad (1)
s.t. W T {W^T} WTW=I
由拉格朗日乘数法得到:
\qquad L(W,∧)=-tr( W T W^T WTC W W W)+tr(∧( W T {W^T} WTW-I))
∧=diag( λ 1 λ_1 λ1, λ 2 λ_2 λ2,…, λ d λ_d λd)
L对W求导,并令结果为0,得到:矩阵求导
\qquad \qquad \qquad \qquad (C+ C T C^T CT)W=2W∧
\qquad \qquad \qquad \qquad \qquad CW=W∧ \qquad \qquad \qquad (2)
对任意 λ i λ_i λi都有:
\qquad \qquad \qquad \qquad C w i w_i wi= λ i λ_i λi w i w_i wi
即 λ i λ_i λi为C的特征值, w i w_i wi为对应的特征向量。
(2)带入(1)得到:
\qquad \qquad \qquad a r g m i n w argmin_w argminw \;\;\; -tr( W T W^T WTC W W W)
\qquad \qquad \qquad =-tr( W T W^T WT W W W∧)
\qquad \qquad \qquad =-tr(∧)
最小的重构误差==对角矩阵的迹和的最大值
W就位最大的d个特征值对应的特征向量
投影后数据方差最大
\qquad \qquad a r g m a x w argmax_w argmaxw \;\;\; ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d( z i z_i zi ) 2 )^2 )2
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1d z i T z_i^T ziT z i z_{i} zi
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1dtr( z i z_{i} zi z i T z_i^T ziT)
\qquad \qquad \qquad \qquad = ∑ i = 1 d \sum_{i=1}^{d} ∑i=1dtr( W T W^T WT x i x_i xi x i T x_i^T xiT W W W)
\qquad \qquad \qquad \qquad =tr( W T W^T WTC W W W)
即求最大的迹,最大的d个特征值。与最小重构相同了
数据集是m×n,为推到中的数据集的转置
import numpy as np
import matplotlib.pyplot as plt
#载入鸢尾花数据集
from sklearn import datasets
iris=datasets.load_iris()
x=iris.data
y=iris.target
#第一步,去中心化
#按列求和
x_sum=np.sum(x,axis=0)
x_mean=x_sum/x.shape[0]
x=x-x_mean
#x=x-x.mean(axis=0)
print(x)
#求C=x^TX
c=np.dot(x.T,x)
print(c)
#求特征值以及特征向量
val,vector=np.linalg.eig(c)
print(val)
print(vector)
#对特征值进行排序,index保存索引
index=np.argsort(-val)
print(index)
#print(index[:2])
#投影矩阵 -为最大的特征值对应特征向量,即index对应索引对应的列。降到2维
A=vector[:,index[:2]]
print(A)
#投影后矩阵
Y=np.dot(x,A)
print(Y)
#画图
for i in range(len(y)):
if y[i]==0:
plt.scatter(Y[i][0],Y[i][1],c='r',marker='.')
elif y[i]==1:
plt.scatter(Y[i][0],Y[i][1],c='b',marker='.')
else:
plt.scatter(Y[i][0],Y[i][1],c='g',marker='.')
plt.show()
这个图和网上的第二主成分和网上的图相反。但是没关系,是第二主成分方向反了的问题,并不影响。在Y[i][1]前面加负号就得到了网上的图
#画图
for i in range(len(y)):
if y[i]==0:
plt.scatter(Y[i][0],-Y[i][1],c='r',marker='.')
elif y[i]==1:
plt.scatter(Y[i][0],-Y[i][1],c='b',marker='.')
else:
plt.scatter(Y[i][0],-Y[i][1],c='g',marker='.')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
#x:一个数据为一行
def PCA_fit(d_dim,x):
#去中心化
x=x-x.mean(axis=0)
#求C
C=np.dot(x.T,x)
#求特征值以及特征向量
val,vector=np.linalg.eig(C)
#求排序索引
index=np.argsort(-val)
#投影矩阵
A=vector[:,index[:d_dim]]
#返回降维后的数据
return np.dot(x,A)
iris=datasets.load_iris()
x=iris.data
y=iris.target
#降维后数据Y,调用函数
Y=PCA_fit(2,x)
#画图
for i in range(len(y)):
if y[i]==0:
plt.scatter(Y[i][0],-Y[i][1],c='r',marker='.')
elif y[i]==1:
plt.scatter(Y[i][0],-Y[i][1],c='b',marker='.')
else:
plt.scatter(Y[i][0],-Y[i][1],c='g',marker='.')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
iris=datasets.load_iris()
x=iris.data
y=iris.target
pca=PCA(n_components=2)#降到二维
pca.fit(x)
Y=pca.fit_transform(x)#降维后数据
#画图
for i in range(len(y)):
if y[i]==0:
plt.scatter(Y[i][0],Y[i][1],c='r',marker='.')
elif y[i]==1:
plt.scatter(Y[i][0],Y[i][1],c='b',marker='.')
else:
plt.scatter(Y[i][0],Y[i][1],c='g',marker='.')
plt.show()
优点
减少特征空间维度,降低了数据复杂度
方便模型拟合
缺点
计算成本高
可能会降低模型精度,因为会丢弃一些信息
转换过程复杂,结果难以解释
对异常值敏感