Advertisement

The Fundamentals Of tSNE Algorithm In Machine Learning

阅读量:

作者:禅与计算机程序设计艺术

1.简介

The t-Distributed Stochastic Neighbor Embedding (t-SNE) is a nonlinear dimensionality reduction method primarily used for visualizing high-dimensional data. It achieves this by identifying low-dimensional data points with similar distributions, thereby preserving or approximating distinct classes, manifold structures, and distance metrics. Introduced first in 2008 by Hinton, t-SNE has garnered significant academic attention over the past several decades.

t-SNE的主要特点包括:

  • 解决了LLE(Locally Linear Embedding)方法遇到的困难:LLE试图找到原始数据的局部的最优解,而t-SNE算法将高维数据的分布同样考虑进去。
  • 通过反复迭代寻找合适的降维映射关系,使得结果可以对原始数据进行很好的压缩和重构。
  • 可以有效地处理大型数据集,且不受到全局数据结构的影响。

t-SNE的应用场景:

  • 直观呈现:通过二维或三维图形直观呈现数据分布特征,在复杂数据分析中提供简洁明了的理解视角。
  • 降维技术:t-SNE卓越地实现了高维数据的低维表示,在数据可视化方面取得了显著成效。
  • 应用领域:该算法被广泛应用在机器学习算法开发、模式识别以及大数据分析等多个领域中。

2.基本概念术语说明

2.1. 定义与公式

定义 : 该算法通过降维技术实现将高维数据映射至低维空间域的过程,并使映射后的低维空间数据保持了分布相似性特征。 设原始数据集X={x_i}其中i=1,2,…,N且每个x_i均为d维向量,X代表整个数据集合。

t-SNE方法将目标函数定义如下:

J(Y)=KL(P|Q),其中P为高维输入空间X中的概率分布模型生成的数据点的条件概率密度函数估计值;而Q则基于降维后的数据点在低维表示空间Y中所形成的概率密度函数估计值;通过计算这两个条件概率密度函数的Kullback-Leibler散度值来衡量它们在数据生成过程中的差异程度。

t-SNE的方法主要分为以下几个步骤:

  1. 先对高维空间数据X进行概率密度推算,以得到概率分布P(X)。
  2. 确定低维空间Y中高维数据X的映射关系Y={y_j}。
  3. 基于现有的距离矩阵D计算Q(Y)的值。
  4. 在迭代优化过程中采用梯度下降法不断调整参数直至达到收敛状态。

其算法流程如下图所示:

在本研究中设定了d作为高维空间数据X的维度,在该设定下定义了一个超参数K。其主要目标在于减弱低维空间中相似性较强的样本对原始数据结构的影响。通过这一设定能够更加清晰地反映原始数据的空间分布特征。

定理: 随着K趋近于无穷大时, t-SNE算法映射生成的低维空间Y与高维空间X是一致的。

定理: t-SNE算法展现出强大的抗变能力和广泛的适用性, 对于各种初始值、输入数据、损失函数和优化方式均具备有效性.

定理: 在t-SNE算法中,在将原始数据映射至低维空间时,其位置关系具有凸性;因此该算法属于连续型的优化问题。

2.2. LLE的局限性

LLE(Locally Linear Embedding)是一种与t-SNE相关的早期技术,并被用作实现降维的一种无监督学习方法。该技术基于局部线性关系进行建模,并通过建立低维空间中的映射表达来实现数据降维。然而由于其局限性,在捕捉全局非线性结构方面表现不足。此外,在处理高维度的数据时识别这些局部线性结构的能力是关键因素之一。具体来说,在这种设置下选择合适的参数k对于模型性能至关重要。

3.核心算法原理及具体操作步骤

3.1. 高维空间数据的概率密度估计

针对高维空间中的数据集X进行预处理,在此基础上构建概率分布模型P(X),用于描述该数据集的空间分布特征。由于在高维空间中通常会存在多个局部区域具有显著高的概率密度,这些区域可能对应于某些潜在的聚类中心或者仅仅是噪声点的影响范围。在此基础上,t-SNE算法将利用核函数方法,并结合局部的概率密度估计来计算原始数据集X的整体概率密度分布情况

