主成分分析(PCA)及其可视化——python

可以看看这个哦python入门:Anaconda和Jupyter notebook的安装与使用_菜菜笨小孩的博客-CSDN博客

如果你学会了python 可以看看matlab的哦

主成分分析(PCA)及其可视化——matlab_菜菜笨小孩的博客-CSDN博客

目录

一、主成分分析的原理

二、主成分分析步骤

1.主成分分析的步骤:

2.部分说明

(1)球形检验(Bartlett)

(2)KMO(Kaiser-Meyer-Olkin)统计量

(3)主成分分析的逻辑框图

三、所用到的库 factor_analyzer库

四、案例实战

1.数据集

2.导入库

3.读取数据集

4.进行球状检验

5.KMO检验

6.求相关矩阵

(1)数据标准化做法

1.进行标准化

2.求相关系数矩阵

​ 3.求解特征值和特征向量

(2)数据不标准化做法

1.求均值

2.查看列数和行数

3.写出同数据集一样的均值矩阵

4.对数据集进行去中心化

5.计算协方差阵

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

7.对特征值进行排序并输出 降序

8.绘制散点图和折线图

9.求特征值的贡献度

10.求特征值的累计贡献度

11.选出主成分

12.选出主成分对应的特征向量矩阵

13.求主成分得分

14.绘制热力图

完整代码:

总结:

一、主成分分析的原理

主成分分析是利用降维的思想,在损失很少信息的前提下把多个指标转化为几个综合指标的多元统计方法。通常把转化生成的综合指标称之为主成分,其中每个主成分都是原始变量的线性组合,且各个主成分之间互不相关,这就使得主成分比原始变量具有某些更优越的性能。这样在研究复杂问题时就可以只考虑少数几个主成分而不至于损失太多信息,从而更容易抓住主要矛盾,揭示事物内部变量之间的规律性,同时使问题得到简化,提高分析效率。

主成分分析正是研究如何通过原来变量的少数几个线性组合来解释原来变量绝大多数信息的一种多元统计方法。

二、主成分分析步骤

1.主成分分析的步骤:

1.根据研究问题选取初始分析变量;

2.根据初始变量特性判断由协方差阵求主成分还是由相关阵求主成分(数据 标准化的话需要用系数相关矩阵,数据 未标准化则用协方差阵);

3.求协差阵或相关阵的特征根与相应标准特征向量;

4.判断是否存在明显的多重共线性,若存在,则回到第一步;

5.主成分分析的适合性检验

6.得到主成分的表达式并确定主成分个数,选取主成分;

7.结合主成分对研究问题进行分析并深入研究。

2.部分说明

一组数据是否可以用主成分分析,必须做适合性检验。可以用球形检验和KMO统计量检验。 (1)球形检验(Bartlett)

球形检验的假设:

H0:相关系数矩阵为单位阵(即变量不相关)

H1:相关系数矩阵不是单位阵(即变量间有相关关系)

2)KMO(Kaiser-Meyer-Olkin)统计量

KMO统计量比较样本相关系数与样本偏相关系数,它用于检验样本是否适于作主成分分析。

KMO的值在0,1之间,该值越大,则样本数据越适合作主成分分析和因子分析。一般要求该值大于0.5,方可作主成分分析或者相关分析。

Kaiser在1974年给出了经验原则:

0.9以上 适合性很好

0.8~0.9 适合性良好

0.7~0.8 适合性中等

0.6~0.7 适合性一般

0.5~0.6 适合性不好

0.5以下 不能接受的

(3)主成分分析的逻辑框图

主成分分析(PCA)及其可视化——python

三、所用到的库 factor_analyzer库

  1. pandas
pip instal  pandas

2.numpy

pip install numpy

3.matplotlib

pip install matplotlib

四、案例实战

1.数据集

数据集aa.xls – 蓝奏云 不能直接分享csv文件

2.导入库

导入数据处理和分析所需要的库:

数据处理
import pandas as pd
import numpy as np

绘图
import seaborn as sns
import matplotlib.pyplot as plt

3.读取数据集

df = pd.read_csv(r"D:\桌面\aa.csv", encoding='gbk', index_col=0).reset_index(drop=True)
df

运行结果:

主成分分析(PCA)及其可视化——python

4.进行球状检验

