多维数据可视化技术,Radviz可视化原理,向量化的 Radviz(vectorized Radviz,简称 VRV)

news2024/10/5 20:19:44

目录

多维数据可视化技术

Radviz可视化原理

向量化的 Radviz(vectorized Radviz,简称 VRV)


多维数据可视化技术

多维和高维数据普遍存在于我们的日常生活和科学研究中 . 比如 , 手机就包括品牌、型号、尺寸、重量、 生产日期、屏幕尺寸和电池容量等几十个属性; 又如 , 生物医学领域中的基因表达数据经常会产生成百上千个 属性. 鉴于人类对于数据的理解集中在 2D 3D 的低维空间 , 因此 , 采用信息可视化技术将多维数据绘制到低维 屏幕空间是实现人与多维数据交互分析的一种解决思路. 多维和高维数据的可视化一直以来都是一个热门的研究领域. 以主成分分析 (principle component analysis, 简称 PCA) 和多维尺度分析 (multi-dimensional scaling, 简称 MDS) 为代表的传统高维数据降维方法 [6] , 是通过数学方法将高维数据降维到 2D 3D 的低维空间中 , 并尽量保留高维空间中的原有特性和聚类关系 , 但这类方法 会损失数据在原始维度上的细节信息, 而且无法表现维度之间的关系 . 以散点图矩阵 (scatterplot matrix) [7] 和平行坐标(parallel coordinates) [8] 为代表的经典可视化方法虽然可以保留多维数据在每个维度上的信息 , 并突出维度间关系, 但是当维度数量增多时 , 有限的屏幕空间难以容纳大量维度 , 而且还会存在过度绘制问题 . Radviz [1]和星型坐标(star coordinates) [9,10] 为代表的高维数据径向型投影方法 , 可以大量节约屏幕空间 , 但维度的排列顺序对数据投影结果影响很大, 同时还存在数据重叠问题 . 此外 , 还有一部分研究提出先基于用户经验或算法准则提取高维空间中的部分维度, 然后在维度子集中结合上述技术完成高维数据分析 , 这类方法的代表是特征选择 与子空间分析

Radviz可视化原理


       Radviz可视化原理是将一系列多维空间的点通过非线性方法映射到二维空间的可视化技术,是基于圆形平行坐标系的设计思想而提出的多维可视化方法。圆形的m条半径表示m维空间,使用坐标系中的一点代表多为信息对象,其实现原理参照物理学中物体受力平衡定理。

 每个弹簧作用在小圆上的力取决于该弹簧的弹簧拉伸和弹性系数,当小圆静止不动,则表明其受到所有弹簧的合力为0,由此可得到如下方程:

Radviz 数据投影原理如图 1 所示,数据集各维度作为维度锚点分布在圆环上,圆内的点代表数据记录,其位置由来自各维度锚点的弹簧拉力共同决定,每个弹簧拉力的大小正比于数据点在相应维度上的取值,这些数据点在所有弹簧拉力的共同作用下稳定在合力为 0 的位置.图 1 中 A 点和 B 点是一个四维数据集中两个数据点在Radviz 中的映射,4 个维度被均匀分布在圆环上,记录 A 在维度 1 和维度 2 上取值较大,因此受到来自这两个维度锚点的弹簧拉力较大,从而定位在靠近 DA1 和 DA2 的附近;同理,记录 B 在维度 3 和维度 4 上取值较大,所以其位置在这两个维度锚点附近.在 Radviz 的数据投影机制下,具有相似特征的数据点将被映射到圆内相近位置.
因此,圆内聚集的点簇可以被人们直观地观察到,从而形成可视化的聚类效果.

 

Radviz 方法本身也存在一些缺点:

(1) 由于 Radviz 映射为多对一映射,这导致圆内数据点会出现遮挡和重合的现象

(2) Radviz圆环上维度错点摆放的位置和顺序对数据投影结果影响很大,如图1所示,随机维度错点布局的可视化聚类效果可能并不理想.针对以上问题。

