文章目录

  • 前言
  • 降维算法汇总
  • 一、用到的降维算法
    • 1.PCA
    • 2.T-SNE
    • 3.SVD奇异值分解
  • 二、用到的数据集
    • 1.wine
    • 2.MNIST
  • 三、评价方式
    • 准确率
  • 四、整体思路
  • 五、整体流程
  • 六、实验结果
    • 1.PCA
      • 单个数据点的变化
      • 总体的降维变化
      • 化学成分对应特征的排名
      • PCA 降到二维的聚类散点图
      • 分析降到二维聚类正确的的样本
      • 分析降到二维聚类错误的的样本
    • 2.SVD
      • SVD 降到二维聚类的散点图
    • 3.T-SNE
      • T-SNE 降到二维聚类的散点图
      • 降到二维统计每次迭代实验结果(四次实验)
      • 总体降维实验结果
  • 七、具体功能代码
    • 1、PCA降维
    • 2、折线图的绘制
    • 3、散点图的绘制
    • 4、一张图中画多个图形
  • 引用
  • 总结

前言

数据降维算法是数据分析和数据可视化中常用的算法,但降维会带来信息损失,而信息的损失会造成降维前与降维后聚类算法与分析算法的不一致。这对于通过降维来可视化高维数据带来挑战,即可视化图像错误的展示了高维数据的聚类或分类特征。本课题探究维度降低过程信息的损失与聚类结果的影响,通过相关的可视分析方法来帮助用户更好理解数据降维和优化数据可视化结果。

降维算法汇总


一、用到的降维算法

1.PCA

PCA算法的思想减少冗余和剔除噪声,将原始n维特征映射到k维空间上,其中k<n,其中k是指一个全新的正交特征。为了在映射之后可以保留原始数据尽可能多的信息,我们希望原始数据映射到k维空间中,使其方差尽可能的大。

优点:

(1) 它是无监督学习,完全无参数限制的。结果只与数据相关,与用户是独立的。

(2) 最大程度的保持了原有数据的信息。

(3) 各主成分之间正交,可消除原始数据成分间的相互影响。

缺点:

(1) 用户无法通过参数优化等方法对处理过程进行干预,可能会得不到预期的效果。

(2)贡献率小的主成分往往可能含有对样本差异的重要信。

2.T-SNE

t-SNE的主要目标是将多维数据集转换为低维数据集。 较多的用于数据可视化。 t-SNE应用于n维数据,它将智能地将n维数据映射到3d甚至2d数据,并且原始数据的相对相似性非常好。t-SNE是非线性降维技术,它可以捕获高维数据的复杂流形结构的主要原因。


优点:

(1) ​ 对于数据可视化而言t-SNE的效果最好

(2) 可以捕获高维数据的复杂流形结构

缺点:

(1) 计算复杂度高,计算成本高。

(2) 只能用于降维至2d,3d,具有局限性。

(3) 可解释性差,具有随机性。

3.SVD奇异值分解

分解方式


二、用到的数据集

1.wine

Wine葡萄酒数据集是来自UCI上面的公开数据集,这些数据是对意大利同一地区种植的葡萄酒进行化学分析的结果,这些葡萄酒来自三个不一样的品种。该分析肯定了三种葡萄酒中每种葡萄酒中含有的13种成分的数量。从UCI数据库中获得的这个wine数据记录的是在乎大利某一地区同一区域上三种不一样品种的葡萄酒的化学成分分析。数据里含有178个样本分别属于三个类别,这些类别已经给出。每一个样本含有13个特征份量(化学成分),13个属性是,酒精、苹果酸、灰、灰分的碱度、镁、总酚、黄酮类化合物、非黄烷类酚类、原花色素、颜色强度、色调、稀释葡萄酒的OD280/OD31、脯氨酸。其中第1类有59个样本,第2类有71个样本,第3类有48个样本。

2.MNIST

三、评价方式

准确率

这里我们用准确率来评价聚类的效果

四、整体思路


