在这里简单记录下学习PCA的一次简单实践;

为什么需要用到PCA呢?

在数据挖掘中,维度太大是一个很大的问题,影响挖掘的效率,PCA是一个最常用的、简单、基础理论完备的方法。

PCA(主成分分析)的手推过程

  1. 求给出矩阵X(m x n)的协方差矩阵S(m x m);
  2. 计算协方差矩阵的特征值λ和特征向量α;
  3. 计算方差贡献率 ;
    Ti=λi∑i=1nλiT_i = \frac{\lambda_i}{\sum_{i=1}^n\lambda_i}Ti​=∑i=1n​λi​λi​​
    第k个主成分的方差等于协方差矩阵S的第k个特征值(可从数学上证明)
  4. 取前K大的方差贡献率对应的特征值和特征向量;
    其中K表示特征的个数,
    且K个特征的方差贡献率之和大于等于要求的信息完整度(如80%) ;∑i=1KTi≥80%\sum_{i=1}^KT_i \geq 80\%i=1∑K​Ti​≥80%
  5. 将4.中所取特征向量组成矩阵作为PCA的线性变换矩阵M(K x m);
    这样就可以实现了数据特征的降维;
  6. 将线性变换矩阵M与原数据矩阵X做点积,即可得到各个主成分对各特征的相关系数

具体手推的例子这里省略。。。

以python代码为例

导入鸢尾花数据

 from sklearn import datasets iris = datasets.load_iris()x = iris.data

对数据进行标准化处理

     # 取得各个特征的均值n_samples, n_features = X.shape# mean = np.array([np.mean(X[:, i]) for i in range(n_features)])mean = X.mean(axis=1, keepdims=True)# 标准化normal_X = X - mean

计算协方差矩阵

    # 协方差矩阵cov_matrix = np.dot(normal_X, np.transpose(normal_X)) / (n_features - 1)print(cov_matrix)# cov = np.cov(X)# print(cov)

计算协方差矩阵的特征值和特征向量

 eig_val, eig_vec = np.linalg.eig(cov_matrix)print("特征值:")print(eig_val)# print(eig_val.shape)print("特征向量:")print(eig_vec)

计算方差贡献率

    # 计算方差贡献率y_contri = np.array([eig_val[i] / eig_val.sum() for i in range(len(eig_val))])print("y的方差贡献率:")print(y_contri)

选取前K个方差贡献率的特征向量,构成线性变换矩阵feature
我这里偷懒了,用肉眼选取k的值。。。

    # 将对应的特征值和特征向量存入eig_pairseig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(len(eig_val))]# 按eig_val从大到小顺序排列eig_veceig_pairs.sort(reverse=True)# 选择前k个eig_vecfeature = np.array([ele[1] for ele in eig_pairs[:k]])

线性变换矩阵和原数据矩阵做点积得主成分对各个特征的相关系数

result = np.dot(feature, X)

完整代码如下:

from sklearn import datasets
import numpy as npdef load_data():"""加载鸢尾花数据"""iris = datasets.load_iris()x = iris.datareturn xdef pca(X, k):  # k是维度# 取得各个特征的均值n_samples, n_features = X.shape# mean = np.array([np.mean(X[:, i]) for i in range(n_features)])mean = X.mean(axis=1, keepdims=True)# 标准化normal_X = X - mean# print(normal_X)# 协方差矩阵cov_matrix = np.dot(normal_X, np.transpose(normal_X)) / (n_features - 1)print(cov_matrix)# cov = np.cov(X)# print(cov)# 计算特征值和特征向量# scatter_matrix = np.dot(np.transpose(normal_X), normal_X)# eig_val, eig_vec = np.linalg.eig(np.transpose(scatter_matrix))eig_val, eig_vec = np.linalg.eig(cov_matrix)print("特征值:")print(eig_val)# print(eig_val.shape)print("特征向量:")print(eig_vec)# 计算方差贡献率y_contri = np.array([eig_val[i] / eig_val.sum() for i in range(len(eig_val))])print("y的方差贡献率:")print(y_contri)# 将对应的特征值和特征向量存入eig_pairseig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(len(eig_val))]# 按eig_val从大到小顺序排列eig_veceig_pairs.sort(reverse=True)# 选择前k个eig_vecfeature = np.array([ele[1] for ele in eig_pairs[:k]])# print(feature)# result = np.dot(X, np.transpose(feature))result = np.dot(feature, X)# print(result.shape)return result# print(load_data().shape)
data = np.transpose(load_data())result = pca(data, 1)
print("结果为:")
print(result)

