数据处理降维方法UMAP(Uniform Manifold Approximation and Projection)学习跟练

数据处理降维方法UMAP(Uniform Manifold Approximation and Projection)学习跟练

本文将结合UMAP官方教程、知乎和GitHub上的相关内容,深入学习UMAP算法。以下是参考部分搬运的网站,感谢带领学习:
知乎学习资源:https://zhuanlan.zhihu.com/p/432805218
原作者学习资源:https://towardsdatascience.com/umap-dimensionality-reduction-an-incredibly-robust-machine-learning-algorithm-b5acb01de568

在运行示例代码的同时,实体提供更多的过程分析,以尽可能详细地解释代码的含义、中间步骤输出的数据以及所进行的处理过程。
通过对UMAP算法的代码进行逐行解析和说明,帮助读者更好地理解UMAP的实现原理和算法流程。给出了一些关键超参数的定义。
这个过程我会尽力提供清晰的解释和示例代码注释,以便读者能够更好地理解UMAP算法的代码应用和工作原理。通过这种方式,读者将能够更好地掌握UMAP算法,并在实际问题中应用和调整算法以取得更好的结果。部分文本内容使用了ChatGPT润色。



前言

UMAP是一种非线性降维和可视化算法,全称为Uniform Manifold Approximation and Projection(均匀流形近似和投影)。它是一种基于图论和流形学习的方法,用于将高维数据映射到低维空间,以便于可视化和分析。

UMAP的主要目标是保持数据点之间的局部结构和全局结构。它通过构建数据点之间的邻近关系图,并利用图的拓扑结构进行流形近似和优化。UMAP使用了一种称为高维距离的度量方式,在低维空间中通过最小化原始距离和映射距离之间的差异来进行嵌入优化。

相较于其他降维算法(如PCA和t-SNE),UMAP在保持数据结构和保持高维空间中的相对距离方面表现出更好的能力。它能够在保持数据点之间的局部和全局结构的同时,有效地处理大规模数据集。

UMAP已经在数据可视化、聚类分析、异常检测、模式识别等领域取得了广泛的应用和成功。它是一个强大且灵活的工具,能够帮助我们更好地理解和分析高维数据。

接下来笔者会从基础概念和代码的角度记录学习的过程。


一、降维的作用是什么?

  1. 数据可视化
  2. 识别高维度空间的结构,在低维中进行展示,使得一些高维的抽象信息能够被人所理解,能够被代码绘图展示。

二、关键的参数

以下两个参数是在学习流形结构的过程中使用的。

1.n_neighbors(数据点选择的上限)
Nearest-Neighbor-Descent 算法是使用UMAP方法的过程中的一个关键算法,n_neighbors是这个算法的一个超参数。这个参数是一个具体的数值,他代表我们想指定多少个临近点作为数据中局部和全局结构的平衡。
n_neighbors的值如果取得较小,表示我们更需要局部的解释,需要更准确的得到局部细节的信息。n_neighbors的值如果取得较大,表示我们的估计基于更大的区域,着眼于对于整个数据流的信息。

2.local_connectivity(数据点选择的下限)
默认值为1,使得每个点100%能够连接到另一个点。

以下两个参数是在学习流形结构的之后,在映射的过程中使用的。

3.min_dist
默认值为0.1。UMAP在学习流形结构后,下一步是将其投影(映射)到低维空间。这个映射也会影响到近邻距离,因此需要使用min_dist来定义嵌入点之间的最小距离。避免多点重合的情况。

4.Cross-Entropy
确定最小距离后,UMAP可以开始寻找较好的低维流形表示, 通过最小化成本函数(也称为交叉熵 (CE))来实现。

三、UMAP方法完成后的输出

UMAP方法完成后,我们会得到一个数组,数据包含了指定的低维空间中每个数据点的坐标。这样,我们就可以可视化高维数据了。

四、代码实例跟练

将在google colab上执行代码,给出代码跟练的结果。

1.引入库并读入数据

因为google colab上默认没有安装UMAP,所以我们首先要安装UMAP的库

! pip install umap-learn

在这里插入图片描述

引入数据处理、可视化以及数据分离的库

import pandas as pd
import numpy as np
import plotly.express as px
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split

#引入UMAP方法
from umap import UMAP

加载数据集,load_digit函数

digits = load_digits()
X, y = load_digits(return_X_y=True)

print('Shape of digit images: ', digits.images.shape)
print('Shape of X (main data): ', X.shape)
print('Shape of y (true labels): ', y.shape)
import numpy as np

#分析一下上述数据的输出
X, y = load_digits(return_X_y=True)
print("这是digit数据集的特征矩阵",X)
print("这是数据集的对应标签",y)
print('这是手写数据集的维度信息:', digits.images.shape)
print("X的数据维度",X.shape)
print("y的数据维度",y.shape)

在这里插入图片描述

下面的代码绘制一个包含2行5列的子图网格,并在每个子图中显示手写数字图像和对应的标签。

#下面的代码绘制一个包含2行5列的子图网格,并在每个子图中显示手写数字图像和对应的标签。

fig, axs = plt.subplots(2, 5, sharey=False, tight_layout=True, figsize=(12,6), facecolor='white')
n=0
plt.gray() #显示黑白图像
for i in range(0,2):
  for j in range(0,5):
    #【注】matshow是Matplotlib库的函数,显示二维数组或者矩阵的图形表示
    #它将二维数据的值映射到颜色图谱,并将其显示为图像
    axs[i,j].matshow(digits.images[n])
    axs[i,j].set(title=y[n])
    n=n+1
plt.show()

在这里插入图片描述

2.创建3D绘图

创建3D绘图界面