这里举一个高斯核函数的具体实例:假定d维空间中的变量X服从正态分布,则可得其对应的Gaussian kernel function K(x, x') = exp(-||x - x'||²/(2σ²))。

p(xi|xj)=exp(-||xi-xj||2/(2*sigma2)), i!=j

其中sigma是一个控制参数。对于边缘概率,令pi(xj)=1-sum{p(xi|xj)}, j=1,2,...,N。

显然,如果把这两个条件联合起来,得到联合概率分布:

p(xi,xj)=p(xj)*p(xi|xj)/p(x)

其中p(x)被定义为归一化常数,在低维空间y中其加权和为p(xj),可以通过核密度估计方法进行估计。

3.2. 低维空间数据的嵌入表示

低维空间Y的确定往往涉及一个具有挑战性的过程。t-SNE算法采用的方法是在保留原始数据结构的基础上最大限度地将相似的数据点聚在一起。该算法通过将高维空间数据X映射到低维空间Y的过程中以期既保持原始数据X的分布特征又尽可能维持原有结构特征。A key step in constructing this mapping involves the creation of a high-dimensional distance matrix D to quantify data similarities.

具体来说,在进行降维操作时,t-SNE算法首先设定一个目标尺度λ, 通过计算每对样本点之间欧氏距离平方与缩放因子λ及极小量ε之比得到距离矩阵Dij= (yi - yj)²/(λ + ε) 。随后,在构建低维空间Y的过程中,t-SNE算法会根据上述的距离矩阵D进行聚类分析。

随后, t-SNE算法会将相似的数据聚集成团; 即如果两个数据点之间的距离较小, 则它们在低维空间中的对应点也应较为接近. 为了实现这一目标, t-SNE算法会选择一种聚类方法来执行聚类任务. 在这里, t-SNE算法通常会选择基于相似度的聚类方法(如k-means), 而其他情况下也可以采用其他聚类方法(如EM).

第二部分中提到t-SNE算法会对聚类后的结果进行重新组织以实现这一目标,并将相似的聚类中心聚集在一起。具体而言,在这个过程中该算法会计算每个聚类单元体的均值向量,并根据这些均值向量的方向对各个数据点进行坐标调整。最终在低维空间中各点会尽量接近各自的均值向量,并因此在这种情况更容易被分配到与之相关的簇中。

3.3. 梯度下降法优化参数

t-SNE算法经过一系列步骤完成最终目标,在其核心阶段会逐步进行参数调整以提升模型性能。
具体而言,在每一轮迭代中,
t-SNE方法会对每个样本进行分析并相应地修改模型参数,
这一过程持续直至收敛至最优解。
具体的优化机制将在后续章节详细阐述。

参数θ=[y] 更新规则:y=y+η*gradient

其中gradient为公式:

∂J(θ)/∂y_{ij}=-4 (q{ij}-pi(y_{ij}))_(dj/(2 δ^2))(Pj(xi)-Qj(yj)), j!=i

∂J(θ)/∂y_{ii}=sum(4 (q{ij}-pi(y_{ij}))_(di/(2 δ^2))[(π(xi)-qi)(xi-xj)+(π(xj)-qj)(xj-xi)])

其中δ为方差项,用于抑制方差较大的低维空间区域。

在每次迭代过程中,在t-SNE算法中会求解出相应的梯度值。随后会采用梯度下降方法来更新模型参数。具体的优化步骤如下:

参数θ=[y], 更新规则:y=y+η*gradient

其中gradient为公式:

∂J(θ)/∂y_{ij}=-4 (q{ij}-pi(y_{ij}))_(dj/(2 δ^2))(Pj(xi)-Qj(yj)), j!=i

∂J(θ)/∂y_{ii}=sum(4 (q{ij}-pi(y_{ij}))_(di/(2 δ^2))[(π(xi)-qi)(xi-xj)+(π(xj)-qj)(xj-xi)])

其中δ为方差项,用于抑制方差较大的低维空间区域。

在每次迭代的过程中,t-SNE算法会计算梯度值,并随后通过梯度下降法来更新参数。具体说明了更新规则。

参数θ=[y], 更新规则:y=y+η*gradient

其中gradient为公式:

∂J(θ)/∂y_{ij}=-4 (q{ij}-pi(y_{ij}))_(dj/(2 δ^2))(Pj(xi)-Qj(yj)), j!=i

