PCA SVD TSVD

一、PCA

数学推导过程:

假设有n×d矩阵X,每一行是一个d维样本xi,寻找投影方向vj以最大化投影方差: 

 λj是特征向量vj对应的特征值。可以发现当投影方向是CC的最大特征值对应的特征向量时,投影方向上数据的方差最大。所以用PCA进行降维时通常选取较大特征值对应的特征向量作为投影方向:XVk,Vk是最大的k个特征值对应的特征向量矩阵。

代码实现:

#零均值化
def zeroMean(dataMat):      
    meanVal=np.mean(dataMat,axis=0)     #按列求均值,即求各个特征的均值
    newData=dataMat-meanVal
    return newData,meanVal
 
def pca(dataMat,n):
    newData,meanVal=zeroMean(dataMat)
    covMat=np.cov(newData,rowvar=0)    #求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本
    
    eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量
    eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序
    n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标
    n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量
    lowDDataMat=newData*n_eigVect               #低维特征空间的数据
    reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据
    return lowDDataMat,reconMat
 

二、SVD

数学推导:

SVD优点:

1、不需要计算X^{T}X,而矩阵中一些非常小的数容易在平方中丢失

2、方便求伪逆(最小二乘中会用到)

3、运算速度快,SVD的速度比特征值分解要快很多,充分地利用了协方差矩阵的性质。

 

三、PCA与SVD联系:

对输入矩阵进行中心化后,其PCA和SVD处理结果一样。实际上,经常用SVD来实现PCA.

 

四、TSVD(截断奇异值分解, TruncatedSVD)

TruncatedSVD是SVD的变形,只计算用户指定的最大的K个奇异值。所以它可以产生一个指定维度的分解矩阵。例如,有一个 n×n 矩阵,通过SVD分解后仍然是一个 n×n 矩阵,而TSVD可以生成指定维度的矩阵。这样就可以实现降维了。

TSVD实现

class sklearn.decomposition.TruncatedSVD(n_components=2algorithm=’randomized’n_iter=5random_state=Nonetol=0.0)

参数含义:

n_components:输出数据的维度,默认为2

algorithm:可选‘randomized’和‘arpack’,即SVD的两种求解算法

n_iter:SVD求解器的迭代次数,当algorithm为‘randomized’有效

random_state:如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例。

tol:Tolerance for ARPACK. 0 means machine precision.当algorithm为‘arpack’时有效

用法举例:

svd = TruncatedSVD(n_components=npc, n_iter=7, random_state=0)
svd.fit(X)  


参考:

https://blog.csdn.net/Dark_Scope/article/details/53150883

https://blog.csdn.net/wangjian1204/article/details/50642732

https://blog.csdn.net/qq_37423198/article/details/77651484

https://blog.csdn.net/mmc2015/article/details/46867773