检验总体变量的相关矩阵是否是单位阵(相关系数矩阵对角线的所有元素均为1,所有非对角线上的元素均为零);即检验各个变量是否各自独立。

Bartlett's球状检验
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity

chi_square_value, p_value = calculate_bartlett_sphericity(df)
print(chi_square_value, p_value)

运行结果:

主成分分析(PCA)及其可视化——python

5.KMO检验

检查变量间的相关性和偏相关性,取值在0-1之间;KOM统计量越接近1,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。

KMO检验
检查变量间的相关性和偏相关性,取值在0-1之间;KOM统计量越接近1,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。
通常取值从0.6开始进行因子分析
from factor_analyzer.factor_analyzer import calculate_kmo

kmo_all, kmo_model = calculate_kmo(df)
print(kmo_all)

运行结果:

主成分分析(PCA)及其可视化——python

6.求相关矩阵

(1)数据标准化做法

1.进行标准化

用到了 preprocessing 库

怎么导入:

from sklearn import preprocessing

标准化代码:

df = preprocessing.scale(df)
df

结果:

主成分分析(PCA)及其可视化——python

2.求相关系数矩阵

为了方面下面引用,就和协方差阵的赋值符号一样了!!

covX = np.around(np.corrcoef(df.T),decimals=3)
covX

运行结果:

主成分分析(PCA)及其可视化——python
featValue, featVec=  np.linalg.eig(covX.T)  #求解系数相关矩阵的特征值和特征向量
featValue, featVec

运行结果:

主成分分析(PCA)及其可视化——python

(2)数据不标准化做法

1.求均值

def meanX(dataX):
    return np.mean(dataX,axis=0)#axis=0表示依照列来求均值。假设输入list,则axis=1
average = meanX(df)
average

运行结果:

主成分分析(PCA)及其可视化——python

2.查看列数和行数

m, n = np.shape(df)
m,n

运行结果:

主成分分析(PCA)及其可视化——python

3.写出同数据集一样的均值矩阵

data_adjust = []
avgs = np.tile(average, (m, 1))
avgs

运行结果:

主成分分析(PCA)及其可视化——python

4.对数据集进行去中心化

data_adjust = df - avgs
data_adjust

运行结果:

主成分分析(PCA)及其可视化——python

5.计算协方差阵

covX = np.cov(data_adjust.T)   #计算协方差矩阵
covX

运行结果:

主成分分析(PCA)及其可视化——python

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

featValue, featVec=  np.linalg.eig(covX)  #求解协方差矩阵的特征值和特征向量
featValue, featVec

运行结果:

主成分分析(PCA)及其可视化——python

下面的做法不再区分标不标准化了,你上面用哪种都行

在这里仅拿为标准化做法的数据进行下面操作!!!

7.对特征值进行排序并输出 降序

featValue = sorted(featValue)[::-1]
featValue

运行结果:

主成分分析(PCA)及其可视化——python

8.绘制散点图和折线图

同样的数据绘制散点图和折线图
plt.scatter(range(1, df.shape[1] + 1), featValue)
plt.plot(range(1, df.shape[1] + 1), featValue)

显示图的标题和xy轴的名字
最好使用英文,中文可能乱码
plt.title("Scree Plot")
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")

plt.grid()  # 显示网格
plt.show()  # 显示图形

运行结果:

主成分分析(PCA)及其可视化——python

9.求特征值的贡献度

gx = featValue/np.sum(featValue)
gx

运行结果:

主成分分析(PCA)及其可视化——python

10.求特征值的累计贡献度

lg = np.cumsum(gx)
lg

运行结果:

主成分分析(PCA)及其可视化——python

11.选出主成分

#选出主成分
k=[i for i in range(len(lg)) if lg[i]<0.85] k="list(k)" print(k)< code></0.85]>

运行结果:

主成分分析(PCA)及其可视化——python

12.选出主成分对应的特征向量矩阵

selectVec = np.matrix(featVec.T[k]).T
selectVe=selectVec*(-1)
selectVec

运行结果:

主成分分析(PCA)及其可视化——python

13.求主成分得分

finalData = np.dot(data_adjust,selectVec)
finalData

运行结果:

主成分分析(PCA)及其可视化——python

14.绘制热力图

&#x7ED8;&#x56FE;

plt.figure(figsize = (14,14))
ax = sns.heatmap(selectVec, annot=True, cmap="BuPu")

