【深度之眼】【百面机器学习】PCA降维

知识点

sklearn.decomposition.PCA()

参数

  • 1)n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数。当然,我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的数。当然,我们还可以将参数设置为”mle”, 此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数),即会保留所有特征。

  • 2)whiten :判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化

  • 3)svd_solver:即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。 full则是传统意义上的SVD,使用了scipy库对应的实现。arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。

除了这些输入参数外,有几个PCA类的成员值得关注。

  • explained_variance_:它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。
  • explained_variance_ratio_:它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。
  • components_ :返回具有最大方差的成分
  • n_components_:返回所保留的成分个数n

PCA对象方法

  • (1)fit(X,y=None)

fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。

fit(X),表示用数据X来训练PCA模型。

函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。

  • (2)fit_transform(X)

用X来训练PCA模型,同时返回降维后的数据。
newX=pca.fit_transform(X),newX就是降维后的数据。

  • (3)inverse_transform()

将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)

  • (4)transform(X)

将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。

此外,还有get_covariance()、get_precision()、get_params(deep=True)、score(X, y=None)等方法,需要的话自行百度。

代码

相关的库包

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

# K近邻分类器
from sklearn.neighbors import KNeighborsClassifier
# PCA
from sklearn.decomposition import PCA

KNN

# k近邻
knn_clf = KNeighborsClassifier()
knn_clf.fit(x_train, y_train)
acc = knn_clf.score(x_test, y_test)
print("knn acc is %s: " % acc)

PCA

# PCA
pca = PCA(n_components=2)
pca.fit(x_train, y_train)
x_train_reduction = pca.transform(x_train)
x_test_reduction = pca.transform(x_test)

knn_clf = KNeighborsClassifier()
knn_clf.fit(x_train_reduction, y_train)
acc = knn_clf.score(x_test_reduction, y_test)
print("After PCA, knn acc is %s: " % acc)

显示代码

# 显示方差的改变曲线
plt.plot([i for i in range(x_train.shape[1])],
         [np.sum(pca.explained_variance_ratio_[:i + 1]) for i in range(x_train.shape[1])])
plt.show()

# 降维可视化
pca = PCA(n_components=2)
x_reduction = pca.fit_transform(x)

for i in range(10):
    plt.scatter(x_reduction[y == i, 0], x_reduction[y == i, 1], alpha=0.8)
plt.show()
    

完整的代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

# K近邻分类器
from sklearn.neighbors import KNeighborsClassifier
# PCA
from sklearn.decomposition import PCA

if __name__ == '__main__':
    digits = datasets.load_digits()
    x = digits.data
    y = digits.target

    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=666)

    # k近邻
    knn_clf = KNeighborsClassifier()
    knn_clf.fit(x_train, y_train)
    acc = knn_clf.score(x_test, y_test)
    print("knn acc is %s: " % acc)

    # PCA
    pca = PCA(n_components=2)
    pca.fit(x_train, y_train)
    x_train_reduction = pca.transform(x_train)
    x_test_reduction = pca.transform(x_test)

    knn_clf = KNeighborsClassifier()
    knn_clf.fit(x_train_reduction, y_train)
    acc = knn_clf.score(x_test_reduction, y_test)
    print("After PCA, knn acc is %s: " % acc)

    # 显示方差的改变曲线
    plt.plot([i for i in range(x_train.shape[1])],
             [np.sum(pca.explained_variance_ratio_[:i + 1]) for i in range(x_train.shape[1])])
    plt.show()

    # 降维可视化
    pca = PCA(n_components=2)
    x_reduction = pca.fit_transform(x)

    for i in range(10):
        plt.scatter(x_reduction[y == i, 0], x_reduction[y == i, 1], alpha=0.8)
    plt.show()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值