PCA whiten

135 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

PCA白化其实跟PCA算法的后续处理。那么他到底起到什么作用呢。我们举个例子来说明,假设训练数据是图像,我们知道相邻的像素点有更多相似性,这一点是不容置疑的。比如训练集是人脸图像,那么两个相邻的像素点一定会有很强的相关性,比如如果像素足够大,肤色,皮肤厚度仅有细微变化。这么多相似数据会造成训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过PCA白化过程使得学习算法的输入具有如下性质:  

1.特征之间相关性较低 

2.所有特征具有相同的方差。

在PCA算法中已经消除了输入特征 x(i) 之间的相关性。我们这里只需对PCA处理后的数据进行等方差处理。

为了使每个输入特征具有单位方差,我们可以直接使用 图片.png作为缩放因子来缩放每个特征。具体地,我们定义PCA白化如下

图片.png

Kitlearn实现: data = pd.read_excel(r'Desktop\principal_component.xls', header = None)

from sklearn.decomposition import PCA

pca=PCA(3,whiten=True)

pca.fit(data)

 

Out[14]:

PCA(copy=True, iterated_power='auto', n_components=3, random_state=None,

  svd_solver='auto', tol=0.0, whiten=True)

 

dimension_reduce=pca.transform(data)

whitening=dimension_reduce

pca=PCA(3)

pca.fit(data)

 

PCA(copy=True, iterated_power='auto', n_components=3, random_state=None,

  svd_solver='auto', tol=0.0, whiten=False)

 

dimension_reduce=pca.transform(data)

Ohne_Whitening=dimension_reduce

 

Ohne_Whitening

lambda_1=np.array([  4.00716350e+02,   8.12549005e+01,   2.21371447e+01])

Ohne_Whitening/np.sqrt(lambda_1)

方差验证:****

np.var(whitening[:,1])

Out[22]: 0.92857142857142816

np.var(whitening[:,2])

Out[23]: 0.92857142857142894

np.var(whitening[:,0])

Out[25]: 0.92857142857142905

类型:bool,缺省时默认为False 意义:白化,使得每个特征具有相同的方差。

svd_solver : string {‘auto’, ‘full’, ‘arpack’, ‘randomized’}

‘Auto’

solver是通过基于X形状和n_components的默认策略选择的:如果输入数据大于500x500并且选取的主成分数量低于数据最小维度的80%,则启用更有效的随机化randomized方法。否则,使用精确完整的‘full’SVD,然后按情况任意选取。

‘Full’

通过调用标准的LAPACK解算器借助于scipy.linalg.svd 精确运行完整SVD并且通过后处理选择主成分。(运行后选择)

‘arpack’

通过调用ARPACK解算器借助于scipy.sparse.linalg.svds运行的SVD降维成n_components。这种算法严格要求0 < n_components < min(X.shape)。

“randomized ”

借助于Halko et al.方法运行随机化SVD

tol : float >= 0, optional (default .0)

通过svd_solver == ‘arpack’计算的奇异值的容差

iterated_power : int >= 0, or ‘auto’, (default ‘auto’)

借助于svd_solver == ‘randomized’计算的幂方法的迭代次数

random_state:int, RandomState instance or None, optional (default None)

如果int, random_state是随机数生成器使用的种子;

如果RandomState instance,random_state是随机数发生器;

如果None,随机数生成器就是np.random使用的RandomState instance。当svd_solver == ' arpack '或'randomized'时使用。

属性:

components_ : array, shape (n_components, n_features)

特征空间的主坐标轴,代表数据的最大方差方向。这些主成分通过explained_variance_来排序。

explained_variance_ : array, shape (n_components,)

被每个被选主成分解释的方差的数量

等于n_component个最大的X协方差特征值。

explained_variance_ratio_ : array, shape (n_components,)

被每个被选主成分解释的方差的百分比。

如果n_components 没有被设置,那么所有主成分被存储起来并且百分比的总和等于1。

singular_values_ : array, shape (n_components,)

对应于每个所选主成分的奇异值。****

mean_ : array, shape (n_features,)

Equal to X.mean(axis=0).

n_components_ : int

被估计的主成分数量,如果 n_components 被设置成‘mle’或者一个0到1之间的数,这个数字是根据输入数据估计的。否则,如果n_components为None,它等于参数n_components,或者n_features和n_samples的较小值。