另一种降维算法:UMAP(主要是和t-SNE进行对比)

  1. 前置知识:对于t-SNE的理解可参考:tsne 学习使用_Wsyoneself的博客-CSDN博客
  2. 算法的不同:
    1. 把距离之间度量换成了指数分布,并没有考虑归一化。同时用交叉熵代替了KL散度。
    2. 运行速度比t-SNE快,因为采用的是随机梯度下降。
    3. 用平面或立体空间内的点的疏密远近表现其在原本多维度状态下的疏密远近。
  3. 降维过程(t-sne和UMAP的算法共性):
    1. 计算各点之间的高维距离拟合分布函数
    2. 初始化各点的低维分布
    3. 计算各点的低维距离
    4. 计算降维的信息损失,优化低维分布,保留高维特征,直至达到预设条件。
  4. 区别:
    1. 计算高维距离时:
      1. tSNE会计算所有点之间的距离,通过Perplexity(困惑度)参数调整全局结构与局部结构间的软边界
      2. UMAP则只计算各点与最近k个点之间的距离,严格限制局部的范围
    2. 对信息损失的计算方法不同
      1. tSNE使用KL散度衡量信息损失,在全局结构上存在失真的可能
      2. UMAP使用二元交叉熵,全局和局部结构均有保留
    3. 降维效果对比:
      1. 全局结构:
        1. tsne因为其损失函数(KL散度)对低维近、高维远的惩罚较轻,导致在平面上,整体差异较小的集群(cluster)可能比差异较大的集群离得更远。故而tSNE图多数情况下不能体现真实的全局结构。
          1. KL散度的惩罚分数是不对称的,对于高维近低维远的罚分高,对于高维远低维近的罚分趋近于0。而二元交叉熵罚分是对称的,对于两种情况都有较高罚分。
        2. UMAP损失函数使用的是二元交叉熵,对低维近高维远或低维远高维近的惩罚都较重,所以UMAP比tSNE更能体现真实的全局结构。
      2. 局部结构:
        1. tSNE的局部结构更为紧凑。由于tSNE在拟合高维数据时使用高斯分布转换成概率,低维数据则使用t分布转换概率,这会使高维距离近的点在低维空间中更近,反之更远。
        2. UMAP设置了min_dist,在计算信息损失时,对低维距离小于min_dist的点视为同价,故而会隐藏一部分局部结构信息。
      3. 结果稳定性:tSNE使用随机分布初始化低维数据,而UMAP使用图拉普拉斯变换分配初始的低维坐标(根据高维数据特征进行低维数据的初始化),故UMAP的结果具有更高的稳定性。
    4. 重要参数:
      1. tsne-perplexity:
        1. 表示t-SNE优化过程中考虑邻近点的多少):
        2. perplexity会会影响点的松散程度。perplexity越大,集群内部越紧密;反之,集群越松散。
        3. 从结构特征的角度讲,增大perplexity将会增加高维远距离点的影响,使局部结构模糊;减小perplexity则增加近距离点的影响,体现局部。
        4. Perp过大过小都会导致重要信息损失,或产生不必要的计算。
      2. UMAP-n_neighbors(即算法中的k)、min_dist
        1. n_neighbors与Perp相似,越大集群越紧密,且适当增加n_neighbors能更好地体现数据的全局结构。
        2. 在实际应用中,n_neighbors最好大于较小集群内的点个数,防止有效的距离计算闭锁在集群内部,能更真实地反应全局结构。
        3. min_dist则可根据需求进行调整,较小值能更真实地反应高维结构,但也会带来一定的信息冗余,而上调min_dist能更直观地展示全局结构,同时有一定可能会反应错误的集群关系

    

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UMAP(Uniform Manifold Approximation and Projection)是一种基于流形学习的降维算法,可以用于可视化高维数据,类似于 t-SNE算法。在 Python 中,可以使用 umap-learn 包来实现 UMAP 算法的调用。下面是安装和使用 umap-learn 包的步骤: 1. 安装 umap-learn 包 可以使用 pip 命令来安装 umap-learn 包: ``` pip install umap-learn ``` 2. 导入 umap-learn 包 在 Python 代码中,使用以下语句导入 umap-learn 包: ```python import umap ``` 3. 调用 UMAP 算法 使用 umap-learn 包中的 UMAP 类来调用 UMAP 算法。以下是一个示例代码: ```python import numpy as np import umap # 生成随机数据 X = np.random.rand(100, 10) # 调用 UMAP 算法 umap_obj = umap.UMAP(n_neighbors=5, min_dist=0.3, metric='correlation') umap_result = umap_obj.fit_transform(X) # 输出降维后的结果 print(umap_result) ``` 在上面的示例代码中,我们先生成了一个 100 行 10 列的随机数据集。然后,使用 UMAP 类来调用 UMAP 算法,并将参数 n_neighbors 设置为 5,min_dist 设置为 0.3,metric 设置为 correlation。最后,使用 fit_transform 方法将数据集 X 降维,并将结果保存在 umap_result 变量中。最后,我们输出了降维后的结果。 注意,UMAP 算法适用于高维数据集,但是如果数据集的维度过高,UMAP 算法可能需要较长的计算时间。因此,在使用 UMAP 算法时,应该根据具体情况来调整参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值