深度 | 详解可视化利器t-SNE算法:数无形时少直觉

大数据

T 分布随机近邻嵌入(T-Distribution Stochastic Neighbour Embedding)是一种用于降维的机器学习方法,它能帮我们识别相关联的模式。t-SNE 主要的优势就是保持局部结构的能力。这意味着高维数据空间中距离相近的点投影到低维中仍然相近。t-SNE 同样能生成漂亮的可视化。

当构建一个预测模型时,第一步一般都需要理解数据。虽然搜索原始数据并计算一些基本的统计学数字特征有助于理解它,但没有什么是可以和图表可视化展示更为直观的。然而将高维数据拟合到一张简单的图表(降维)通常是非常困难的,这就正是 t-SNE 发挥作用的地方。

在本文中,我们将探讨 t-SNE 的原理,以及 t-SNE 将如何有助于我们可视化数据。

t-SNE 算法概念

这篇文章主要是介绍如何使用 t-SNE 进行可视化。虽然我们可以跳过这一章节而生成出漂亮的可视化,但我们还是需要讨论 t-SNE 算法的基本原理。

t-SNE 算法对每个数据点近邻的分布进行建模,其中近邻是指相互靠近数据点的集合。在原始高维空间中,我们将高维空间建模为高斯分布,而在二维输出空间中,我们可以将其建模为 t 分布。该过程的目标是找到将高维空间映射到二维空间的变换,并且最小化所有点在这两个分布之间的差距。与高斯分布相比 t 分布有较长的尾部,这有助于数据点在二维空间中更均匀地分布。

控制拟合的主要参数为困惑度(Perplexity)。困惑度大致等价于在匹配每个点的原始和拟合分布时考虑的最近邻数,较低的困惑度意味着我们在匹配原分布并拟合每一个数据点到目标分布时只考虑最近的几个最近邻,而较高的困惑度意味着拥有较大的「全局观」。

因为分布是基于距离的,所以所有的数据必须是数值型。我们应该将类别变量通过二值编码或相似的方法转化为数值型变量,并且归一化数据也是也十分有效,因为归一化数据后就不会出现变量的取值范围相差过大。

T 分布随机近邻嵌入算法(t-SNE)

Jake Hoare 的博客并没有详细解释 t-SNE 的具体原理和推导过程,因此下面我们将基于 Geoffrey Hinton 在 2008 年提出的论文和 liam schoneveld 的推导与实现详细介绍 t-SNE 算法。如果读者对这一章节不感兴趣,也可以直接阅读下一章节 Jake Hoare 在实践中使用 t-SNE 进行数据可视化。

  • liam schoneveld 推导与实现地址:https://nlml.github.io/in-raw-numpy/in-raw-numpy-t-sne/
  • 论文地址:http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf

因为 t-SNE 是基于随机近邻嵌入而实现的,所以首先我们需要理解随机近邻嵌入算法。

随机近邻嵌入(SNE)

假设我们有数据集 X,它共有 N 个数据点。每一个数据点 x_i 的维度为 D,我们希望降低为 d 维。在一般用于可视化的条件下,d 的取值为 2,即在平面上表示出所有数据。

SNE 通过将数据点间的欧几里德距离转化为条件概率而表征相似性(下文用 p_j|i 表示):

大数据

如果以数据点在 x_i 为中心的高斯分布所占的概率密度为标准选择近邻,那么 p_j|i 就代表 x_i 将选择 x_j 作为它的近邻。对于相近的数据点,条件概率 p_j|i 是相对较高的,然而对于分离的数据点,p_j|i 几乎是无穷小量(若高斯分布的方差σ_i 选择合理)。

其中σ_i 是以数据点 x_i 为均值的高斯分布标准差,决定σ_i 值的方法将在本章后一部分讨论。因为我们只对成对相似性的建模感兴趣,所以可以令 p_i|i 的值为零。

现在引入矩阵 Y,Y 是 N*2 阶矩阵,即输入矩阵 X 的 2 维表征。基于矩阵 Y,我们可以构建一个分布 q,其形式与 p 类似。

对于高维数据点 x_i 和 x_j 在低维空间中的映射点 y_i 和 y_j,计算一个相似的条件概率 q_j|i 是可以实现的。我们将计算条件概率 q_i|j 中用到的高斯分布的方差设置为 1/2。因此我们可以对映射的低维数据点 y_j 和 y_i 之间的相似度进行建模:

大数据

我们的总体目标是选择 Y 中的一个数据点,然后其令条件概率分布 q 近似于 p。这一步可以通过最小化两个分布之间的 KL 散度(损失函数)而实现,这一过程可以定义为:

大数据

因为我们希望能最小化该损失函数,所以我们可以使用梯度下降进行迭代更新,我们可能对如何迭代感兴趣,但我们会在后文讨论与实现。

使用 NumPy 构建欧几里德距离矩阵

计算 p_i|j 和 q_i|j 的公式都存在负的欧几里德距离平方,即-||x_i – x_j||^2,下面可以使用代码实现这一部分:

def neg_squared_euc_dists(X):

    """Compute matrix containing negative squared euclidean

    distance for all pairs of points in input matrix X



    # Arguments:

        X: matrix of size NxD

    # Returns:

        NxN matrix D, with entry D_ij = negative squared

        euclidean distance between rows X_i and X_j

    """

    # Math? See https://stackoverflow.com/questions/37009647

    sum_X = np.sum(np.square(X), 1)

    D = np.add(np.add(-2 * np.dot(X, X.T), sum_X).T, sum_X)

    return -D

为了更高的计算效率,该函数使用矩阵运算的方式定义,该函数将返回一个 N 阶方阵,其中第 i 行第 j 列个元素为输入点 x_i 和 x_j 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值