学者们对 Radviz 进行了多方面的改进.针对 Radviz 方法将多维数据映射到低维空间时会产生数据点互相遮挡和重合的问题,学者们采用的主要改进思路是将Radviz 扩展到三维空间,Atero 等人8设计了 Viz3D,该方法在 Radviz 垂直方向上增加一个标轴 2.各数据点在: 轴的取值为其有属性的平均值.Viz3D 能够有效保证原始空间内很近的数据在投影空间内也很近,但原始空间中距离较远的记录在投影空间中距离可能变近,随后,Novakova 等人9设计了 RadvizS.与Viz3D 不同的是,轴坐标记录了原始空间中数据点到坐标原点的距离,从而在三维空间中保留原始空间中数据点间的距离信息.他们进一步采用镜面投影法让原来重叠的记录点得到有效分离.在一定程度上解决了 Radviz中数据点重合、遮挡的混乱现象.

 

def radviz(frame, class_column, ax=None, color=None, colormap=None, **kwds):
    """RadViz - a multivariate data visualization algorithm

    Parameters:
    -----------
    frame: DataFrame
    class_column: str
        Column name containing class names
    ax: Matplotlib axis object, optional
    color: list or tuple, optional
        Colors to use for the different classes
    colormap : str or matplotlib colormap object, default None
        Colormap to select colors from. If string, load colormap with that name
        from matplotlib.
    kwds: keywords
        Options to pass to matplotlib scatter plotting method

    Returns:
    --------
    ax: Matplotlib axis object
    """
    import matplotlib.patches as patches

    '''
        数据归一化
    '''
    def normalize(series):
        a = min(series)
        b = max(series)
        return (series - a) / (b - a)

    n = len(frame)

    '''
        type(classes)=pandas.core.series.Series
        classes表示共有几个类别
        class_col表示每一个样本对应的类别
    '''
    classes = frame[class_column].drop_duplicates()
    class_col = frame[class_column]

    '''
        (1)pandas.DataFrame.drop
        表明删除数据,axis=0表示删除行,axis=1表示删除列,这里表明去掉最后一列表示类别的列
        (2)pandas.DataFrame.apply
        调用函数,但输入必须是DataFrame
        (3)df为150x7的二维矩阵,即原数据
    '''
    df = frame.drop(class_column, axis=1).apply(normalize)

    '''
        设定横轴、纵轴的取值范围
    '''
    if ax is None:
        ax = plt.gca(xlim=[-1, 1], ylim=[-1, 1])

    '''
        定义一个字典
    '''
    to_plot = {}
    colors = _get_standard_colors(num_colors=len(classes), colormap=colormap,
                                  color_type='random', color=color)
    for kls in classes:
        to_plot[kls] = [[], []]
    '''
       to_plot= {'Breakout': [[], []], 'FalseAlarm': [[], []]}
    '''
    m = len(frame.columns) - 1
    '''
        当 i=0,1,2,3,4,5,6 时,
           t=2π*0/7、2π*1/7、2π*2/7、2π*3/7、2π*4/7、2π*5/7、2π*6/7
        上述t值对应的余弦、正弦即s为
        [[ 1.          0.        ]
         [ 0.6234898   0.78183148]
         [-0.22252093  0.97492791]
         [-0.90096887  0.43388374]
         [-0.90096887 -0.43388374]
         [-0.22252093 -0.97492791]
         [ 0.6234898  -0.78183148]]
    '''
    s = np.array([(np.cos(t), np.sin(t))
                  for t in [2.0 * np.pi * (i / float(m))
                            for i in range(m)]])
    for i in range(n):
        row = df.iloc[i].values
        '''
            (1)np.expand_dims(row, axis=1)
                扩展维数,当axis=0时,扩展列,即在行上增加数据;[1,2]变为[[1,2]]
                         当axis=1时,扩展行,即在列上增加数据;[1,2]变为[[1],[2]]
            (2)np.repeat(row, 2, axis=1)
                幅值数组元素,2表示每个元素的复制次数
                当axis=0时,列不变,在行上复制元素;[[1],[2]]变为[[1],[1],[2],[2]]
                当axis=1时,行不变,在列上复制元素;[[1],[2]]变为[[1 1],[2 2]]
        '''
        row_ = np.repeat(np.expand_dims(row, axis=1), 2, axis=1)
        '''
            s * row_相当于两个数组相对应的位置相乘
            (s * row_).sum(axis=0)相当于对相应行上的数值求和,即求每一列的和
            此处对应公式(2)的分子,得到的是一个1X2的列表或数组
            row.sum()相当于求数组所有元素的和
            此处对应公式(2)的分母
        '''    
        y = (s * row_).sum(axis=0) / row.sum()
        if i==0:
            print(row.sum())

        '''
            iat用于访问元素,访问150次,即样本个数
            查看当前样本i所对应的kls是A还是B,A和B表示类别
            然后再把相应的y值加入到以A或B为键的值里面
        '''
        kls = class_col.iat[i]
        '''
            to_plot= {'Breakout': [[y[0]], [y[1]]], 'FalseAlarm': [[y[0]], [y[1]]]}
            将y的第一个值加入到字典中键为kls的第一个数组中,如上所示
        '''
        '''
            将y的第二个值加入到字典中键为kls的第二个数组中,如上所示
        '''
        to_plot[kls][0].append(y[0])
        to_plot[kls][1].append(y[1])
    '''
        enumerate(sequence, [start=0])返回枚举对象
        sequence :序列、start=0 :下表从0开始
    '''
    for i, kls in enumerate(classes):
        '''
            一共循环两次
            第一次循环画出A的值,即'A': [[y[0]], [y[1]]]
            第二次循环画出B的值,即'B': [[y[0]], [y[1]]]
            此时[y[0]]对应于to_plot[kls][0],[y[1]]对应于to_plot[kls][1]
        '''
        ax.scatter(to_plot[kls][0], to_plot[kls][1], color=colors[i],
                   label=pprint_thing(kls), **kwds)
    ax.legend()
    '''
        在坐标轴中画圆,圆心(0.0,0.0),半径1.0,圆域无色
    '''
    ax.add_patch(patches.Circle((0.0, 0.0), radius=1.0, facecolor='none'))
    '''
        将属性注释到二维坐标图中
    '''
    for xy, name in zip(s, df.columns):

        '''
            画属性位置,位置坐标是数组s的每一行的两个值
        '''
        ax.add_patch(patches.Circle(xy, radius=0.025, facecolor='gray'))

        '''
            注释属性名称
        '''
        if xy[0] < 0.0 and xy[1] < 0.0:
            ax.text(xy[0] - 0.025, xy[1] - 0.025, name,
                    ha='right', va='top', size='small')
        elif xy[0] < 0.0 and xy[1] >= 0.0:
            ax.text(xy[0] - 0.025, xy[1] + 0.025, name,
                    ha='right', va='bottom', size='small')
        elif xy[0] >= 0.0 and xy[1] < 0.0:
            ax.text(xy[0] + 0.025, xy[1] - 0.025, name,
                    ha='left', va='top', size='small')
        elif xy[0] >= 0.0 and xy[1] >= 0.0:
            ax.text(xy[0] + 0.025, xy[1] + 0.025, name,
                    ha='left', va='bottom', size='small')

    ax.axis('equal')
    return ax

