基于PCA/LDA的数据降维和可视化

  • Introduction
    • Project Intro
    • File Intro
    • Tools Intro
  • Code&Dataset Link
  • Process
    • Preparations of Imports
    • Initialization of data
    • PCA
      • two-dimensional
      • three-dimensional
    • LDA
      • two-dimensional
      • three-dimensional
    • Visualization
    • Comparsion
  • Conclusion
  • Reference

Introduction

Project Intro

1、结合实际应用理解数据降维;
2、采用PCA或LDA两种方法对数据集的数据进行降维,并进行可视化;
3、通过进一步查阅文献,了解相关研究方向的最新研究进展。

File Intro

Files Function
feat_before_classifier.npy 数据集;形状为720 * 1 * 1024 ,720代表720个特征向量,每个特征向量为1 * 1024大小
feat_from_resnet_set.npy 数据集;形状为720 * 8 * 1024 ,720代表720个特征向量,每个特征向量为8 * 1024大小
label.npy 数据集;形状为720,表示720个特征向量的类别
output.py 测试文件,仅用于测试数据集以及相关函数的输出,注释部分还测试了.npy文件和.txt文件的相互转化
pca_lda_dimension_reduction.py PCA及LDA降维及可视化的实现

Tools Intro

Python3+VSCode

Code&Dataset Link

GitHub:Program 1:PCA_LDA_dimension_reduction

Process

Preparations of Imports

本题需要实现PCA以及LDA的降维以及可视化,我选择从二维和三维两个维度进行呈现,必不可少的是需要引入PCA库和LDA库,以及可视化图表库。
在深度学习以及机器学习中,数据集的表示形式为.npy文件,在我使用VSCode打开的时候,VSCode提示此文件是二进制文件或使用了不支持的文本编码,无法在编辑器中显示,我最初的设想为,将其转化为.txt或者.py进行显示,但是后来发现,只需要使用numpy库中的load()函数即可,所以此库也需要引入。

##用于3D可视化
from mpl_toolkits.mplot3d import Axes3D
##用于可视化图表
import matplotlib.pyplot as plt
##用于做科学计算
import numpy as np
##导入PCA库
from sklearn.decomposition import PCA
##导入LDA库
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

对于没有的库 进行pip install +库名

Initialization of data

在引入numpy库后,使用np.load()函数进行数据的引入。在output.py文件中我能了解到,#根据测试文件output.py的输出结果,可以了解到:feat_before_classifier_set.npy以及feat_from_resnet_set.npy数据集的输出结果以三维数组的方式呈现,但是:LinearDiscriminantAnalysis expected <= 2,所以要对数据集进行reshape()处理。

#加载数据集
label=np.load("label.npy")                                  #标签信息
resnet_set=np.load("feat_from_resnet_set.npy")              #用于LDA降维
classifier_set=np.load("feat_before_classifier_set.npy")    #用于PCA降维#形状重构
#根据测试文件output.py的输出结果,可以了解到:feat_before_classifier_set.npy以及
#   feat_from_resnet_set.npy数据集的输出结果以三维数组的方式呈现
#但是:LinearDiscriminantAnalysis expected <= 2.
resnet_reshape=resnet_set.reshape(720,8*1024)
classifier_reshape=classifier_set.reshape(720,1*1024)

在前面的准备做好之后,便可以进行PCA和LDA的降维实现了。在实现时,分别调用PCA和LinearDiscriminantAnalysis库中的fit_transform()函数即可,若要指定二维还是三维进行呈现,改变n_components=2or3。然后分别进行训练。

注意:下面代码存在重复部分,请根据自己的要求进行更改

PCA

two-dimensional

绘制二维散点图:

#加载PCA模型并训练,降维
#注意:PCA为无监督学习 无法使用类别信息来降维
model_pca=PCA(n_components=2) #二维
X_pca=model_pca.fit_transform(classifier_reshape)   #降维后的数据
X_pca=model_pca.fit_transform(resnet_reshape)
#绘图
labels=[0,1,2,3,4,5]
Colors=['red','orange','yellow','green','blue','purple']
label_express=['anger', 'disgust','fear','happy','sad','surprise'] #0-5对应的标签含义#二维散点图
#初始化画布
plt.figure(figsize=(8, 6), dpi=80) # figsize定义画布大小,dpi定义画布分辨率
plt.title('Transformed samples via sklearn.decomposition.PCA')
#分别确定x和y轴的含义及范围
plt.xlabel('x_values')
plt.ylabel('y_values')
plt.xlim([-60,60])
plt.ylim([-40,60])
# 为了不同标签的数据显示不同颜色 不能对读取数据list直接进行输入
# 需要每一个点进行label判断 根据对应数字进行绘制
# 若label情况较少 可采取包含list直接输入的([:,0]/[:,1])其他方法
for tlabel in labels:# pca读取数据x_pca_data=X_pca[label==tlabel,0]y_pca_data=X_pca[label==tlabel,1]plt.scatter(x=x_pca_data,y=y_pca_data,s=20,c=Colors[tlabel],label=label_express[tlabel])
plt.legend(loc="upper right") #输出标签信息在右上角
plt.grid()
plt.show()

three-dimensional

绘制三维散点图:

#加载PCA模型并训练,降维
#注意:PCA为无监督学习 无法使用类别信息来降维
model_pca=PCA(n_components=3) #三维
X_pca=model_pca.fit_transform(resnet_reshape,label)
X_pca=model_pca.fit_transform(classifier_reshape,label)
#绘图
labels=[0,1,2,3,4,5]
Colors=['red','orange','yellow','green','blue','purple']
label_express=['anger', 'disgust','fear','happy','sad','surprise'] #0-5对应的标签含义#三维散点图
#初始化画布
fig=plt.figure(figsize=(8, 6), dpi=80) # figsize定义画布大小,dpi定义画布分辨率
ax =fig.add_subplot(111,projection='3d')
ax.set_title('Transformed samples via sklearn.decomposition.PCA')
#分别确定x和y轴的含义及范围
ax.set_xlabel('x_value')
ax.set_ylabel('y_value')
ax.set_zlabel('z_value')
for tlabel in labels:#pca读取数据x_pca_data=X_pca[label==tlabel,0]y_pca_data=X_pca[label==tlabel,1]z_pca_data=X_pca[label==tlabel,2]ax.scatter(xs=x_pca_data,ys=y_pca_data,zs=z_pca_data,s=20,c=Colors[tlabel],label=label_express[tlabel])
plt.legend(loc="upper right") #输出标签信息在右上角
plt.show()

LDA

two-dimensional

绘制二维散点图:

#加载LDA模型并训练,降维
#LDA为监督学习 需要使用标签信息
model_lda=LinearDiscriminantAnalysis(n_components=2) #二维
X_lda=model_lda.fit_transform(resnet_reshape,label)
X_lda=model_lda.fit_transform(classifier_reshape,label)print("各主成分的方差值:",model_lda.explained_variance_)            #打印方差
print("各主成分的方差贡献率:",model_lda.explained_variance_ratio_)  #打印方差贡献率
#绘图
labels=[0,1,2,3,4,5]
Colors=['red','orange','yellow','green','blue','purple']
label_express=['anger', 'disgust','fear','happy','sad','surprise'] #0-5对应的标签含义#二维散点图
#初始化画布
plt.figure(figsize=(8, 6), dpi=80) # figsize定义画布大小,dpi定义画布分辨率
plt.title('Transformed samples via sklearn.decomposition.LDA')
#分别确定x和y轴的含义及范围
plt.xlabel('x_values')
plt.ylabel('y_values')
plt.xlim([-60,60])
plt.ylim([-40,60])
# 为了不同标签的数据显示不同颜色 不能对读取数据list直接进行输入
# 需要每一个点进行label判断 根据对应数字进行绘制
# 若label情况较少 可采取包含list直接输入的([:,0]/[:,1])其他方法
for tlabel in labels:# lda读取数据x_lda_data=X_lda[label==tlabel,0]y_lda_data=X_lda[label==tlabel,1]plt.scatter(x=x_lda_data,y=y_lda_data,s=20,c=Colors[tlabel],label=label_express[tlabel])
plt.legend(loc="upper right") #输出标签信息在右上角
plt.grid()
plt.show()

