主成分分析(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)主成分分析的逻辑框图 

 三、所用到的库 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

运行结果:

 4.进行球状检验

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

# Bartlett's球状检验
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericitychi_square_value, p_value = calculate_bartlett_sphericity(df)
print(chi_square_value, p_value)

运行结果:

5.KMO检验

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

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

运行结果:

6.求相关矩阵

(1)数据标准化做法

1.进行标准化

用到了 preprocessing 库

怎么导入:

from sklearn import preprocessing

标准化代码:

df = preprocessing.scale(df)
df

 结果:

 2.求相关系数矩阵

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

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

运行结果:

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

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

 运行结果:

(2)数据不标准化做法

1.求均值

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

运行结果:

 2.查看列数和行数

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

运行结果:

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

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

运行结果:

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

data_adjust = df - avgs
data_adjust

运行结果:

5.计算协方差阵

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

运行结果:

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

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

运行结果:


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

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

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

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

运行结果:

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()  # 显示图形

运行结果:

9.求特征值的贡献度 

gx = featValue/np.sum(featValue)
gx

运行结果:

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

lg = np.cumsum(gx)
lg

运行结果:

11.选出主成分

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

运行结果:

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

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

 运行结果:

 13.求主成分得分

finalData = np.dot(data_adjust,selectVec)
finalData

 运行结果:

 14.绘制热力图

# 绘图plt.figure(figsize = (14,14))
ax = sns.heatmap(selectVec, annot=True, cmap="BuPu")# 设置y轴字体大小
ax.yaxis.set_tick_params(labelsize=15)
plt.title("Factor Analysis", fontsize="xx-large")# 设置y轴标签
plt.ylabel("Sepal Width", fontsize="xx-large")
# 显示图片
plt.show()# 保存图片
# plt.savefig("factorAnalysis", dpi=500)

运行结果:

完整代码:

# 数据处理
import pandas as pd
import numpy as np# 绘图
import seaborn as sns
import matplotlib.pyplot as pltdf = 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_sphericitychi_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_kmokmo_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]<0.85]
k = list(k)
print(k)#选出主成分对应的特征向量矩阵
selectVec = np.matrix(featVec.T[k]).T
selectVe=selectVec*(-1)
print(selectVec)#主成分得分
finalData = np.dot(data_adjust,selectVec)
print(finalData)#绘制热力图plt.figure(figsize = (14,14))
ax = sns.heatmap(selectVec, annot=True, cmap="BuPu")# 设置y轴字体大小
ax.yaxis.set_tick_params(labelsize=15)
plt.title("Factor Analysis", fontsize="xx-large")# 设置y轴标签
plt.ylabel("Sepal Width", fontsize="xx-large")
# 显示图片
plt.show()# 保存图片
# plt.savefig("factorAnalysis", dpi=500)

总结:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT

我们安装完毕Android Studio之后&#xff0c;创建第一个项目&#xff0c;我们想要使用模拟器进行运行&#xff0c;但是当我们启动模拟器的时候却发现无法启动&#xff0c;而且出现了错误信息。 首先我们要知道错误信息是什么&#xff1f; 提示信息的意思是说“avd系统路径找不…

多元线性回归模型-数学建模类-matlab详解

如果本文有点小难理解的话&#xff0c;可以看看我之前的基础线性规划啥的&#xff0c;有lingo&#xff0c;matlab还有python 就不给大家放链接了&#xff0c;想看的话&#xff0c;点击头像即可&#xff01;&#xff01; 文章目录 &#xff08;1&#xff09;一元线性回归之旧…

手把手教你爬虫requests实战演练——python篇

文章目录 一、前言 二、实战 1&#xff09;获取百度网页并打印 2&#xff09;获取帅哥图片并下载到本地 4) 获取美女视频并下载到本地 5&#xff09;搜狗关键词搜索爬取 6&#xff09;爬取百度翻译 7&#xff09;爬取豆瓣电影榜单 8&#xff09;JK妹子爬取 总结&#xff…

Android studio 3.x 安装genymotion插件

在日常的Android开发中&#xff0c;模拟器是必不可少的&#xff0c;下面就给大家讲解一下如何在Android studio 3.x 安装genymotion插件。 对于Android studio 3.x之前的版本&#xff0c;可以直接在插件那里在线安装genymotion插件。 Android studio 3.0版本之后就搜索不到了…

图片弹框

用js实现图片弹框的特效。 效果展示 代码展示 html内容 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title></head><body><img id"myImg" src"img/c_7…

最短路径和距离及可视化——matlab

文章目录 一、前言 二、最短路线 2.1 教程 2.1.1 sparse创建稀疏矩阵 2.1.2 有向图最短路径&#xff08;1&#xff09; 2.1.3 有向图最短路径&#xff08;2&#xff09; 2.1.4 无向图最短路径&#xff08;1&#xff09; 2.1.5无向图最短路径&#xff08;2&#xff09; …