向量化的 Radviz(vectorized Radviz,简称 VRV)

它通过扩展维度个数 ( 可简称为升维 )
获得更大、更灵活的维度锚点排序空间 , 并从中搜索更好的数据投影结果 .VRV 以类别型多维数据为研究对象 ,
首先枚举每个维度的可取值 , 然后按照枚举值的数量将一个维度划分为多个新维度 . 例如 , 某武器类型维度的取
值可枚举为 ( 刀、枪、剑、棒 ), 维度扩展后该维度变为刀、枪、剑、棒 4 个新维度 , 原数据在 4 个新维度上的取
值只能为 0 1, 因此原武器类型维度取值为 的数据在升维后取值变成了向量 (1,0,0,0).

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

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

相关文章

Pygame中Sprite类的使用3

在Pygame中Sprite类的使用2_棉猴的博客-CSDN博客中提到了通过派生自pygame.sprite.Sprite类的自定义类Zombie&#xff0c;可以实现一个僵尸的移动。可以通过pygame.sprite.Group类实现对多个Zombie类实例的管理&#xff0c;即可以实现多个僵尸的移动。 1 pygame.sprite.Group类…

一文彻底理解synchronized(通俗易懂的synchronized)

目录 一、什么是synchronized 二、synchronized的四种用法 2.1、修饰一个代码块 2.2、修饰一个方法 2.3、修饰一个静态的方法 2.4、修饰一个类 三、使用案例分析 3.1、修饰一个代码块 3.2、修饰一个方法 3.3、修饰一个静态的方法 3.4、修饰一个类 3.5 经典用法&…

