python机器学习之我见:PCA数据降维

PCA算法作为一种无监督的学习算法,主要用于数据降维、有损数据压缩、特征抽取、数据可视化。
一、PCA算法流程
• 导入数据集X;
• 按列计算数据集X的均值Xmean,然后做差得到X1=X-Xmean;
• 对得到的新矩阵X1作协方差,得到conv;
• 计算协方差conv对应的特征值和特征向量;
• 然后对得到的特征值排序,得到k个最大的特征值,并求出其对应的k个特征向量,并将其作为列向量组成新的特征向量矩阵X2;
• 计算X1*X2得到经过降维的数据集。
二、python代码实现

import numpy as np
from sklearn import datasets

def zeroMean(X):        
    meanVal=np.mean(X,axis=0)#按列求均值,即求各个特征的均值  
    newData=X-meanVal  
    return newData,meanVal  

def pca(dataMat,n):  
    newData,meanVal=zeroMean(dataMat)  
    covMat=np.cov(dataMat,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               #低维特征空间的数据  
    print(lowDDataMat) 

if __name__ == '__main__':
    X=np.array([[65,61,72,84,81,79], 
                 [77,77,76,64,70,55],
                 [67,63,49,65,67,57],
                 [80,69,75,74,74,63],
                 [74,70,80,84,82,74],
                 [78,84,75,62,72,64],
                 [66,71,67,52,65,57],
                 [77,71,57,72,86,71],
                 [83,100,79,41,67,50]])
    zeroMean(X)
    pca(X,3)

三、sklearn库函数调用

sklearn.decomposition.PCA(
    n_components=None, 
    copy=True, 
    whiten=False, 
    svd_solver=’auto’, 
    tol=0.0, 
    iterated_power=’auto’, 
    random_state=None
    )

参数解析:
n_components:
意义:保留的特征个数n
类型:int 或者 string,缺省时默认为None,所有成分被保留。
赋值为int,比如n_components=1,将把原始数据降到一个维度。
赋值为string,比如n_components=’mle’,将自动选取特征个数n,使得满足所要求的方差百分比。
copy:
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。
若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;
若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
whiten:
类型:bool,缺省时默认为False
意义:白化,使得每个特征具有相同的方差。关于“白化”,可参考:Ufldl教程
2、PCA的对象
components_ :返回具有最大方差的成分。
explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。
n_components_:返回所保留的成分个数n。
mean_:
noise_variance_:
3、PCA对象的方法
属性:
components_ :主成分组数
explained_variance_ratio_:每个主成分占方差比例
n_components_ :一个整数,指示主成分有多少个元素。
方法:
fit(x):训练模型
transform(x): 执行降维
fit_transform(x): 训练并降维
inverse_transform(x): 逆向操作,把降维的数据逆向转换回原来数据。
例子:

from sklearn.decomposition import PCA 
pca=PCA(n_components=1)
>>> data=array([[ 1.  ,  1.  ],
           [ 0.9 ,  0.95],
           [ 1.01,  1.03],
           [ 2.  ,  2.  ],
           [ 2.03,  2.06]])
newData=pca.fit_transform(data)
>>> newData
array([[-2.12015916],
       [-2.22617682],
       [-2.09185561],
       [-0.70594692],
       [-0.64227841]])

猜你喜欢

转载自blog.csdn.net/zztingfeng/article/details/80463598