遇到的问题:

X = df.loc[:,0:4].values#提取第0-3列
y = df.loc[:,4].values #提取第4列

报错:

TypeError: cannot do slice indexing on Index with these indexers [0] of type int

修改代码为:

X = df.iloc[:,0:4].values#提取第0-3列
y = df.iloc[:,4].values #提取第4列

python代码实现PCA降维处理:

伪代码:

1.去除平均值

2.计算协方差矩阵

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

4.将特征值从大到小排序

5.保留最上面的N个特征向量

6.将数据转换到上述N个特征向量构建的新空间中

1、导入数据

import numpy as np
import pandas as pd
df = pd.read_csv('iris.data')
df.head()

# 原始数据没有给定列名的时候需要我们自己加上
df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
df.head()

split data table into data X and class labels y将数据表拆分为数据X和类标签y

X = df.iloc[:,0:4].values#提取第0-3列
y = df.iloc[:,4].values #提取第4列

2、展示数据特征

from matplotlib import pyplot as plt
import math#展示标签
label_dict = {1: 'Iris-Setosa',2: 'Iris-Versicolor',3: 'Iris-Virgnica'}#展示特征
feature_dict = {0: 'sepal length [cm]',1: 'sepal width [cm]',2: 'petal length [cm]',3: 'petal width [cm]'}# 指定绘图区域大小
plt.figure(figsize=(8, 6))
for cnt in range(4): # 这里用子图来呈现4个特征plt.subplot(2, 2, cnt+1)for lab in ('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'):plt.hist(X[y==lab, cnt],label=lab,bins=10,alpha=0.3,)plt.xlabel(feature_dict[cnt])plt.legend(loc='upper right', fancybox=True, fontsize=8)plt.tight_layout()
plt.show()

3、数据标准化

一般情况下,在进行训练前,数据经常需要进行标准化处理。

from sklearn.preprocessing import StandardScaler
#计算训练集的平均值和标准差,以便测试数据集使用相同的变换。
X_std = StandardScaler().fit_transform(X)
print (X_std)

4.计算协方差

方差:
最先提到的一个概念,也是旋转坐标轴的依据。之所以使用方差作为旋转条件是因为:最大方差给出了数据的最重要的信息。
var⁡(X)=∑i−1n(Xi−Xˉ)(Xi−Xˉ)n−1\operatorname{var}(X)=\frac{\sum_{i-1}^{n}\left(X_{i}-\bar{X}\right)\left(X_{i}-\bar{X}\right)}{n-1}var(X)=n−1∑i−1n​(Xi​−Xˉ)(Xi​−Xˉ)​

协方差:
用来衡量两个变量的总体误差,方差是协方差的一种特殊情况,即当两个变量相同。可以通俗的理解为:两个变量在变化过程中是否同向变化?还是反方向变化?同向或反向程度如何?取值为负∞到正∞仿照方差的定义,度量各个维度偏离其均值的程度,定义为:
cov⁡(X,Y)=∑i−1n(Xi−X)(Yi−Y)n−1\operatorname{cov}(X, Y)=\frac{\sum_{i-1}^{n}\left(X_{i}-X\right)\left(Y_{i}-Y\right)}{n-1} cov(X,Y)=n−1∑i−1n​(Xi​−X)(Yi​−Y)​

由协方差的定义可以推出两个性质:
1⋅cov⁡(X,X)=var⁡(X)\quad 1 \cdot\operatorname{cov}(X, X)=\operatorname{var}(X) 1⋅cov(X,X)=var(X)
2⋅cov⁡(X,Y)=cov⁡(Y,X)\quad 2 \cdot \operatorname{cov}(X, Y)=\operatorname{cov}(Y, X)2⋅cov(X,Y)=cov(Y,X)