three-dimensional

绘制三维散点图:

#加载LDA模型并训练,降维
#LDA为监督学习 需要使用标签信息
model_lda=LinearDiscriminantAnalysis(n_components=3)
X_lda=model_lda.fit_transform(resnet_reshape,label)
X_lda=model_lda.fit_transform(classifier_reshape,label)print("各主成分的方差值:",model_lda.explained_variance_)            #打印方差
print("各主成分的方差贡献率:",model_lda.explained_variance_ratio_)  #打印方差贡献率
#绘图
labels=[0,1,2,3,4,5]
Colors=['red','orange','yellow','green','blue','purple']
label_express=['anger', 'disgust','fear','happy','sad','surprise'] #0-5对应的标签含义#三维散点图
#初始化画布
fig=plt.figure(figsize=(8, 6), dpi=80) # figsize定义画布大小,dpi定义画布分辨率
ax =fig.add_subplot(111,projection='3d')
ax.set_title('Transformed samples via sklearn.decomposition.LDA')
#分别确定x和y轴的含义及范围
ax.set_xlabel('x_value')
ax.set_ylabel('y_value')
ax.set_zlabel('z_value')
for tlabel in labels:# lda读取数据x_lda_data=X_lda[label==tlabel,0]y_lda_data=X_lda[label==tlabel,1]z_lda_data=X_lda[label==tlabel,2]ax.scatter(xs=x_lda_data,ys=y_lda_data,zs=z_lda_data,s=20,c=Colors[tlabel],label=label_express[tlabel])
plt.legend(loc="upper right") #输出标签信息在右上角
plt.show()

Visualization

feat_from_resnet_set.npy:



feat_before_classifier_set.npy:



Comparsion

根据训练模型的可视化结果,对于feat_from_resnet_set.npy和feat_before_classifier_set.npy文件,更适合使用LDA进行降维,因为这样呈现的数据分类更加明确。

Conclusion

本次实习中,我学习到了PCA与LDA降维的基本原理,以及可视化库的运用,让我在这个入门实验上对之前认为一头雾水的机器学习产生了一些兴趣。我在本次实验中还有许多不足之处,比如:应该做更充足的数据分析;在文件部分可以将每个模块进行细化,因为在同一文件中进行注释很浪费时间等。
作为一名机器学习小白,此次实验也暴露出来我很多问题,欢迎各位前来批评指正!

Reference

1、.npy文件
2、python读取txt文件并转换成数值型数组以及如何将数值型数组存入txt文件
3、python实现npy格式文件转换为txt文件
4、Numpy中reshape函数、reshape(1,-1)的含义(浅显易懂,源码实例)
5、python绘图基础—scatter用法
6、使用Python一步步实现PCA算法
7、【机器学习实战】降维方法的sklearn实现----PCA和LDA

