PCA主成分分析实战案例

article/2025/5/16 22:04:41

遇到的问题:

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 − 1 n ( X i − X ˉ ) ( X i − 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)=n1i1n(XiXˉ)(XiXˉ)

协方差:
用来衡量两个变量的总体误差,方差是协方差的一种特殊情况,即当两个变量相同。可以通俗的理解为:两个变量在变化过程中是否同向变化?还是反方向变化?同向或反向程度如何?取值为负∞到正∞仿照方差的定义,度量各个维度偏离其均值的程度,定义为:
cov ⁡ ( X , Y ) = ∑ i − 1 n ( X i − X ) ( Y i − 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)=n1i1n(XiX)(YiY)

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

协方差矩阵:
协方差只能处理二维问题(即两个特征X,Y),维数多了自然需要计算多个协方差,比如n维的数 据集需要计算 n ! ( n − 2 ) ! ∗ 2 \frac{n !}{(n-2) ! * 2} (n2)!2n! 个协方差,自然而然我们会想到使用矩阵来组织这些数据,协方差定义:
C n × n = ( c i , j , c i , 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()

在这里插入图片描述


http://chatgpt.dhexx.cn/article/CfPCSpMX.shtml

相关文章

主成分分析法概述、案例实例分析

http://hi.baidu.com/weizican/blog/item/9e816926f2977521d5074257.html 主成分分析法 主成分分析也称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。在实证问题研究中,为了全面、系统地分析问题,我们必须考虑…

清风数学建模学习笔记——主成分分析(PCA)原理详解及案例分析

主成分分析 本文将介绍主成分分析(PCA),主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息。 一般来说,当…

多元统计及R语言案例分析 (主成分和因子分析对学生成绩神秘联系分析)

嗨喽! 大家好,我是“流水不争先,争得滔滔不绝”的翀,18双非本科生一枚,正在努力!欢迎大家来交流学习,一起学习数据分析,希望我们一起好好学习,天天向上,目前是小社畜一枚…

超详细SPSS主成分分析计算指标权重(一)

一、指标权重计算确定的困惑 相信很多写过或者正在写指标处理类论文的朋友都曾对如何计算指标权重充满困惑,到底是用熵值法,还是主成分分析法?或者其他各种看起来奥妙无穷却难以上手操作的神奇方法?好不容易确定要选用主成分分析…

一文读懂 主成分分析 与 因子分析

2023-2-20更新:  修改了一些文字错误,优化了排版,增加了一些拓展内容,祝大家学业有成!(期待三连😁😁) 目录 一、 主成分分析二、因子分析三、多元共线性问题简介3.1 多…

主成分之综合竞争力案例分析

一、案例背景 1.案例说明 研究调查100家公司2010-2013年关于财务方面的具体数据,这些财务指标维度分别为盈利能力、偿债能力、运营能力、发展能力以及公司治理。其中每个维度分别有几个分析项,但是有些指标是越大越好,有些指标是越小越好。…

数据分析,主成分分析例题

已知协方差矩阵求X的各主成分以及主成分的贡献率 主成分分析 原理:找出几个综合变量来代替原来众多的变量,使这些综合变量能尽可能地代表原来变量的信息量,且彼此之间互不相关 统计方法:主成分分析(主分量分析&…

主成分分析PCA案例及原理

1. 主成分分析PCA案例 https://blog.csdn.net/goodshot/article/details/78080220 http://www.cnblogs.com/zhangchaoyang/articles/2222048.html 附: 使用上方链接的解释: 2. 主成分分析(PCA)原理总结http://www.cnblogs.com/pinard/p/623…

主成分分析简单例子

一、数据降维 对于现在维数比较多的数据,我们首先需要做的就是对其进行降维操作。降维,简单来说就是说在尽量保证数据本质的前提下将数据中的维数降低。降维的操作可以理解为一种映射关系,例如函数,即由原来的二维转换成了一维。处…

spss分析方法-主成分分析

spss分析方法-主成分分析(转载) 主成分分析利用的是“降维”的思想,利用原始变量的线性组合组成主成分。在信息损失较小的前提下,把多个指标转化为几个互补相关的综合指标。下面我们主要从下面四个方面来解说: 实际…

主成分分析案例

去百度文库上一搜,是很老的题目了。这里所做的只是准备工作,为后面更多的数据处理做准备。 例题 1.对原始资料矩阵进行标准化处理 zef_data xlsread(chengshi.xls); z zscore(zef_data) z 1.1977 0.7149 0.6674 1.1390 0.9189 3.111…

快速搞定PCA(主成分分析)(原理 代码 案例)

目录 一、基本介绍 1.1原理 1.2主成分分析的几何解释 1.3主要步骤 1.4主成分个数的选取原则 二、主成分分析代码 2.1MATLAB代码 2.2Python代码 三、实用案例 一、基本介绍 1.1原理 主成分分析是最常用的线性降维方法,通过某种线性投影,将高维的数…

【机器学习】主成分分析实现案例 (PCA)

一、说明 这篇文章的目的是提供主成分分析(PCA)的完整和简化的解释。我们将逐步介绍它是如何工作的,这样每个人都可以理解并使用它,即使是那些没有强大数学背景的人。 PCA是网络上广泛覆盖的机器学习方法,并且有一些关…

什么是主成分分析?经典案例解析变量降维

1、作用 主成分分析将多个有一定相关性的指标进行线性组合,以最少的维度解释原数据中尽可能多的信息为目标进行降维,降维后的各变量间彼此线性无关,最终确定的新变量是原始变量的线性组合,且越往后主成分在方差中的比重也小&…

比较两篇文章的相似性方法

对于这个题目,开始毫无头绪,后来经过查阅资料现在讲方法总结如下: 1、利用余弦定理 我们知道向量 a,b之间的夹角可用余弦定理求得: 如果夹角的余弦值越小,那么夹角也越大。如果2个向量相等,那么其值为1。利…

Python案例分析|文本相似度比较分析

本案例通过设计和实现有关文本相似度比较的类Vector和Sketch,帮助大家进一步掌握设计Python类来解决实际问题的能力。 01、文本相似度比较概述 通过计算并比较文档的摘要可实现文本的相似度比较。 文档摘要的最简单形式可以使用文档中的k-grams(k个连…

计算机如何判断两篇文章相似性

这个仍然是极客时间上,关于《索引技术核心20讲》的一篇笔记同时结合自己的理解加了点料,这个专栏虽然只有20讲,但是真不错,老师解答问题还是很积极,回答字数经常比问题字数多。有兴趣的朋友可以到我星球(在…

ai写文章检测原理(文章相似度检测)

小编来了!今天要和大家聊一聊关于ai写文章检测原理的评测对比。究竟哪种方法更加高效准确呢?让我们一起来看看吧! 概括:本文将从多个角度对ai写文章检测原理进行评测对比,包括算法准确性、速度、自动化程度、用户体验…

【跨语言剽窃检测】文本相似度分析之一

对比文件1: 2010年的跨语言剽窃检测新方法 作者RaFael Corezola Pereira instituion : UFRGS 摘要: 作者提出一个跨语言剽窃检测新方法,分为5个主要阶段: languange normalization、retrieval of candidate documents、classfier …

文本相似度综述

本文目录 文本相似度的定义文本相似度计算方法基于字符串的方法基于语料库的方法基于词袋VSMLSA、PLSALDA(需要进一步了解) 基于神经网络基于搜索引擎 基于世界知识基于本体基于网络知识 其他方法句法分析混合方法 文本相似度的定义 其中, common&#x…