#循循渐进学51单片机#UART串口通信#not.10

1、能够理解UART串口通信的基本原理和通信过程。 1&#xff09;串行通信的初步认识 并行通信&#xff1a;通信时数据的各个位同时传送&#xff0c;可以实现字节为单位通信&#xff0c;但是通信线占用资源太多&#xff0c;成本高。 串行通信&#xff1a;一次只能发送一位&…

debian终端快捷键设置

为了方便使用图形化debian&#xff0c;快捷调出shell终端是提升工作学习效率的最重要的一步。 1.首先点击右上角&#xff0c;选择设置 2.点击键盘&#xff0c;选择快捷键&#xff0c;并创建自定义快捷键 3.点击添加快捷键 4.根据图中提示创建快捷键 Name: Terminal Command…

软考网络工程师华为配置考点总结

华为交换机配置基础 1.vlan的配置 华为设备中划分VLAN的方式有&#xff1a; 静态的划分&#xff1a;基于接口动态划分&#xff1a;基于MAC地址、基于IP子网、基于协议、基于策略&#xff08;MAC地址、Ip地址&#xff09;。 其中基于接口划分VLAN&#xff0c;是最简单&#x…

Arduino程序设计(十一)8×8 共阳极LED点阵显示(74HC595)

88 共阳极LED点阵显示 前言一、74HC595点阵模块1、74HC595介绍2、74HC595工作原理3、1088BS介绍4、74HC595点阵模块 二、点阵显示实验1、点阵显示初探2、点阵显示进阶3、点阵显示高阶3.1 点阵显示汉字&#xff08;方法1&#xff09;3.2 点阵显示汉字&#xff08;方法2&#xff…

不用addEventListener(‘resize‘, this.resize),用新的Web API ResizeObserver监听DIV元素尺寸的变化

响应式设计指的是根据屏幕视口尺寸的不同&#xff0c;对 Web 页面的布局、外观进行调整&#xff0c;以便更加有效地进行信息的展示。我们日常生活中接触的很多应用都遵循响应式的设计。 响应式设计如今也成为 web 应用的基本需求&#xff0c;而现在很多 web 应用都已经组件化&a…

华为云云耀云服务器L实例评测 |云服务器选购

华为云耀云服务器 L 实例是一款轻量级云服务器&#xff0c;开通选择实例即可立刻使用&#xff0c;不需要用户再对服务器进行基础配置。新用户还有专享优惠&#xff0c;2 核心 2G 内存 3M 带宽的服务器只要 89 元/年&#xff0c;可以点击华为云云耀云服务器 L 实例购买地址去购买…

如何在新浪、搜狐、腾讯、网易、人民网等知名媒体网站上投稿