【机器学习】基于PCA/LDA的数据降维和可视化(二维+三维)相关推荐

  1. ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例

    ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 目录 基于鸢尾花(Iris)数据集利用多种降维算法(PCA ...

  2. 基于PCA与LDA的数据降维实践

    基于PCA与LDA的数据降维实践 描述 数据降维(Dimension Reduction)是降低数据冗余.消除噪音数据的干扰.提取有效特征.提升模型的效率和准确性的有效途径, PCA(主成分分析)和L ...

  3. 机器学习:基于主成分分析(PCA)对数据降维

    机器学习:基于主成分分析(PCA)对数据降维 作者:AOAIYI 作者简介:Python领域新星作者.多项比赛获奖者:AOAIYI首页

  4. 模式识别与机器学习(作业5)基于PCA–LDA的人脸识别

    基于PCA–LDA的人脸识别 ORC数据集 提取码: cggh 本次的实验是在模式识别与机器学习(作业4),PCA降维的基础上加入了线性判别分析,对维度进行了进一步的降低. 1. 导入数据 一共有40 ...

  5. R语言plotly可视化:使用PCA算法进行数据降维、使用plotly可视化随着主成分的增加解释的方差的量(plotting explained variance)

    R语言plotly可视化:使用PCA算法进行数据降维.使用plotly可视化随着主成分的增加解释的方差的量(plotting explained variance) 目录

  6. R语言plotly可视化:使用PCA算法进行数据降维、使用plotly可视化PCA所有的主成分绘制散点图矩阵、降维后的两个(三个)核心主成分的二维、三维可视化图形、方差解释的量、载荷图等

    R语言plotly可视化:使用PCA算法进行数据降维.使用plotly可视化PCA所有的主成分绘制散点图矩阵.降维后的两个(三个)核心主成分的二维.三维可视化图形.方差解释的量.载荷图等 目录

  7. 【Python】使用sklearn PCA对人脸数据降维

    [python]sklearn PCA对人脸数据降维与识别 1. PCA 1.1 PCA原理 1.2 sklearn PCA使用方法 2. 人脸数据降维 2.1 读取图片 2.2 使用PCA进行降维 ...

  8. 基于t-SNE的Digits数据集降维与可视化

    基于t-SNE的Digits数据集降维与可视化 描述 t-SNE(t-分布随机邻域嵌入)是一种基于流形学习的非线性降维算法,非常适用于将高维数据降维到2维或者3维,进行可视化观察.t-SNE被认为是效 ...

  9. 数据降维与可视化——t-SNE

    数据降维与可视化--t-SNE 原文:https://blog.csdn.net/hustqb/article/details/78144384 声明: manifold:可以称之为流形数据.像绳结一 ...

最新文章

  1. 《Effective Java》 第一讲:创建和销毁对象
  2. Google搜索正在“死亡”
  3. Android手动创建和解析Json
  4. oracle gENT,Oracle 11g r2 新建空表不分配semgent
  5. java的dtd文件_Eclipse中在XML中如何关联.dtd文件
  6. 《SpringMVC视频教程》(p2~p3)
  7. 北京内推 | 微软亚洲研究院机器学习组招聘NLP/语音合成等方向全职研究员
  8. 给大家分享【CDR基础教程】
  9. VMware中安装Win10超详细步骤
  10. 支付宝小程序设置服务器维护,支付宝小程序配置
  11. matlab计算三角格网面积,MATLAB中plot的用法
  12. 【金猿技术展】视频矫正技术——基于参数估计的自由几何变换算法
  13. JAVA视频资料百度网盘分享
  14. springboot框架下的实时消息推送
  15. 文章总结:ASPLOS 2013 Architecture I
  16. Unity中制作动画
  17. STM32学习——入门小项目
  18. [python]matplotlib.pyplot模块
  19. Android 百度地图开发问题----解决地图有时候加载不出来问题
  20. BERT所占内存的计算

热门文章

  1. 计算机毕设(附源码)JAVA-SSM洁强汽车美容
  2. Java面试——Nginx
  3. 这可能是2023全网最详细的python安装教程(windows)
  4. 面向用户需求的产品设计
  5. 关于RISC-V的一些有用的资料
  6. 关于数据库中字段空值的SQL排序的问题
  7. 堆漏洞-UAF漏洞简析
  8. TypeError: Cannot read property ‘_wrapper‘ of undefined
  9. NodeJs 项目开发小结
  10. html与css入门经典 当当,HTML与CSS入门经典