def chart(X, y):
    #【注】这里的颜色按照标签列的字符串形式进行着色
    #--------------------------------------------------------------------------#
    # This section is not mandatory as its purpose is to sort the data by label
    # so, we can maintain consistent colors for digits across multiple graphs

    # Concatenate X and y arrays
    arr_concat=np.concatenate((X, y.reshape(y.shape[0],1)), axis=1)
    # Create a Pandas dataframe using the above array
    df=pd.DataFrame(arr_concat, columns=['x', 'y', 'z', 'label'])
    # Convert label data type from float to integer
    df['label'] = df['label'].astype(int)
    # Finally, sort the dataframe by label
    df.sort_values(by='label', axis=0, ascending=True, inplace=True)
    #--------------------------------------------------------------------------#

    # Create a 3D graph
    fig = px.scatter_3d(df, x='x', y='y', z='z', color=df['label'].astype(str), height=900, width=950)


    #下面这段代码是在设置图标的外观设置
    fig.update_layout(title_text='UMAP',
                      showlegend=True,
                      legend=dict(orientation="h", yanchor="top", y=0, xanchor="center", x=0.5),
                      scene_camera=dict(up=dict(x=0, y=0, z=1),
                                            center=dict(x=0, y=0, z=-0.1),
                                            eye=dict(x=1.5, y=-1.4, z=0.5)),
                                            margin=dict(l=0, r=0, b=0, t=0),
                      scene = dict(xaxis=dict(backgroundcolor='white',
                                              color='black',
                                              gridcolor='#f0f0f0',
                                              title_font=dict(size=10),
                                              tickfont=dict(size=10),
                                             ),
                                   yaxis=dict(backgroundcolor='white',
                                              color='black',
                                              gridcolor='#f0f0f0',
                                              title_font=dict(size=10),
                                              tickfont=dict(size=10),
                                              ),
                                   zaxis=dict(backgroundcolor='lightgrey',
                                              color='black',
                                              gridcolor='#f0f0f0',
                                              title_font=dict(size=10),
                                              tickfont=dict(size=10),
                                             )))
    # 更新散点的标记大小,边线颜色和宽度
    fig.update_traces(marker=dict(size=3, line=dict(color='black', width=0.1)))

    fig.show()

设置UMAP画图超参数,因为这部分的参数很重要,所以每个参数都给了中文的对应解释。

 Configure UMAP hyperparameters
reducer = UMAP(n_neighbors=100, # 邻近参数,根据想探索的数据大小确定数值。
               n_components=3, # 嵌入的空间维度,default=2
               metric='euclidean', # 计算高维空间中距离的度量方式
               n_epochs=1000, # default None,用于优化低维嵌入的训练轮数。较大的值会产生更准确的嵌入结果
               learning_rate=1.0, # default 1.0, 嵌入优化的初始学习率。
               init='spectral', # default 'spectral',它表示低维嵌入的初始化方式。可选的选项有:{'spectral', 'random', 一个初始嵌入位置的NumPy数组}。
               min_dist=0.1, # default 0.1, 它表示嵌入点之间的有效最小距离。
               spread=1.0, # default 1.0, 它表示嵌入点的有效尺度。与min_dist结合使用,决定了嵌入点的聚集程度。
               low_memory=False, # default False, 对于某些数据集,最近邻计算可能会消耗大量内存。如果发现UMAP由于内存限制而失败,请考虑将此选项设置为True。
               set_op_mix_ratio=1.0, # default 1.0, 此参数的值应介于0.0和1.0之间;值为1.0将使用纯模糊并集,而值为0.0将使用纯模糊交集。
               local_connectivity=1, # default 1, 它表示所需的局部连接性,即在局部级别上应该假设连接的最近邻数量。
               repulsion_strength=1.0, # default 1.0, 它是在低维嵌入优化中应用于负样本的加权值。
               negative_sample_rate=5, # default 5, 增加此值将导致应用更大的斥力力量,增加优化成本,但略微提高准确性。
               transform_queue_size=4.0, # default 4.0, 较大的值将导致较慢的性能,但更准确的最近邻评估。
               a=None, # 更具体的参数,用于控制嵌入。如果为None,则这些值将根据"min_dist"和"spread"的确定自动设置。
               b=None, # default None, 用于控制嵌入。如果为None,则这些值将根据"min_dist"和"spread"的确定自动设置。
               random_state=42, # default: None, random_state是随机数生成器使用的种子。
               metric_kwds=None, # default None) 传递给度量函数的参数,例如Minkowski距离的"p"值。
               angular_rp_forest=False, # default False,是否使用角度随机投影森林来初始化近似最近邻搜索。
               target_n_neighbors=-1, # default -1,用于构建目标简单集的最近邻数量。如果设置为-1,则使用n_neighbors的值。
               transform_seed=42, # default 42,用于转换操作的随机种子,用于处理转换过程中的随机性。
               verbose=False, # default False,控制日志输出的详细程度。
               unique=False, # default False, 控制在进行嵌入之前是否对数据的行进行唯一化处理。如果设置为True,则会删除重复的行,保留唯一的行。
              )

# Fit and transform the data
X_trans = reducer.fit_transform(X)

# Check the shape of the new data
print('Shape of X_trans: ', X_trans.shape)

绘图并得到结果

chart(X_trans, y)

在这里插入图片描述


总结

UMAP(Uniform Manifold Approximation and Projection)是一种非线性降维和可视化算法。它通过构建数据点之间的邻近关系图,并利用图的拓扑结构进行流形近似和优化。可用在高维度的数据处理中,使其可视化。网上的教程很详细,跟练的学习效果显著。推荐。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值