PCA主要是用来数据降维,将高纬度的特征映射到低维度的特征,加快机器学习的速度。
原理:
在这个图片中,我们用两个特征来描述样本,分别是attack,defense。但如右图所示,作两条线,可以看出在右边这条线上有较大的方差,而左边这条线的方差比较小。方差越大,所包含的信息就越多。那么如何把这两个特征进行降维呢,降维要尽可能保持原始数据的信息,故要取使方差最大的一个维度(本例中从二维降到一维)。假设右边这条线的方差最大,我们就可以把这条线所在的直线当作降维后的一个维度。也就是二维降到一维后,这个一维空间的x轴所在的位置。那么这个降维后的x轴代表着什么呢?在本例中,我们可以看到这个新的特征由defense和attack这两个特征向量相加,新特征的含义我个人理解为防御力和攻击力在差不多的情况下的大小。不同的人可能理解不一样,现在就成功的将这个二个特征降到了一个特征。在实际的情况中可能有成千上万维数据,具体降到多少个特征要根据实际情况而定。一般来说,前几个特征的累计贡献率就可能达到百分之九十几了。
实现:
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)
print(pca.explained_variance_ratio_)
# 结果 [0.99244289 0.00755711]
先创建PCA对象
参数说明:
n_components:表示保留的特征数,默认为1,如果设置成‘mle’,那么会自动确定保留的特征数。
n_components 设置成 mle时,自动确定保留的特征数,此时特征数为1。
pca = PCA(n_components='mle')
pca.fit(X)
print(pca.explained_variance_ratio_)
# 结果 0.99244289
explained_variance_ratio_:返回所保留的n个成分各自的方差百分比,这里可以理解为单个变量方差贡献率。
可以看到第一个特征的单个变量方差贡献率已经到达0.99,意味着几乎保留了所有的信息,所以只保留一个特征即可。
n_features_:训练数据中的特征数量
n_samples_:训练数据中的样本数
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)
print(pca.n_features_)
print(pca.n_samples_)
# 结果 :2 6
方法说明:
方法 | 说明 |
fit(X) | 用数据X来训练PCA模型。 |
transform(X) | 将数据X转换成降维后的数据,当模型训练好后,对于新输入的数据,也可以用transform方法来降维。 |
fit_transform(X) | 用X来训练PCA模型,同时返回降维后的数据。 |
inverse_transform(newData) | newData 为降维后的数据。将降维后的数据转换成原始数据,但可能不会完全一样,会有些许差别。 |
使用 fit_transform:
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components='mle')
result=pca.fit_transform(X)
print(result)
# 得到结果
[[ 1.38340578]
[ 2.22189802]
[ 3.6053038 ]
[-1.38340578]
[-2.22189802]
[-3.6053038 ]]