实验总体思路就是比较降维之后聚类 和直接聚类两者之间的差别,以及对降维中损失信息结合分析结果给出一个可解释性,反馈于丢失的信息。最终还原到数据上。

五、整体流程


PCA 需要对数据做归一化处理,这里用到StanderScaler()标准差标准化数据,降维用到的是sklearn库内置的PCA算法。大致分为上面提到的几个过程,首先对处理数据,然后对数据降维->聚类,循环降维->聚类这一过程,得出从13维一直降当2维的实验结果。通过画图、求与中心点的距离分析聚类效果波动的原因、以及样本之间的相关性和类簇之间的无关性。

六、实验结果

1.PCA

单个数据点的变化

1表示正确,0表示错误,可以看出数据样本点第59 个和之后的有很大不同,因为第一类样本是59个 后面的属于第二类样本,所以数据从高维到低维保持了一定数据原有的特征。

总体的降维变化

我们很明显可以看到从第11维降到第10维的过程中准确率直线下降,当前去除掉第11个维度也就是特征值排名第11的位置,也就是稀释葡萄酒的OD280/OD315这一个化学成分,而第二段下降的则是第9维降到第8维的过程,同理得到去除掉的是第9个维度hue(色度)。
第一段下降 :
稀释葡萄酒的OD280/OD315值被删掉,这是一种测定蛋白质浓度的方法,可以测定各种葡萄酒的蛋白质含量。
第二段下降:
Hue特征被删掉Hue指的是颜色的生动性和冷暖的程度。 他可以用来衡量葡萄酒的品种和年份。陈酿时间越久的红酒会呈现黄色,透明度越高。色彩强度和色相是重要的指示剂。
下面我们分析一下其他的部分,准确率不变的部分,可以简单的说这一化学成分对于我们葡萄酒的聚类来说影响不大,而从第7维到2为不断波动的过程,我们猜想是由于去掉了对聚类不是很重要的成分,但是该成分却占有较大的权重比例,导致准确率变低,去掉该维度,准确率反而提高。

化学成分对应特征的排名


降维过程中按照特征排名,逆序去掉特征值较小的特征,即对应的化学成分特征丢失。

PCA 降到二维的聚类散点图

图1 图1

本数据集带有原始的类别标签,所有可以对聚类进行准确率的计算,也可以对聚类好的样本标签进行比较。

我们可以清楚的看到该数据集降维到2为再聚类还是有一个不错的聚类效果的,包括点的分布以及准确率。但是我们通过对比聚类图和准确的标签图可以看到有一些点聚类产生了错误的结果,例如138号点,他准确的标签是属于类簇2,但是由于K-means算法只考虑与簇类中心的距离,所以将该点划分到了类簇1。我们选择分析了一个聚类正确的样本点(即降维后与聚类中心较为相近的点)这里我们选择58号样本点,选择了分析了一个聚类错误的样本点。

分析降到二维聚类正确的的样本


这里计算了一下从13维降到2为的过程中58号样本点与聚类中心 标准聚类中心的距离变化。我们可以看到虽然该样本点降维到2为进行聚类,有一个较好的聚类效果,但是我们从图中可以看出,在降维到第8、9维度上是仍产生了聚类错误,偏离了原本的样本中心点的距离。从总体上看随着维度的降低,样本点与聚类中心的距离还是在不断缩小的,从而分析一下样本之间的相关系,和类簇之间的无关性。

分析降到二维聚类错误的的样本


该样本属于到低维之后聚类错误的样本点,可以看出在高维状态下,该样本离群较远,所以再高维状态下就产生聚类错误,并且在10-7维的过程中一直处于稳定状态,且聚类正确,所以降到一定维度之后保留了原始信息,而且有助于聚类,但是中间会有波动的过程,所以推测两种葡萄酒虽然虽属于不同的类别,但是有相似的特点。

2.SVD

图1 图2