使用PCA分析鸢尾花数据相关推荐

  1. python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据

    但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...

  2. python分析鸢尾花数据_python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据...

    但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...

  3. python分析鸢尾花数据_鸢尾花(iris)数据集分析

    Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度.花萼宽度.花瓣长度. ...

  4. 【python数据挖掘课程】十六.逻辑回归LogisticRegression分析鸢尾花数据

    今天是教师节,容我先感叹下. 祝天下所有老师教师节快乐,这是自己的第二个教师节,这一年来,无限感慨,有给一个人的指导,有给十几个人讲毕设,有几十人的实验,有上百人的课堂,也有给上千人的Python网络 ...

  5. 分析时间序列数据的六个图表

    本文在 Python 中用箱线图.傅里叶变换.熵.自相关和 PCA 分析时间序列数据.数据可视化是任何数据相关项目中最重要的阶段之一.根据数据可视化的对象,有: 1.数据可视化报告结果. 2.数据可视 ...

  6. 基于鸢尾花数据和手写数字,决策树,随机森林,voting,bagging法的比较

    四种方法的具体的原理可以见博文 和西瓜书 先上代码根据结果分析 鸢尾花数据 # evaluate bagging algorithm for classification from numpy imp ...

  7. R语言对表达谱样本做PCA分析

    主成分分析(Principal component analysis, PCA)是一种数学算法,它可以在减少数据维度的同时,保留数据集中绝大多数的变量[1]. PCA通过对主成分进行辨别,找出一个方向 ...

  8. Google Earth Engine(GEE)——利用哨兵S2数据进行PCA分析以单景影像分析

    之前有一篇公开的文章是有关单景Landsat8影像的PCA分析: (241条消息) Google earth engine--主成分分析PCA_此星光明2021年博客之星云计算Top3的博客-CSDN ...

  9. Python实验二:分析1996~2015年人口数据特征间的关系、分析并绘制鸢尾花数据的散点图和箱线图

    人口数据下载链接:populations.npz 鸢尾花数据下载链接:鸢尾花 (下载积分已改为0,请下载) 目录 一.题目表述 1.分析1996~2015年人口数据特征间的关系 2.分析并绘制鸢尾花数 ...

最新文章

  1. 基于Attention机制的轻量级网络架构以及代码实现
  2. C#基础知识整理:基础知识(5) 方法的重载
  3. 平台电商类的增长策略:从用户激励到养成类游戏
  4. python异常处理结构_python-异常处理
  5. Android 内存溢出解决方案(OOM)
  6. 【51nod - 1098】 最小方差(基础数学,公式化简,前缀和,积的前缀和)
  7. Android 心跳呼吸动画
  8. 'display','position'和'float'相互关系
  9. Redis 5种数据结构使用及注意事项
  10. python下载论文_Python实现一个论文下载器的过程
  11. iOS:tintColor详解
  12. 德裔美国Delphi程序员霍尔格-弗里克博士访谈
  13. RISC-V MCU 自动浇花装置设计
  14. 10个小故事,思考大数据
  15. 清除此计算机中wps云盘,Win10专业版系统怎么把电脑上的WPS网盘彻底删掉?
  16. 什么是POSIX system
  17. cad角度怎么画_软件CAD | 直线amp;构造线
  18. 最小生成树(库鲁斯卡尔算法)
  19. viewer.js插件简单使用说明
  20. 车站广播系统采用计算机,广播系统在轨道交通中的应用

热门文章

  1. 连接数据库出现ORA-12518: TNS: 监听程序无法分发客户机连接错误
  2. 带时间锉字段查询不走索引优化记录!+数据库卡顿问题排查顺序
  3. 一个女大学生的淘宝故事!
  4. MySQL燕十八老师课程笔记:第十五课:union
  5. 央行修法,币圈利空?并非如此
  6. 清理目录下的空文件夹
  7. NetSuite:企业中最常见的云ERP运维问题(上)
  8. 亚马逊服务器 修改密钥对,更改ec2实例的密钥对
  9. 关于Android调用支付宝接口”有的手机无法调起网页支付”遇到的问题
  10. 将多个文件的Sheet按名称提取,每个作为一个Sheet合并到一个Excel,以文件名作为Sheet名