使用PCA分析鸢尾花数据
在这里简单记录下学习PCA的一次简单实践;
为什么需要用到PCA呢?
在数据挖掘中,维度太大是一个很大的问题,影响挖掘的效率,PCA是一个最常用的、简单、基础理论完备的方法。
PCA(主成分分析)的手推过程
- 求给出矩阵X(m x n)的协方差矩阵S(m x m);
- 计算协方差矩阵的特征值λ和特征向量α;
- 计算方差贡献率 ;
Ti=λi∑i=1nλiT_i = \frac{\lambda_i}{\sum_{i=1}^n\lambda_i}Ti=∑i=1nλiλi
第k个主成分的方差等于协方差矩阵S的第k个特征值(可从数学上证明) - 取前K大的方差贡献率对应的特征值和特征向量;
其中K表示特征的个数,
且K个特征的方差贡献率之和大于等于要求的信息完整度(如80%) ;∑i=1KTi≥80%\sum_{i=1}^KT_i \geq 80\%i=1∑KTi≥80% - 将4.中所取特征向量组成矩阵作为PCA的线性变换矩阵M(K x m);
这样就可以实现了数据特征的降维; - 将线性变换矩阵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分析鸢尾花数据相关推荐
- python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据
但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...
- python分析鸢尾花数据_python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据...
但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...
- python分析鸢尾花数据_鸢尾花(iris)数据集分析
Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度.花萼宽度.花瓣长度. ...
- 【python数据挖掘课程】十六.逻辑回归LogisticRegression分析鸢尾花数据
今天是教师节,容我先感叹下. 祝天下所有老师教师节快乐,这是自己的第二个教师节,这一年来,无限感慨,有给一个人的指导,有给十几个人讲毕设,有几十人的实验,有上百人的课堂,也有给上千人的Python网络 ...
- 分析时间序列数据的六个图表
本文在 Python 中用箱线图.傅里叶变换.熵.自相关和 PCA 分析时间序列数据.数据可视化是任何数据相关项目中最重要的阶段之一.根据数据可视化的对象,有: 1.数据可视化报告结果. 2.数据可视 ...
- 基于鸢尾花数据和手写数字,决策树,随机森林,voting,bagging法的比较
四种方法的具体的原理可以见博文 和西瓜书 先上代码根据结果分析 鸢尾花数据 # evaluate bagging algorithm for classification from numpy imp ...
- R语言对表达谱样本做PCA分析
主成分分析(Principal component analysis, PCA)是一种数学算法,它可以在减少数据维度的同时,保留数据集中绝大多数的变量[1]. PCA通过对主成分进行辨别,找出一个方向 ...
- Google Earth Engine(GEE)——利用哨兵S2数据进行PCA分析以单景影像分析
之前有一篇公开的文章是有关单景Landsat8影像的PCA分析: (241条消息) Google earth engine--主成分分析PCA_此星光明2021年博客之星云计算Top3的博客-CSDN ...
- Python实验二:分析1996~2015年人口数据特征间的关系、分析并绘制鸢尾花数据的散点图和箱线图
人口数据下载链接:populations.npz 鸢尾花数据下载链接:鸢尾花 (下载积分已改为0,请下载) 目录 一.题目表述 1.分析1996~2015年人口数据特征间的关系 2.分析并绘制鸢尾花数 ...
最新文章
- 基于Attention机制的轻量级网络架构以及代码实现
- C#基础知识整理:基础知识(5) 方法的重载
- 平台电商类的增长策略:从用户激励到养成类游戏
- python异常处理结构_python-异常处理
- Android 内存溢出解决方案(OOM)
- 【51nod - 1098】 最小方差(基础数学,公式化简,前缀和,积的前缀和)
- Android 心跳呼吸动画
- 'display','position'和'float'相互关系
- Redis 5种数据结构使用及注意事项
- python下载论文_Python实现一个论文下载器的过程
- iOS:tintColor详解
- 德裔美国Delphi程序员霍尔格-弗里克博士访谈
- RISC-V MCU 自动浇花装置设计
- 10个小故事,思考大数据
- 清除此计算机中wps云盘,Win10专业版系统怎么把电脑上的WPS网盘彻底删掉?
- 什么是POSIX system
- cad角度怎么画_软件CAD | 直线amp;构造线
- 最小生成树(库鲁斯卡尔算法)
- viewer.js插件简单使用说明
- 车站广播系统采用计算机,广播系统在轨道交通中的应用