基础代码
import numpy as np
from sklearn.decomposition import PCA
X = np.random.random([6, 6])
pca = PCA(n_components = 2)
X2D = pca.fit_transform(X)
print("="*8 + "X:\n", X)
print("="*8 + "X2D:\n", X2D)
方差解释率
用于衡量不同轴(主成分)的贡献度.
pca.explained_variance_ratio_
利用方差解释率选择正确数量的维度
何为正确的维度???
比如说项目要求训练集降维后的信息损失不超过5%, 也就是说PCA获得的主成分要包含至少95%的信息, 那么最少n个维度包含95%的信息, n就是正确数量的维度.
pca = PCA()
pca.fit(X)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1
代码解析:
- 只fit得到pca参数, 并不着急transform
- 定义cumsum运算: 这一点numpy像极了tensorflow, 定义一个运算图
cumsum = np.cumsum(pca.explained_variance_ratio_), 实际上并没有开始计算, 真正的计算在下一行代码d = np.argmax(cumsum >= 0.95) + 1中进行. - 内嵌cumsum计算图的argmax函数返回满足不等式的最短前n项和的第n项下标, 转换成人看的多少维度就要加1(计算机从0开始计数).
获取到满足包含95%信息的主成分后, 就可以再次运行pca进行transform了:
pca = PCA(d)
X2D = pca.fit_transform(X)
print(X2D)
直接选择正确数量的维度
实际上在PCA中, 可以直接令n_components为(0.0, 1.0)的浮点数, 算法会自动帮选择出包含该浮点数要求信息量的维度数量.
pca = PCA(n_components = 0.95)
X2D = pca.fit_transform(X)
print(X2D)
可视化
通过方差解释率图像查看截取不同的维数, 能含有多少信息.
import matplotlib.pyplot as plt
x = [i+1 for i in range(np.size(pca.explained_variance_ratio_))]
y = [i for i in pca.explained_variance_ratio_]
plt.plot(x, y, label="number of dimensions")
plt.xlabel("dimension")
plt.ylabel("variance ratio")
plt.show()
图像解释: 第一维已经包含了将近45%的信息, 第二维包含将近30%的信息. 到第四维时, 几乎只有5%的信息, 基本可以不要第四维.