协方差矩阵:
协方差只能处理二维问题(即两个特征X,Y),维数多了自然需要计算多个协方差,比如n维的数 据集需要计算 n!(n−2)!∗2\frac{n !}{(n-2) ! * 2}(n−2)!∗2n!​ 个协方差,自然而然我们会想到使用矩阵来组织这些数据,协方差定义:
Cn×n=(ci,j,ci,j=cov⁡(Dim⁡i,Dim⁡j))C_{n \times n}=\left(c_{i, j}, c_{i, j}=\operatorname{cov}\left(\operatorname{Dim}_{i}, \operatorname{Dim}_{j}\right)\right)Cn×n​=(ci,j​,ci,j​=cov(Dimi​,Dimj​))
C=(cov⁡(x,x)cov⁡(x,y)cov⁡(x,z)cov⁡(y,x)cov⁡(y,y)cov⁡(y,z)cov⁡(z,x)cov⁡(z,y)cov⁡(z,z))C=\left(\begin{array}{lll}\operatorname{cov}(x, x) & \operatorname{cov}(x, y) & \operatorname{cov}(x, z) \\ \operatorname{cov}(y, x) & \operatorname{cov}(y, y) & \operatorname{cov}(y, z) \\ \operatorname{cov}(z, x) & \operatorname{cov}(z, y) & \operatorname{cov}(z, z)\end{array}\right)C=⎝⎛​cov(x,x)cov(y,x)cov(z,x)​cov(x,y)cov(y,y)cov(z,y)​cov(x,z)cov(y,z)cov(z,z)​⎠⎞​

可见,协方差是一个对称的矩阵,且对角线是各维度上的方差。正是由于协方差矩阵为对称矩阵所以矩阵分解后特征值所对应的特征向量一定无线性关系,且相互之间一定正交,即内积为零。

#计算协方差
mean_vec = np.mean(X_std, axis=0)#均值
cov_mat = (X_std - mean_vec).T.dot((X_std - mean_vec)) / (X_std.shape[0]-1)
print('Covariance matrix \n%s' %cov_mat)

print('NumPy covariance matrix: \n%s' %np.cov(X_std.T))#numpy更简单

5.特征值和特征向量

对协方差矩阵的特征向量最直观的解释之一是它总是指向数据方差最大的方向(上面的u、v)。所以我们需要求得协方差矩阵,然后计算出其特征向量,通过对特征值的排序,选出我们要求的N个特征向量(即N个最重要特征的真实结构),用原数据乘上这N个特征向量而将它转换到新的空间中。(在numpy中linalg的eig方法可以求得特征值、特征向量,对特征值排序后选择最大的特征向量)

将二维特征降转为一维效果如下图(其它维数脑补):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlbLiKsj-1640161972021)

cov_mat = np.cov(X_std.T)#协方差矩阵eig_vals, eig_vecs = np.linalg.eig(cov_mat)
#特征值和特征向量的提取print('Eigenvectors \n%s' %eig_vecs)#特征向量
print('\nEigenvalues \n%s' %eig_vals)#特征值 表示特征向量的重要程度

# Make a list of (eigenvalue, eigenvector) tuples创建一个(特征值,特征向量)元组的列表
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))]
print (eig_pairs)
print ('----------')
# Sort the (eigenvalue, eigenvector) tuples from high to low将(特征值,特征向量)元组从高到低排序
eig_pairs.sort(key=lambda x: x[0], reverse=True)# Visually confirm that the list is correctly sorted by decreasing eigenvalues
#视觉上确认列表是按特征值递减的顺序正确排序的
print('Eigenvalues in descending order:')
for i in eig_pairs:print(i[0])

#特征值归一化
tot = sum(eig_vals)
var_exp = [(i / tot)*100 for i in sorted(eig_vals, reverse=True)]
print (var_exp)
cum_var_exp = np.cumsum(var_exp)#元素累计和
cum_var_exp

6.特征值的可视化


plt.figure(figsize=(6, 4))plt.bar(range(4), var_exp, alpha=0.5, align='center',label='individual explained variance')
plt.step(range(4), cum_var_exp, where='mid',label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal components')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

7.降维

#取两个特征值最大的对应的两个特征向量构成映射基
matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1),eig_pairs[1][1].reshape(4,1)))print('Matrix W:\n', matrix_w)

#降维
Y = X_std.dot(matrix_w)#取两数的乘积
Y

8.效果对比

plt.figure(figsize=(6, 4))
#没有做降维处理,随机取两个特征
for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'),('blue', 'red', 'green')):plt.scatter(X[y==lab, 0],X[y==lab, 1],label=lab,c=col)
plt.xlabel('sepal_len')
plt.ylabel('sepal_wid')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

plt.figure(figsize=(6, 4))
#PCA降维处理后的两个组成的特征
for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'),('blue', 'red', 'green')):plt.scatter(Y[y==lab, 0],Y[y==lab, 1],label=lab,c=col)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend(loc='lower center')
plt.tight_layout()
plt.show()