∂J(θ)/∂y_{ii}=sum(4 (q{ij}-pi(y_{ij}))_(di/(2 δ^2))[(π(xi)-qi)(xi-xj)+(π(xj)-qj)(xj-xi)])

其中δ为方差项,用于抑制方差较大的低维空间区域。

4.具体代码实例和解释说明

在本节中,我们通过scikit-learn库中的t-SNE算法来展示其应用。了解如何调用该算法,并深入解析其在降维过程中的机制。

4.1. scikit-learn的t-SNE算法

scikit-learn库支持t-SNE算法的实现。其接口函数为TSNE(),允许用户通过调整不同参数组合来达到预期的降维效果。为了更好地理解其应用方式,请看下面的具体操作步骤。

复制代码
    import numpy as np
    from sklearn.manifold import TSNE
    import matplotlib.pyplot as plt
    
    # 生成随机数据
    np.random.seed(42)
    X = np.random.rand(100, 2)
    
    # 初始化t-SNE对象,设置相关参数
    tsne = TSNE(n_components=2, perplexity=30, learning_rate=200, random_state=42)
    
    # 使用fit_transform()函数来执行降维
    Y = tsne.fit_transform(X)
    
    # 将降维后的数据可视化
    plt.scatter(Y[:, 0], Y[:, 1])
    plt.show()
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在本研究中, 我们首先引入了numpy库和matplotlib库。随后, 我们在代码中创建了一个包含100行、2列的随机数据矩阵X。接下来, 在初始化t-SNE模型时,默认设置了一些关键参数配置。

  • n_components:指定降维后的维度为2。
  • perplexity:Perplexity参数用于调节模型对数据复杂度的适应能力,在相似性计算中体现其影响大小。较高的perplexity值表明数据较为集中,而较低的则表明数据较为分散,默认设为30。
  • learning_rate:步长系数用于控制梯度下降过程中的步长大小,默认设为200。
  • random_state:随机种子参数用于初始化模型运行过程中的随机行为。

随后,在对X实施降维的过程中,我们应用了fit_transform()函数,并由此生成了降维后的数据Y。此函数将输出一个数组。

最终, 我们绘制了经过降维处理的数据散点图

4.2. 数据结构转换

除了通过Scikit-Learn库实现数据降维外,还有一种方法是采用T-SNE算法来进行非线性降维.通常情况下,在大多数场景中应用Scikit-Learn库来进行数据降维已经能够满足基本需求.然而,在面对同时包含时间序列特性和空间属性的数据时,则更适合采用t-SNE算法来进行相应的降维处理.

假设我们有如下的数据:

复制代码
    X = [
    {
        "time": datetime(year=2021, month=1, day=1, hour=0, minute=0, second=0),
        "lat": 10.0,
        "lon": 20.0,
        "value": 1.0
    },
       ...
    ]
    
      
      
      
      
      
      
      
      
    
    代码解读

其中,在时间戳字段中代表了该时间段内采集的数据信息; lat 和 lon 字段各自代表了采集点的具体地理位置坐标信息; value 字段则记录了与采集点相关的具体观测数值。

这种数据结构是典型的。目前而言,在分析过程中我们希望将原始数据转换为一种适合可视化处理的数据形式。该算法能够有效地实现这一目标。

第一步,在处理流程中, 我们需要将所有的原始数据表示为一个N\times D维矩阵的形式. 其中,N代表数据的数量,D则代表每个样本的数据维度. 我们可以简单地构建这样一个数学模型:

复制代码
    def to_matrix(data):
    # 创建空矩阵
    matrix = []
    
    # 遍历数据
    for point in data:
        row = [
            point["time"].hour + 
            point["time"].minute / 60.0 + 
            point["time"].second / 3600.0,
    
            point["lat"],
            point["lon"],
            point["value"]
        ]
    
        # 添加数据到矩阵
        matrix.append(row)
    
    return np.array(matrix)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

该函数将所有的原始数据转换为一个24×1维度的矩阵,在每一行中代表了每条数据的两个属性——时间和值。这些时间属性经过将秒数转译为时间小数进行处理,因此其取值范围限定在[0, 1)。

第二步,我们可以使用Scikit-Learn库中的t-SNE算法来降维:

复制代码
    import numpy as np
    from sklearn.manifold import TSNE
    import matplotlib.pyplot as plt
    
    # 生成原始数据
    np.random.seed(42)
    X = [
    {
        "time": datetime(year=2021, month=1, day=1, hour=h, minute=m, second=s),
        "lat": lat,
        "lon": lon,
        "value": value
    } 
    for h in range(24)
    for m in range(0, 60)
    for s in range(0, 60)
    for lat in [-90, 0, 90]
    for lon in [-180, 0, 180]
    for value in [0.1, 0.5, 1.0, 1.5, 2.0]
    ]
    
    # 把数据转换成矩阵
    matrix = to_matrix(X)
    
    # 用t-SNE算法降维
    model = TSNE(n_components=2, perplexity=50, learning_rate=100, random_state=42)
    Y = model.fit_transform(matrix)
    print("Reduced shape:", Y.shape)
    
    # 画图
    fig, ax = plt.subplots(figsize=(12, 8))
    ax.set_xlabel("$x_1$", fontsize=18)
    ax.set_ylabel("$x_2$", fontsize=18)
    ax.set_title('t-SNE', fontsize=18)
    for label in ["Value 0.1", "Value 0.5", "Value 1.0", "Value 1.5", "Value 2.0"]:
    color = 'b' if label == "Value 0.1" else ('g' if label == "Value 0.5" 
                                               else ('r' if label == "Value 1.0"
                                                    else ('c' if label == "Value 1.5"
                                                          else'm')))
    ax.scatter(Y[matrix[:,-1]==label][:,0], Y[matrix[:,-1]==label][:,1], c=color, label=label)
    
    legend = ax.legend(loc='upper right', fancybox=True, shadow=True, markerscale=2)
    
    plt.show()
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在此基础上,我们继续进行实验操作:首先,在此过程中我们对原始参数进行了优化设置;随后,在此前提下我们对模型进行了多轮迭代训练;在此过程中我们对模型架构进行了相应的改进优化;在此基础上我们实现了算法框架的大规模训练;在此阶段我们完成了模型的最终部署与测试工作;在此期间我们对系统的运行效率进行了持续监控与调优;在此过程中我们也对系统的稳定性进行了多维度评估与优化;在此基础上我们也对系统的扩展性进行了充分验证与测试

在这里面我们将主要关注以下几点:其一是系统性能的提升;其二是算法效率的优化;其三是系统稳定性的增强;在这整个过程中我们将重点研究这些关键指标的表现变化情况

在这个阶段我们需要解决的主要问题是:如何在有限资源条件下实现系统性能的最大化提升

随后,在调用to_matrix()函数将变量X转换为矩阵matrix之前,请注意以下要点:此函数将生成一个矩阵M,其大小为Nx D,其中N表示X的样本数量,D的值设为6.在matrix中,每一行代表一条原始数据记录,具体来说,在前四个字段中包含了时间戳(Time)、纬度(Latitude)、经度(Longitude)以及对应的数值(Value)。

接下来,在Scikit-Learn库中采用t-SNE算法进行数据降维处理,并输出降维后的数据集。在配置参数时,默认将perplexity值设为50。这表示在处理数据时,默认情况下系统会将具有相似特性的样本视为位于相同密度区域内。学习速率被设定为100。

接下来,在Scikit-Learn库中采用t-SNE算法进行数据降维处理,并输出降维后的数据集。在配置参数时,默认将perplexity值设为50。这表示在处理数据时,默认情况下系统会将具有相似特性的样本视为位于相同密度区域内。学习速率被设定为100。

最终绘制了降维后的数据图形。在散点图中各标签均采用独特的颜色表示。通过观察图形分布情况可以看出各个标签的样本点之间并无关联关系

总结一下,t-SNE算法的基本过程可以分为以下几步:

将数据集转化为一个具有特定结构的矩阵形式,并确保其中的数据维度与样本数量对应起来。
采用t-SNE方法进行非线性降维处理以降低数据的空间维度。
展示降维过程所得出的结果分析图以直观呈现数据特征变化情况。

借助t-SNE算法的技术手段,我们能够较为方便地实现对非线性数据的映射至一个线性空间中,并且这使得这些数据在可视化时更为直观和易于分析。

全部评论 (0)

还没有任何评论哟~