主成分分析(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系统路径找不…

c语言结构体多门成绩排序,c语言结构体按学号排序求大神帮忙改一下吧

struct record{char code[LEN1]; /* 学号 */char name[LEN1]; /* 姓名 */int age; /* 年龄 */char sex[3]; /* 性别 */char time[LEN1]; /* 出生年月 */char add[30]; /* 家庭地址 */char tel[LEN1]; /* 电话号码 */char mail[30]; /* 电子邮件地址 */}stu[N];int k1,n,m; /* 定…

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

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

Session 'app': Installation did not succeed.The application could not be installed: INSTALL FAILED I

在Android Studio中使用模拟器进行调试的时候&#xff0c;会出现错误信息无法进行模拟器调试 错误信息 Session app: Installation did not succeed.The application could not be installed: INSTALL FAILED INSUFFICIENT STORAGE Retry要想解决这个问题&#xff0c;我们首先…

c语言音像店程序,音像店管理程序_C 课程设计.pdf

课 程 设 计 报 告课程名称 C 语言课程设计课题名称 音像店管理程序专 业 信息安全班 级 信安1501学 号 1151290113姓 名 李浩东指导教师 姜力争2016 年 1 月 1 日 课题设计内容与主要功能音像店管理程序设计一个利用文件处理形式实现音像店基本功能的程序&#xff0c;具有增…

手把手教你爬虫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版本之后就搜索不到了…

给定4个数字组合的C语言算法,leetcode 454. 四数相加 II c语言

如题&#xff1a;给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。为了使问题简单化&#xff0c;所有的 A, B, C, D 具有相同的长度 N&#xff0c;且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - …

图片弹框

用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; …

c语言备忘录算法矩阵链乘,矩阵链乘法(备忘录法)

/** fileMemoMatrixchain.cpp* briefa solution of martrix chain with memorized way.* author/Univ.taoxiaoxiao/XMU* versionv1.0* date11-3-2013*///实例 A1-A6&#xff1a;30X35 35X15 15X5 5X10 10X20 20X25#include #include using namespace std;#define N 6#define IN…

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

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

关闭线程 C语言,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

【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;然后再…

android launcher 字体大小,Android6.0 Launcher3 修改app字体大小

在原生的Android6.0中&#xff0c;在修改了系统字体大小后&#xff0c;Launcher 3上的app字体大小没有改变&#xff0c;下面方法可以解决&#xff1a;--- a/packages/apps/Launcher3/src/com/android/launcher3/BubbleTextView.java b/packages/apps/Launcher3/src/com/android…

Js常用40个页面效果

1.彻底屏蔽鼠标右键 οncοntextmenu"window.event.returnValuefalse" <table border οncοntextmenureturn(false)><td>no</table> 可用于Table取消选取、防止复制 <body onselectstart"return false"> 3.不准粘贴 οnpaste&qu…