图1是SVD降维后聚类的准确率的变化,图二是前面分析过的PCA降维后聚类的准确率的变化情况,对比二者可以看出图像几乎一模一样,两者图像都一样,一开始我以为是我所用的算法有问题,检查了算法后确定不是算法的问题,那么可能是数据集的问题,所以我又换了另外一个数据集,sklearn内置的MNIST数据集

SVD 降到二维聚类的散点图

图1 图2

3.T-SNE

T-SNE 降到二维聚类的散点图

图1 图2

我们可以看到图1和图2差别很大,T-SNE将wine数据集降维到2维后准确率较低,且出现了较大误差,很明显样本2和样本3完全聚类产生了相反的结果,这里有一些问题,不知道是数据集的问题,还是算法的问题。

降到二维统计每次迭代实验结果(四次实验)

图1 图2
图3 图4

由于T-SNE算法具有一定的随机性,所以经过多次实验,选取了四次实验结果展示,正确率最后都趋向于百分之50,但是这不表示随机性。

总体降维实验结果

图1 图2
图3 图4

T-SNE降维算法,由于sklearn库中的T-SNE只适用于降到二维或者三维,不可用于依次降低到不同的维度,还有需要统计每轮迭代的实验结果,所以对一个博主用python实现的T-SNE算法进行了简单的修改,下面引用中提到,最终完成了实验。

七、具体功能代码

1、PCA降维

# 传入数据和标签 得出最后的正确率
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler 对数据标准化
from sklearn.cluster import KMeans  # 导入聚类方法K-means
from sklearn.metrics import accuracy_score  # 准确率评价
def getPCA(data, target):listAcc = []#从13维降到2维 for i in range(13, 1, -1):print('===========================================')# PCA的参数 n_components指定指定的维度 0 < n_components < 1代表满足最低的主成分方差累计贡献率pca = PCA(n_components=i)P_data = pca.fit_transform(data)print(explained_variance_ratio_) #主成分方差贡献率# 对降维后的数据进行聚类 n_clusters 是类别数 random_state=10 随机初始化的种子为统一测试形成对比kmeans_P = KMeans(n_clusters=3, random_state=10).fit(P_data)acc = accuracy_score(kmeans_P.labels_, target)print("PCA降到{:d}维后聚类的准确率:{}".format(i,acc))listAcc.append(acc)return listAcc

2、折线图的绘制

def getImageDist(list1,list2):
# x轴坐标范围x = [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2]# 设置绘图风格plt.style.use('ggplot')# 处理中文乱码plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 坐标轴负号的处理plt.rcParams['axes.unicode_minus'] = False# 绘制标准曲线  cyan 正确样本plt.plot(x,  # x轴数据list1,  # y轴数据linestyle='-',  # 折线类型linewidth=2,  # 折线宽度color='cyan',  # 折线颜色marker='o',  # 折线图中添加圆点markerfacecolor='c',  # 点的填充色label='标准样本点' #图示标签)# 绘制聚类中心的样本  violet#在一张图中绘制多条折线只需要多一个plt.plotplt.plot(x,  # x轴数据list2,  # y轴数据linestyle='-.',  # 折线类型linewidth=2,  # 折线宽度color='violet',  # 折线颜色marker='*',  # 折线图中添加圆点markeredgecolor='black',  # 点的边框色markerfacecolor='m',  # 点的填充色label='聚类样本点')plt.legend()# 对于X轴,只显示x中各个数对应的刻度值plt.xticks(fontsize=8)  # 改变x轴文字值的文字大小#添加x轴标签plt.xlabel('维度',fontsize=10)# 添加y轴标签plt.ylabel('距样本中心的距离', fontsize=18)# 添加图形标题plt.title("PCA 降维点的变化", fontsize=18)return plt

3、散点图的绘制