&#x8BBE;&#x7F6E;y&#x8F74;&#x5B57;&#x4F53;&#x5927;&#x5C0F;
ax.yaxis.set_tick_params(labelsize=15)
plt.title("Factor Analysis", fontsize="xx-large")

&#x8BBE;&#x7F6E;y&#x8F74;&#x6807;&#x7B7E;
plt.ylabel("Sepal Width", fontsize="xx-large")
&#x663E;&#x793A;&#x56FE;&#x7247;
plt.show()

&#x4FDD;&#x5B58;&#x56FE;&#x7247;
plt.savefig("factorAnalysis", dpi=500)

运行结果:

主成分分析(PCA)及其可视化——python

完整代码:

数据处理
import pandas as pd
import numpy as np

绘图
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv(r"D:\桌面\aa.csv", encoding='gbk', index_col=0).reset_index(drop=True)
print(df)

Bartlett's球状检验
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity

chi_square_value, p_value = calculate_bartlett_sphericity(df)
print(chi_square_value, p_value)

KMO检验
检查变量间的相关性和偏相关性,取值在0-1之间;KOM统计量越接近1,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。
通常取值从0.6开始进行因子分析
from factor_analyzer.factor_analyzer import calculate_kmo

kmo_all, kmo_model = calculate_kmo(df)
print(kmo_all)

#标准化

#所需库
from sklearn import preprocessing
#进行标准化
df = preprocessing.scale(df)
print(df)

#求解系数相关矩阵
covX = np.around(np.corrcoef(df.T),decimals=3)
print(covX)

#求解特征值和特征向量
featValue, featVec=  np.linalg.eig(covX.T)  #求解系数相关矩阵的特征值和特征向量
print(featValue, featVec)

#不标准化
#均值
def meanX(dataX):
    return np.mean(dataX,axis=0)#axis=0表示依照列来求均值。假设输入list,则axis=1
average = meanX(df)
print(average)

#查看列数和行数
m, n = np.shape(df)
print(m,n)

#均值矩阵
data_adjust = []
avgs = np.tile(average, (m, 1))
print(avgs)

#去中心化
data_adjust = df - avgs
print(data_adjust)

#协方差阵
covX = np.cov(data_adjust.T)   #计算协方差矩阵
print(covX)

#计算协方差阵的特征值和特征向量
featValue, featVec=  np.linalg.eig(covX)  #求解协方差矩阵的特征值和特征向量
print(featValue, featVec)

####下面没有区分#######

#对特征值进行排序并输出 降序
featValue = sorted(featValue)[::-1]
print(featValue)

#绘制散点图和折线图
同样的数据绘制散点图和折线图
plt.scatter(range(1, df.shape[1] + 1), featValue)
plt.plot(range(1, df.shape[1] + 1), featValue)

显示图的标题和xy轴的名字
最好使用英文,中文可能乱码
plt.title("Scree Plot")
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")

plt.grid()  # 显示网格
plt.show()  # 显示图形

#求特征值的贡献度
gx = featValue/np.sum(featValue)
print(gx)

#求特征值的累计贡献度
lg = np.cumsum(gx)
print(lg)