PCA主成分分析实战案例相关推荐

  1. PCA主成分分析实战和可视化 | 附R代码和测试数据

    一文看懂PCA主成分分析中介绍了PCA分析的原理和分析的意义(基本简介如下,更多见博客),今天就用数据来实际操练一下.(注意:用了这么多年的PCA可视化竟然是错的!!!) 在公众号后台回复**&quo ...

  2. 一文看懂PCA主成分分析

    前言 NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞测序分析 (重磅综述:三万字 ...

  3. R语言PCA主成分分析(Principle Component Analysis)实战2

    R语言PCA主成分分析(Principle Component Analysis)实战2 目录 R语言PCA主成分分析(Principle Component Analysis)实战2 #案例分析

  4. R语言PCA主成分分析(Principle Component Analysis)实战1

    R语言PCA主成分分析(Principle Component Analysis)实战1 目录 R语言PCA主成分分析(Principle Component Analysis)实战1 #案例分析

  5. R语言PCA主成分分析(Principle Component Analysis)与线性回归结合实战

    R语言PCA主成分分析(Principle Component Analysis)与线性回归结合实战 目录 R语言PCA主成分分析(Principle Component Analysis)与线性回归 ...

  6. PCA(主成分分析-principal components analysis)学习笔记以及源代码实战讲解

    PCA(主成分分析-principal components analysis)学习笔记以及源代码实战讲解 文章目录 PCA(主成分分析-principal components analysis)学 ...

  7. 【第 07 章 基于主成分分析的人脸二维码识别MATLAB深度学习实战案例】

    基于主成分分析的人脸二维码识别MATLAB深度学习实战案例 人脸库 全套文件资料目录下载链接–>传送门 本文全文源码下载[链接–>传送门] 如下分析: 主文件 function varar ...

  8. 数据分析实战:python热门音乐分析 附代码+数据 +论文(PCA 主成分分析,sklearn 机器学习,pytorch 神经网络,k-means 聚类,Librosa 音频处理,midi 音序)

    项目概述: 本选取了抖音当下最热门的 400 首音乐,通过一系列方法提取每首歌的波形特征,再经过降维以及机器学习等手段,进行无监督学习对音乐数据进行聚类的同时训练并使用监督学习分类器进行音乐流派分类, ...

  9. pca 主成分分析_六分钟的主成分分析(PCA)的直观说明。

    pca 主成分分析 Principle Component Analysis (PCA) is arguably a very difficult-to-understand topic for be ...

最新文章

  1. component是什么接口_【Android每日一题】从Activity创建到View呈现中间发生了什么?...
  2. 商汤AI小学教材来了,动动手玩乐高就能搭建机器人
  3. 技术人员如何转型为产品经理
  4. ai包装插件_找AI插件很费劲,一次给你66款AI插件合集!每一款都是设计师常用...
  5. 小学一年级第一次上计算机课,小学一年级上册信息技术教案【三篇】
  6. MapReduce读取本地文件,而不是HDSF上的文件
  7. android消息响应实验报告,android实验一实验报告-20210401011015.docx-原创力文档
  8. 安装sql server 2000
  9. PHP 循环时间控制缓冲方法
  10. 用商业模式改变世界(上)
  11. 沟通CTBS,加快山东海化金蝶EAS远程接入
  12. 502 (Bad Gateway) 原因及解决方法
  13. 清华毕业程序员国企干了14年,去应聘小公司,看到工资后愣了
  14. douyin网页版登录加密分析(一)
  15. 如何申请Xilinx评估版本ip核license
  16. 二叉树面试题:前中序求后序、中后序求前序
  17. python-OpenCV图像处理常用函数汇总(三)
  18. Android 11 适配更新APK安装
  19. 数据分析excel计算环比与同比以及常用函数:
  20. 磁共振血管造影/MRI造影/钡磷灰石显影剂/新型含氟药物氟代吲哚美辛PET显影剂

热门文章

  1. 在github上删除项目和删除项目中的某个文件
  2. 移动互联网的“约炮经济学”
  3. Ubuntu删除文件和文件夹命令
  4. vue3+ts+element封装一个简易的curd
  5. Centered Interval tree 介绍(中心区间树)
  6. 互联网金融银行卡身份证识别
  7. Java 银行卡和身份证号根据校验位验证是否合法
  8. Mina Executor Filter执行线程模型过滤器
  9. 强制刷新网页 html,网页强制刷新快捷键是哪个?
  10. 网络编程_HTTP协议_Web服务器_(TCP3次握手4次挥手,长短连接,伪静态、静态和动态)