# 传入降到二维的数据 和聚类的模型 以及数据的标题 就可以得到二维散点图的plot
def getImage(data,model,string):plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.xlabel('X')plt.ylabel('Y')
# 将对应聚类标签的数据标记为相同的颜色for i in range(len(data)):if model.labels_[i] == 0:plt.scatter(data[i, 0], data[i, 1], c='red')elif model.labels_[i] == 1:plt.scatter(data[i, 0], data[i, 1], c='green')elif model.labels_[i] == 2:plt.scatter(data[i, 0], data[i, 1], c='blue')else:plt.scatter(data[i, 0], data[i, 1], c='yellow')#用于对每个样本点进行标记计数# plt.annotate(str(i + 1), xy=(data[i, 0], data[i, 1]), xytext=(1, 1),#              textcoords=('offset points'), fontsize=8)# 画聚类中心点m = model.cluster_centers_# m是样本中心点矩阵 c是颜色,s是大小,marker是形状plt.scatter(m[0, 0], m[0, 1], c='purple', s=150, marker='p')plt.scatter(m[1, 0], m[1, 1], c='orange', s=150, marker='p')plt.scatter(m[2, 0], m[2, 1], c='black', s=150, marker='p')# 文本注释for i in range(3):plt.annotate(str('样本') + str(i + 1), xy=(m[i, 0], m[i, 1]), xytext=(1, 1),textcoords=('offset points'), fontsize=15)plt.title(string, fontsize=18)# 保存图片 名字为传入的string.pngplt.savefig(string+'.png')return plt

4、一张图中画多个图形

def getImage(begin, end, L):x = [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2]#设置画布大小plt.figure(figsize=(20, 20))for i in range(begin, end):# 设置在画布中的位置plt.subplot(math.ceil((end - begin) / 4), 4, i - begin + 1)# 设置绘图风格plt.style.use('ggplot')# 处理中文乱码plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 坐标轴负号的处理plt.rcParams['axes.unicode_minus'] = False# 读取数据# 绘制离散的散点图plt.scatter(x,L[i],marker='o',c='steelblue')# 对于X轴,只显示x中各个数对应的刻度值plt.xticks(fontsize=8)  # 改变x轴文字值的文字大小# 添加y轴标签plt.ylabel('变化情况', fontsize=18)# 添加图形标题plt.title("{}wine Pca".format(i+1), fontsize=18)return plt

引用

https://blog.csdn.net/u012968002/article/details/91354566 (T-SNE原理)
https://blog.csdn.net/scott198510/article/details/76099700(SVD奇异值分解)
https://blog.csdn.net/weixin_48615832/article/details/108466201(折线图的绘制)


总结

本课题研究了降维中信息的损失对聚类结果的影响,以及丢的信息的一些可解释性。但是实验中的一些结果以及实验过程中遇到的一些问题没有一个合理的解释,特别是非线性的T-SNE,无法像线性降维那样,把对应的维度映射到相关的信息维度。还有一些关于参数的选择上都是经过反复调试,找到尽可能准确率高的参数进行实验。首先很感谢我的老师,也感谢这次实习的科研经历,如果未来有机会还会继续做下去,我一定加倍努力,喜欢这里,喜欢这个大家庭的氛围,更爱这里的每个人。