#选出主成分
k=[i for i in range(len(lg)) if lg[i]

总结:

几经周转终于完成了matlab和python的主成分分析,也学到了很多,也体会到了完成时的成就感

本文中遇到的问题,矩阵相乘,只能两两相乘,索引方式区别于matlab,但也有很多库类似,比如 cumsum python需调用numpy库使用,等等,如果本文有错误请大家多多指正,谢谢!!!

Original: https://blog.csdn.net/qq_25990967/article/details/121366143
Author: 洋洋菜鸟
Title: 主成分分析(PCA)及其可视化——python

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/785316/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Pandas总结】第四节 Pandas 缺失值处理(通过实例进行演示)

    文章目录 核心知识点 * 一、检测空值: isnull() notnull() 二、删除空值: dropna() 三、填充空值: fillna() 实例 * 结果对比 一、读入数据…

    Python 2023年8月18日
    055
  • 0 基础 Java 自学之路(2021年最新版)

    微信搜索【程序员囧辉】,关注这个坚持分享技术干货的程序员。 如果你想自学 Java,认真看完本文,你以后的职场生涯至少少走1年弯路。 本文会持续更新,建议收藏。 在 CSDN 上经…

    Python 2023年10月7日
    030
  • 如何使用Python 绘制惊艳众人的瀑布图

    Original: https://www.cnblogs.com/123456feng/p/16092847.htmlAuthor: 蚂蚁ailingTitle: 如何使用Pyt…

    Python 2023年11月9日
    035
  • Scrapy多个spider时item和PIPELINES的设置

    Scrapy多个spider时item和PIPELINES的设置: 一.同时运行多个spider 在项目目录下创建crawl.py文件,代码如下: from scrapy.craw…

    Python 2023年10月3日
    052
  • 零售商店订单数据分析

    目录 一、项目背景 二、数据来源 三、提出问题 四、理解数据 五、数据清洗 1.导入数据 2.选择子集 3.删除重复值 4.缺失值处理 5.标准化处理 6.异常值处理 六、分析内容…

    Python 2023年8月8日
    061
  • Web3.0:伟大的骗局,请无辜的各位做一个敢于大声说出来的孩子吧

    雅痞注:在寒冷的熊市给大家泼一盆冷水不是我选择本文的本意,我希望每个人都能理性的对待投资,要深刻的做自己的研究。在你们作为区块链技术忠实拥趸的同时,请开启上帝视角,让我们站在空中看…

    Python 2023年9月27日
    034
  • 高级前端进阶(六)

    最近有个需求,就是上传图片的时候,图片过大,需要压缩一下图片再上传。需求虽然很容易理解,但要做到,不是那么容易的。 一、图片URL转Blob(图片大小不变) 注意点:图片不能跨域!…

    Python 2023年10月22日
    061
  • 那些舍不得删除的 MP3–批量修改mp3的ID3tag

    整理电脑时发现很多mp3。那是大约2001年至2009年之间。那个时候大家听歌,还是习惯从网上下载mp3。虽然现在听歌比从前方便多了,简单到只需在APP中输入歌名,但用播放器听mp…

    Python 2023年11月1日
    039
  • 向量距离与相似度函数

    1. 常见的距离计算方式 1.5 海明距离(Hamming Distance) 在信息论中,两个等长字符串之间的海明距离是两个字符串对应位置的不同字符的个数。假设有两个字符串分别是…

    Python 2023年10月25日
    042
  • Pytest实战

    Pytest测试框架是动态语言Python专用的测试框架,使用起来非常的简单,这主要得易于它的设计,Pytest测试框架具备强大的功能,丰富的第三方插件,以及可扩展性好,可以很好的…

    Python 2023年9月12日
    061
  • C# Log4net配置文件 总结

    前言 因为项目日志太杂乱而且很大,打开一个就卡死了,何况用户电脑也扛不住日志积累,要做一个日志记录器管理日志。但对里面的配置有一些不熟悉(毕竟都是复制粘贴的),所以记录一下各个项的…

    Python 2023年10月12日
    041
  • DataFrame(11):数据转换——map()函数的使用

    1、map()函数 1)map()函数作用 将序列中的每一个元素,输入函数,最后将映射后的每个值返回合并,得到一个迭代器。 2)map()函数原理图 原理解释:上图有一个列表,元素…

    Python 2023年8月23日
    063
  • 开源数字基础设施 项目 — Speckle

    Speckle是用于 3D 设计的任何东西的开源数字基础设施。处理软件孤岛、实时协作、数据管理、版本控制和自动化之间的互操作性。致力于构建一个开源代码平台,让建筑设计工作者能够协作…

    Python 2023年10月18日
    070
  • 美多商城之商品(商品详情页)

    六、商品详情页 6.1 商品详情页分析和准备 6.1.1. 商品详情页组成结构分析 1.商品频道分类 已经提前封装在 contents.utils.py文件中,直接调用方法即可。 …

    Python 2023年8月6日
    092
  • springcloud3 EurekaClient集群的搭建2

    一 概述 1.1 概述 本文主要是搭建集成eurekaserver的几个客户端,即服务提供者,消费者。架构图如下所示 1.2 使用eureka整合的优点 使用Eureka管理注册的…

    Python 2023年9月17日
    040
  • Pandas最详细教程来了!

    导读:在Python中,进行数据分析的一个主要工具就是Pandas。Pandas是Wes McKinney在大型对冲基金AQR公司工作时开发的,后来该工具开源了,主要由社区进行维护…

    Python 2023年8月19日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球