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]])