网络通稿成本低、投入小&#xff0c;软文宣传成为了众多企业的宣传选择&#xff0c;一篇优质的稿件更是能带来惊人的效果。越知名的网站传播效果越好&#xff0c;像新浪、搜狐、腾讯、网易、人民网等&#xff0c;那么如果找到这些网站投稿呢&#xff0c;本期盒子分享&#xff0…

[Go疑难杂症]为什么nil不等于nil

现象 在日常开发中&#xff0c;可能一不小心就会掉进 Go 语言的某些陷阱里&#xff0c;而本文要介绍的 nil ≠ nil 问题&#xff0c;便是其中一个&#xff0c;初看起来会让人觉得很诡异&#xff0c;摸不着头脑。 先来看个例子&#xff1a; type CustomizedError struct {Err…

MySQL的进阶篇1-MySQL的存储引擎简介

存储引擎 MySQL的体系结构 0、客户端连机器【java、Python、JDBC等】 1、【MySQL服务器-连接层】认证&#xff0c;授权&#xff0c;连接池 2、【MySQL服务器-服务层】 {SQL接口&#xff08;DML、DDL、存储过程、触发器&#xff09;、解析器、查询优化器、缓存} 3、【MySQL…

C8051F020 SMBus一直处于busy状态解决办法

当SMBus总线处于busy状态切且无法自动释放时&#xff0c;SMB0CN寄存器的第7位一直为 1&#xff0c;总线没有释放。 SMBus总线释放超时的一个纠错机制&#xff0c;它允许SMBus状态机在 SDA 和 SCL 信号线同为高电平超过 10个SMBus时钟源周期后判断总线为释放状态。 如果总线释放…

Linux下gdb常规调试

Linux系统&#xff1a;ubuntu-20.04 gdb简介 gdb 全称“GNU symbolic debugger”&#xff0c;从名称上不难看出&#xff0c;它诞生于 GNU 计划&#xff08;同时诞生的还有 GCC、Emacs 等&#xff09;&#xff0c;是 Linux 下常用的程序调试器。发展至今&#xff0c;GDB 已经迭…

代码随想录算法训练营day59|503.下一个更大元素II |42.接雨水

503.下一个更大元素II 力扣题目链接 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&#xff0c…

【面试必刷TOP101】 删除有序链表中重复的元素-I 删除有序链表中重复的元素-II

目录 题目&#xff1a;删除有序链表中重复的元素-I_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder…

CTF--攻防世界杂项--第二课

下载题目根据文件类型可知&#xff0c;这是一个流量包 那么接下来就是利用分析流量包常用的工具wireshark来分析 利用关键词进行搜索 http contains shell 在最后一条数据中看到了flag。 以上就结束&#xff0c;非常简单的一道题。

nginx相关漏洞处理:CVE-2016-2183、CVE-2022-41741、CVE-2022-41742

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、漏洞内容二、现状三、centos7安装openssl11四、升级nginx到1.24.01. 下载nginx2. 编译安装nginx3. 配置nginx.service4. 重启nginx 总结 前言 漏扫发现机器…

[maven] 使用 Nexus 管理 repository

[maven] 使用 Nexus 管理 repository 大概是说还有一篇笔记&#xff0c;两篇内容&#xff0c;maven 的内容就差不多过完了。这一篇笔记主要记一下 maven 的 central 管理部分&#xff0c;之前提到过我们公司用的就是 nexux 做了一个镜像&#xff0c;这里也会用 docker 去创建一…

力扣刷题-数组-滑动窗口法相关题目总结

209. 长度最小的子数组&#xff08;最小滑窗&#xff09; 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&…

uniapp确认提示框;uniapp判断输入框值是否符合正常手机号,身份证号

确认提示框 UniApp 中&#xff0c;你可以使用 uni.showModal 方法来创建确认提示框。以下是一个示例&#xff1a; <template><view class"container"><button click"showAuthModal">显示确认提示框</button></view> </…