降维中信息的损失对聚类结果的影响图形化表示相关推荐

  1. 基于物化视图优化_CVPR2017|基于构造多视图子空间中的潜在表示解决聚类问题

    作者 | 张泽宇 编辑 | 臧晨宇 校对 | 李仲深 今天给大家介绍天津大学张长青老师等人在CVPR2017上发表的文章"Latent Multi-view Subspace Cluster ...

  2. 单细胞测序数据的降维方法及细胞亚型鉴定聚类方法总结

    图1.细胞亚型的鉴定及分析(Stegle et al. NATURE REVIEWS | GENETICS, 2015) 随着单细胞测序技术的发展,每个研究或实验中测定的细胞数量在显著增加.现在很多单 ...

  3. 基因表达数据中信息基因和基因调控网络 第六周报告

    基因表达数据中信息基因和基因调控网络 第六周报告 本周主要看了<基因芯片技术><基因表达数据的聚类分析>两篇论文,初步了解了基因芯片和聚类分析的含义. 一.基因芯片技术 基因芯 ...

  4. R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色、在树状图dendrogram中为不同的层次聚类簇配置不同的色彩

    R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色.在树状图dendrogram中为不同的层次聚类簇配置不同的色彩 #层次聚类树状图dendrogram labs = pa ...

  5. 计算机中的信息表示 ppt模板,计算机中信息的表示.ppt

    <计算机中信息的表示.ppt>由会员分享,可在线阅读,更多相关<计算机中信息的表示.ppt(37页珍藏版)>请在人人文库网上搜索. 1.在计算机中的信息的显示中,计算机处理的信 ...

  6. java 线程 获取消息_获取java线程中信息

    怎样获取java线程中信息? 在进行多线程编程中,比较重要也是比较困难的一个操作就是如何获取线程中的信息.大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中,然后再提供一个获取方 ...

  7. 计算机中信息表示方法,计算机中的信息表示方法二进制

    计算机中的信息表示方法二进制Tag内容描述: 1.,计算机中的信息表示方法 二进制,抚顺县石文学校信息技术教研组 袁丽丽,学 习 目 标,1.了解二进制与十进制的对应关系: 2.学会二进制与十进制的换 ...

  8. 闲人闲谈PS之三十一——新收入准则中的合同损失计提

    惯例闲话:新收入准则出来已经3年多,闲人也走访了很多工程企业的应用情况,推广情况不太乐观,多数企业还是沿用以前的方式记账,甚至还有不用工程施工科目,用生产制造科目体系,多见于装备制造行业,实际上如果是 ...

  9. (27)第四节课:从零起步在框架中编码实现损失度Loss的计算及其可视化

    本节将从零起步在框架中编码实现损失度Loss的计算及其可视化.本节包含三部分的内容: (1)   关于Loss的思考,Loss是所有AI框架终身的魔咒. (2)   编码实现Loss实现并进行测试. ...

最新文章

  1. C++: 构造函数和析构函数
  2. 分享android开发过程中用到的一些开源框架
  3. 多线程,多进程,协程
  4. 短信转化效果不好?试试这几招
  5. 百度模糊搜索怎么实现_百度搜索广告是什么?百度搜索竞价广告投放推广效果怎么样?...
  6. java kotlin lateinit_kotlin - 如何检查“lateinit”变量是否已初始化?
  7. VS2019使用NASM编译汇编文件
  8. Linux的实际操作:文件目录类的实用指令(cat more less)
  9. 【Python】ffmpeg模块处理视频、音频信息
  10. Spring : ListableBeanFactory
  11. Power Designer的4种模型文件
  12. 奇怪的信 c语言 整数位数为偶数求和
  13. 你可能用得上的 N 款免费/开源中文字体
  14. 周期均方根和有效值的区别_何为有效值?何为均方根?
  15. Docker阿里加速器
  16. 道道通导航linux升级,道道通导航升级免费版
  17. iTool拷贝app到电脑上
  18. 热评云厂商:青云科技4.29亿元,重研发押注更大发展
  19. android mac 照片恢复,万兴安卓照片恢复软件(Mac版本)指南
  20. Applied Energy期刊小白论文投稿模板-流程经验分享

热门文章

  1. 基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据
  2. 儿童护眼灯怎么选?国家质检合格的儿童护眼灯
  3. 电脑分区了如何恢复?电脑新手村教程
  4. ”VT-x is not available (VERR_VMX_NO_VMX)“ 和 “VBoxManage: error: Details: code NS_ERROR_FAILURE”问题
  5. html5模仿手机音乐播放器(添加音乐进度条和时长)
  6. UVALive - 7456 Least Crucial Node ( dfs + set )
  7. python数据采集6-读取文档
  8. JavaScript Core -- 不可小视的标点符号
  9. 还在为美容护肤问题焦虑吗?不妨试试红光光浴#大健康#红光光浴#红光#种光光学
  10. IPHONE能否成为圣剑?助苹果斩杀群雄!