没有bug队——加贝——Python 练习实例 1,2

目录 1.题目&#xff1a; 2.题目&#xff1a; 1.题目&#xff1a; 有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的…

【OpenCV 例程300篇】250. 梯度算子的传递函数

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】250. 梯度算子的传递函数 1. 空间卷积与频域滤波 空间域图像滤波是图像与滤波器核的卷积&#xff0c;而空间卷积的傅里叶变换是频率域中相应变换的乘积&#xff0c;因此频率域图像滤波是频率域滤波器…

JS贪吃蛇

Js实现贪吃蛇小游戏。 程序解析&#xff1a; 画表格&#xff0c;画出相对应大小的表格速度的快慢调节随机生成事物的位置使用键盘的方向键控制移动位置当贪吃蛇碰到四周游戏结束&#xff0c;弹框显示效果演示 代码演示 html内容 <!DOCTYPE html> <html><he…

没有bug队——加贝——Python 练习实例 3,4

3.题目&#xff1a; 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少&#xff1f; 程序分析&#xff1a; 假设该数为 x。 1、则&#xff1a;x 100 n2, x 100 168 m2 2、计算等式&#xff1a;m2 …

lcd4linux 1602,详解一种LCD1602 的4线接法

描述虽然LCD1602的显示屏幕与显示字符都较小&#xff0c;实用性并不强&#xff0c;但是在一般的教学实验中&#xff0c;它仍不失为一个常用的输出显示设备。LCD1602与单片机连接的线路共有11条&#xff0c;其中有8条数据线&#xff0c;3条控制线。如果把它们都连接上&#xff0…

没有bug队——加贝——Python 练习实例 5,6

目录 5.题目&#xff1a; 6.题目&#xff1a; 5.题目&#xff1a; 输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 程序分析&#xff1a;我们想办法把最小的数放到x上&#xff0c;先将x与y进行比较&#xff0c;如果x>y则将x与y的值进行交换&#xff0c;然后再…

MATLAB教程(1) MATLAB 基础知识(1)

第一部分&#xff1a;MATLAB显示桌面的基本布局 桌面基础知识- MATLAB & Simulink- MathWorks 中国 1.启动MATLAB后&#xff0c;桌面会显示默认布局&#xff0c;主要有以下三个部分&#xff1a; 当前文件夹命令行窗口工作空间 2.在MATLAB中一般需要创建变量和调用函数。…

【OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域&#xff08;MSER&#xff09; 1. 最大稳定极值区域&#xff08;MSER&#xff09; 最大稳定极值区域&#xff08;MSER-Maximally Stable Extremal Regions&#xf…

电脑蹦迪

如何建立一个小程序让你的电脑蹦迪的呢&#xff1f; 效果演示 1.首先在桌面新建一个记事本 2.在里面添加如下代码 color 1A echo 电脑color 1B echo 电脑color 1C echo 电脑color 1D echo 电脑echo %0 3.保存记事本文件 4.修改后对名为.bat之后点击运行即可。

MATLAB教程(1) MATLAB 基础知识(2)

第三部分&#xff1a;数组的索引 数组索引- MATLAB & Simulink- MathWorks 中国 MATLAB中的每一个变量都是可以存储多个值的数组。如果想要使用数组中的某一个值&#xff0c;则需要用到索引。 1.单个元素的索引 从一个数组中索引某个元素一般有两种方法&#xff1a; 第…

没有bug队——加贝——Python 练习实例 7,8

7.题目&#xff1a; 将一个列表的数据复制到另一个列表中。 程序分析&#xff1a;使用列表[:]。 注&#xff1a;[:] 表示索引全部&#xff1b;[1:]表示从索引1到最后&#xff1b;[:2]表示从第一个索引到索引2前一个 a [1, 2, 3] b1 a[:] b2 a[1:] b3 a[:2] print (b1) …

云动画文字

用Js技术实现云动画文字。 效果演示 代码展示 html内容 <!doctype html> <html><head><meta charset"utf-8"><title></title><style>body {background-color:#000000;color:#555555; } h4 {font-family:sans-serif;co…

爬虫之祖urlib 简易教程

目录 一、前言框架 二、网址请求 2.1 打开网址 2.2 超时设置 2.3 错误抓取 三、更深请求 3.1 打开网址 3.2 请求头添加 3.3 链接解析 四、Robots 协议 五.万能视频下载 小彩蛋 一、前言框架 我们来学一下爬虫之祖urlib&#xff0c;不管你什么模块都是起源于该模块。…

【youcans 的 OpenCV 学习课】12. 彩色图像的处理

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】12.彩色图像的处理 文章目录【youcans 的 OpenCV 学习课】12.彩色图像的处理1. 图像的颜色空间转换图像的色彩空间基础图像的颜色空…