博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[python机器学习及实践(6)]Sklearn实现主成分分析(PCA)
阅读量:6739 次
发布时间:2019-06-25

本文共 3322 字,大约阅读时间需要 11 分钟。

1.PCA原理

 主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

PCA算法:

2.PCA的实现

数据集:

64维的手写数字图像

代码:

#coding=utf-8import numpy as npimport pandas as pdfrom sklearn.decomposition import PCAfrom matplotlib import pyplot as pltfrom sklearn.svm import LinearSVCfrom sklearn.metrics import classification_report#1.初始化一个线性矩阵并求秩M = np.array([[1,2],[2,4]])   #初始化一个2*2的线性相关矩阵np.linalg.matrix_rank(M,tol=None)  # 计算矩阵的秩#2.读取训练数据与测试数据集。digits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)digits_test = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes', header=None)print digits_train.shape   #(3823, 65)    3000+个样本,每个数据由64个特征,1个标签构成print digits_test.shape    #(1797, 65)#3将数据降维到2维并可视化# 3.1 分割训练数据的特征向量和标记X_digits = digits_train[np.arange(64)]         #得到64位特征值y_digits = digits_train[64]                    #得到对应的标签#3.2 PCA降维:降到2维estimator = PCA(n_components=2)X_pca=estimator.fit_transform(X_digits)#3.3 显示这10类手写体数字图片经PCA压缩后的2维空间分布def plot_pca_scatter():    colors = ['black', 'blue', 'purple', 'yellow', 'white', 'red', 'lime', 'cyan', 'orange', 'gray']    for i in xrange(len(colors)):        px = X_pca[:, 0][y_digits.as_matrix() == i]        py = X_pca[:, 1][y_digits.as_matrix() == i]        plt.scatter(px, py, c=colors[i])    plt.legend(np.arange(0, 10).astype(str))    plt.xlabel('First Principal Component')    plt.ylabel('Second Principal Component')    plt.show()plot_pca_scatter()# 4.用SVM分别对原始空间的数据(64维)和降到20维的数据进行训练,预测# 4.1 对训练数据/测试数据进行特征向量与分类标签的分离X_train = digits_train[np.arange(64)]y_train = digits_train[64]X_test = digits_test[np.arange(64)]y_test = digits_test[64]#4.2 用SVM对64维数据进行进行训练svc = LinearSVC()  # 初始化线性核的支持向量机的分类器svc.fit(X_train,y_train)y_pred = svc.predict(X_test)#4.3 用SVM对20维数据进行进行训练estimator = PCA(n_components=20)   # 使用PCA将原64维度图像压缩为20个维度pca_X_train = estimator.fit_transform(X_train)   # 利用训练特征决定20个正交维度的方向,并转化原训练特征pca_X_test = estimator.transform(X_test)psc_svc = LinearSVC()psc_svc.fit(pca_X_train,y_train)pca_y_pred = psc_svc.predict(pca_X_test)#5.获取结果报告#输出用64维度训练的结果print svc.score(X_test,y_test)print classification_report(y_test,y_pred,target_names=np.arange(10).astype(str))#输出用20维度训练的结果print psc_svc.score(pca_X_test,y_test)print classification_report(y_test,pca_y_pred,target_names=np.arange(10).astype(str))

 运行结果:

1)将数据压缩到两维,在二维平面的可视化。

2)SVM对64维和20维数据的训练结果

0.9220923761825265

precision recall f1-score support

0 0.99 0.98 0.99 178

1 0.97 0.76 0.85 182
2 0.99 0.98 0.98 177
3 1.00 0.87 0.93 183
4 0.95 0.97 0.96 181
5 0.90 0.97 0.93 182
6 0.99 0.97 0.98 181
7 0.99 0.90 0.94 179
8 0.67 0.97 0.79 174
9 0.90 0.86 0.88 180

avg / total 0.94 0.92 0.92 1797

0.9248747913188647

precision recall f1-score support

0 0.97 0.96 0.96 178

1 0.88 0.90 0.89 182
2 0.96 0.99 0.97 177
3 0.99 0.91 0.95 183
4 0.92 0.96 0.94 181
5 0.87 0.96 0.91 182
6 0.98 0.97 0.98 181
7 0.98 0.89 0.93 179
8 0.91 0.83 0.86 174
9 0.83 0.88 0.85 180

avg / total 0.93 0.92 0.93 1797

结论:降维后的准确率降低,但却用了更少的维度。

3.PCA的优缺点

PCA算法的主要优点有:

1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响。 

2)各主成分之间正交,可消除原始数据成分间的相互影响的因素。

3)计算方法简单,主要运算是特征值分解,易于实现。

PCA算法的主要缺点有:

1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。

2)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。

转载于:https://www.cnblogs.com/youngsea/p/9334773.html

你可能感兴趣的文章
Android 6.0 如何默认打开user版本的root权限【转】
查看>>
TP框架在做上传时候提示:没有上传的文件!
查看>>
leetcode 485. Max Consecutive Ones
查看>>
IDEA使用笔记(九)——设置文件注释
查看>>
漫谈Java IO之基础篇
查看>>
CentOS 6.8 防火墙配置
查看>>
Spring Boot 2.0 整合 FreeMarker 模板引擎
查看>>
Java 知识点
查看>>
Nginx+Tomcat高性能负载均衡集群搭建
查看>>
BZOJ3573: [Hnoi2014]米特运输(树上乱搞)
查看>>
Dubbo的一些编码约定和设计原则
查看>>
IDA 操作记录
查看>>
告警系统需求分析 告警系统主脚本 告警系统配置文件 告警系统监控项目
查看>>
JavaServer Faces (JSF) with Spring
查看>>
知物由学 | 这些企业大佬如何看待2018年的安全形势?
查看>>
[转]Mongodb的下载和安装
查看>>
usb_submit_urb
查看>>
[Node.js] Add Logging to a Node.js Application using Winston
查看>>
qt-solutions提供了8个开源项目
查看>>
处理:“ORA-00257: archiver error. Connect internal only, until freed”的错误问题
查看>>