一、介绍

UMAP(Uniform Manifold Approximation and Projection for Dimension Reduction)是一种非线性降维技术,类似于t-SNE、PCA,可用于可视化。在降维应用中, 相比于t-SNE,umap既快又准。

如果对 UMAP算法感兴趣,可以阅读论文

McInnes, L, Healy, J, UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction, ArXiv e-prints 1802.03426, 2018



二、准备数据

2.1 读取数据

我从 人民日报(1946-2023.12.18) 训练的 word2vec模型 中, 选出了100个词的词向量,构建得到了 data.csv.gz

  • word: 词语,一共有100个
  • category: 词语的类别, 一共五种(亲人、环保、研发、国王、数字化)
  • f1,f2,f3,…,f200 词向量的200维(每个词语的词向量是200维的向量)
import pandas as pd

df = pd.read_csv('data.csv.gz', compression='gzip')
df


2.2 查看词语&对应类别

大邓准备了五类词, 每类词20个词, 词语类别按顺序依次是 亲人、环保、研发、国王、数字

df['word'].tolist()

Run

['爸爸', '姐姐', '奶奶', '女儿', '外公', '哥哥', '儿子', '祖母', '父母亲', '外婆', '妹妹', '孙女', '姥爷', '小女儿', '姥姥', '二姐', '姑姑', '弟弟', '弟弟妹妹', '爸爸妈妈', '低碳', '节能', '环境保护', '绿色环保', '节能降耗', '环保节能', '生态环保', '节能环保', '节能低碳', '绿色低碳', '减排', '绿色发展', '保护环境', '清洁生产', '建筑节能', '环境治理', '减碳', '循环经济', '低碳环保', '治理污染', '科研开发', '科技研发', '科研创新', '研发创新', '技术创新', '技术开发', '技术研发', '产品开发', '产品研发', '原始创新', '科技创新', '研究开发', '新药研发', '核心技术研发', '产学研结合', '科技开发', '基础研究', '新产品开发', '研发成果', '科研成果产业化', '二世', '王储', '公主', '女王', '王妃', '陛下', '王宫', '王室', '王室成员', '皇室成员', '登基', '六世', '继承王位', '五世', '摄政王', '七世', '英国女王', '三世', '四世', '继位', '人工智能技术', 'AI', '数字技术', '虚拟现实', '云计算', '万物互联', '信息技术', '语音技术', '物联网', '智能硬件', '5G技术', 'IoT', '智能应用', '软件技术', '融合应用', '6G', '人工智能机器人', '数据应用', '人工智能应用', '智能']

词语对应的类别

print(df['category'].tolist())

Run

['亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '亲人', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '环保', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '研发', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '国王', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化', '数字化']



三、实验代码

3.1 环境准备

cmd(terminal) 安装本文需要的库

pip3 install umap-learn
pip3 install datashader,bokeh,holoviews  #可视化可能会用到的库

3.2 降维

将 100 个词的词向量数据从 200 维压缩到 2 维

import umap

word_emb_redution_data = umap.UMAP(
    n_neighbors = 15,  #默认,不需要理解
    min_dist = 0.1, #默认,不需要理解
    n_components = 2, #2维
    random_state = 666, #默认, 保证任意时空代码运行结果的随机状态是一致的
).fit(df.iloc[:, 2:])

word_emb_redution_data


3.3 静态可视化

绘制静态的图(没有鼠标交互), 底层应该是调用了 matplotlib 。 因为实验数据是中文词语, 可视化可能绘乱码。为避免问题, 提前运行代码

import matplotlib.pyplot as plt
import matplotlib
import matplotlib_inline
matplotlib_inline.backend_inline.set_matplotlib_formats('png', 'svg')
import scienceplots
import platform
plt.style.use(['science', 'no-latex', 'cjk-sc-font'])
system = platform.system()  # 获取操作系统类型

if system == 'Windows':
    font = {'family': 'SimHei'}
elif system == 'Darwin':
    font = {'family': 'Arial Unicode MS'}
else:
    font = {'family': 'sans-serif'}
matplotlib.rc('font', **font)  # 设置全局字体

绘制 五类词的词向量投射到2维空间中的可视化 的静态图(没有鼠标交互)

import umap.plot

umap.plot.points(word_emb_redution_data, labels=df.category, width=800, height=500)
plt.title('五类词的词向量投射到2维空间中的可视化')


3.4 动态交互可视化

umap.plot 内置了bokeh的动态交互功能, 需要先构造鼠标交互悬浮的信息

mapper = {'亲人': 1, '环保': 2, '研发':3, '国王':4, '数字化':5 }


hover_data = pd.DataFrame({'index':df.index,
                           'item': df['category'], 
                           'label': df['category'].map(mapper)})

hover_data


接下来的代码将会生成一个 html 文件, 因为是动态效果,在博客(公众号)都无法完全显示, 大家如果想查看,可以点击链接下载

https://textdata.cn/blog/2024-01-23-umap/umap_interactive.html

p = umap.plot.interactive(clusterable_embedding, 
                          labels=df.category, 
                          hover_data=hover_data, 
                          point_size=5, 
                          width=800, 
                          height=500)
umap.plot.show(p)



四、下载资料

点击下载实验数据 data.csv.gz



广而告之