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、不需要计算,而矩阵中一些非常小的数容易在平方中丢失
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=2, algorithm=’randomized’, n_iter=5, random_state=None, tol=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.****.net/Dark_Scope/article/details/53150883
https://blog.****.net/wangjian1204/article/details/50642732