Advertisement

Introduction to Unsupervised Deep Learning

阅读量:

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

1.简介

近年来,深度学习技术在图像和文本领域展现出显著的潜力,已在计算机视觉和自然语言处理等领域成功解决了众多复杂问题。然而,无监督学习能力的提升使得数据的分析与理解愈发重要。无监督学习最典型且实用的场景是聚类分析。聚类分析的目标是识别数据集中的共同特征,并将这些特征组织成簇或类别。如电影分类、新闻聚类和社区检测等。无监督学习的优势在于能够从无标签数据中发现潜在模式,同时通过聚类方法将相似数据归类,从而揭示数据内在结构。该方法通过无监督学习算法自动识别数据特征,无需依赖先验知识,显著提升了数据分析的效率和准确性。

该数据集规模较小且分类标签数量有限:基于数据的分类信息提取。
潜在模式和结构的挖掘:通过分析数据间的相似性与关联性,能够识别出数据中隐藏的非明显模式与结构。
无需先验标签:无需提前定义好标签,通过无监督学习方法在新数据上进行有效预测。因此,无监督学习在多个领域发挥着关键作用。例如,图像搜索系统利用无监督学习技术对海量图片进行整合、归纳与分类,帮助用户快速定位感兴趣的内容;广告定位则通过无监督学习挖掘用户兴趣偏好、行为模式与商业价值,为合作伙伴提供精准的营销服务。那么,如何利用深度学习技术构建高效的无监督学习模型呢?接下来,我们将以聚类分析为例,带领读者深入探讨无监督学习的原理、方法与应用。

2.基本概念、术语和符号说明

2.1 概念

无监督学习(Unsupervised learning)是一种机器学习方法,其核心特征是没有预设的输出标签,而是通过算法让计算机自主发现数据中的潜在模式。该方法通常由模型和策略两部分共同构成,其中模型主要负责发现数据中的内在规律,策略则负责选择合适的模型参数。这种自主学习的方式不仅有助于深入理解原始数据的内在联系,还可以用于提升其他任务的表现。无监督学习的另一个显著特点是其无需人工干预。

**聚类分析(Clustering)**是一种无监督学习的技术。给定一组未标记的数据样本,聚类分析将这些样本分配到多个聚类中心中,使得同一类的样本具有较高的相似度,而不同类的样本之间具有显著差异。这种操作有助于揭示数据内在的关联性,并可用于分类处理、异常识别、数据降维、直观呈现、系统化存储等多种应用场景。

嵌入空间(Embedding space) 可以理解为高维空间中的低维表示。通常情况下,嵌入空间可以被视为输入数据的低维映射。利用嵌入空间的表示,可以方便地进行数据相似度计算、降维、聚类以及分类。

协同过滤(Collaborative Filtering)是一种常用的技术,广泛应用于推荐系统中。该技术通过分析用户与商品之间的偏好关系,来推断并推荐用户可能感兴趣的物品。其核心思路是构建用户与商品之间的互动模型,并基于历史交互数据预测用户对未接触商品的潜在评分,从而实现精准推荐。

层次聚类法是一种层级划分的聚类分析方法。该方法首先将所有样本集合划分为多个子集,随后进一步细分这些子集,直至满足特定条件。最终的子集数量即为聚类分析的结果。层次聚类法主要基于样本间的距离进行分类。

2.2 术语和符号说明

样本(Sample) 是指数据集中的一个实体,它可以是一个向量、矩阵或条目等。

特征(Feature)表示样本的某一具体表现。例如,图像的颜色、尺寸、形状等可以被视为样本的特征。

特征向量(Feature vector)即为每个样本所对应的特征值所构成的向量。例如,图像的像素特征可以作为其特征向量的基础,从而反映该图像的像素值分布情况。

标签(Label) 即为样本的类别。例如说,在物体检测任务中,每个样本的标签均代表物体的类别。

数据集(Dataset) 是指所有样本的集合。

在数据科学中,度量(Distance) 用于衡量两个样本之间的差异性。基于不同的距离函数,可以对样本间的差异性进行量化评估。常见的度量方法包括欧几里得距离、城市距离、明考夫斯基距离以及余弦相似性度量等。

聚类中心(Centroids/Clusters center) 被定义为同类样本中的质心。质心的选取主要采用随机选择法、轮盘赌法以及K-means++等不同算法。

密度(Density)作为衡量样本聚集程度的指标,其数值越大,样本的分布越密集。在样本密度较高的区域,通常被识别为聚集区。

核函数Kernel function可以定义为一种非线性变换,这种变换作用于输入变量,生成一个新的输入变量。核函数的作用是将输入空间映射到特征空间中,从而实现对数据的非线性处理。

超参数(Hyperparameter) 即为影响模型训练过程的核心要素。超参数的确定通常采用交叉验证方法,也可在经验指导下设定。

约束条件(Constraint condition) 是模型运行时必须满足的限制条件。常见的约束条件包括最大迭代次数、精度要求等指标,这些条件确保了模型的稳定性和有效性。

约束条件(Constraint condition) 是模型运行时必须满足的限制条件。常见的约束条件包括最大迭代次数、精度要求等指标,这些条件确保了模型的稳定性和有效性。

生成模型(Generative model) 可以理解为基于数据生成联合概率分布模型 P(X,Y),其中 X 代表输入变量,Y 代表输出变量。

判别模型(Discriminative model) 通过明确的规则和方法,基于输入 X 和输出 Y 之间的对应关系,实现输入与输出之间的映射函数 f(x)。

该算法(Expectation-Maximization algorithm)是一种广泛使用的聚类技术。其基本思想分为两个阶段:在E步中,基于现有参数估计样本所属类别;在M步中,更新模型参数以使E步的估计结果达到最大。

标签传播机制 是一种主要针对无监督学习任务的方法。该方法专为节点分类任务设计。在该方法中,节点基于邻居节点的类别信息进行分类。其核心优势在于实现快速聚类效果。

自编码器(Autoencoder) 属于深度学习领域的一种网络模型,在该领域,自编码器被定义为一种能够实现无损特征压缩的网络结构。

变分推断(Variational inference)是一种生成式推理框架。该方法可被应用于生成模型和判别模型的训练过程。

该算法(Conjugate gradient method) 是一种用于求解线性方程组的数值方法。该算法也适用于优化具有非凸性质的目标函数。

该算法基于无监督学习框架构建。具体而言,该模型假设每个节点按照预设的概率转移规则,从当前节点转移到其邻居节点,从而逐步构建一个基于概率的图模型。该模型可有效应用于节点分类任务的研究与实现。

高斯混合模型(Gaussian Mixture Model, GMM) 是一种生成性模型,它能够生成多变量高斯分布。

该卡尔曼滤波方法是一种用于实现动态系统模型构建、状态量估计以及观测数据预测的技术手段。

3.核心算法原理和具体操作步骤以及数学公式讲解

3.1 K-Means算法

K-Means是一种相对简单的聚类方法,具有较高的效率。其基本思路是设定一个K值,随后初始化K个中心点,将每个样本分配到离其最近的中心点,不断重新计算各中心点的位置,重复上述步骤,直至满足收敛条件。

初始化

首先,任意选择k个点作为初始的聚类中心。

确定质心

对每个样本,计算其与各个聚类中心的距离,并选择距离最小的聚类中心。
将相应的样本分配到该聚类中心。
重新计算这些聚类中心的坐标,使其围绕这批样本的质心优化位置。

更新过程

不断迭代,直到聚类中心不再变化或达到指定条件。

算法过程

确定聚类数量K。
随机选择K个初始聚类中心点。
将所有数据点按照最近的聚类中心进行分配。
重新计算K个聚类中心的新坐标位置。
当聚类中心的位置不再变化时,迭代结束。否则,返回步骤三。

数学证明

K-Means算法的目标是将样本点均衡地分配到K个簇中,使得各簇内的样本点与其质心之间的距离平方和最小。因此,对于任意给定的数据点x,当它被分配到质心c_i时,样本点x与质心c_i之间的距离计算为r(x, c_i) = ||x - c_i||^2。这等价于计算样本点x与质心c_i之间的欧几里得距离的平方,即r(x, c_i) = ||x - c_i||^2。

因此,样本点x应该分配到的簇的质心c应该使得平均平方误差最小:

其中,N_i 为簇i中样本点的个数,λ 为正则化系数,R(c_i) 为簇i内部的不平衡度。

为了实现最优化目标,可以采用拉格朗日乘子法,将其转化为如下约束最优化问题:

其中,\mu_i 为簇i的均值,Q 为正则项权重矩阵,\sigma_i 为簇i的标准差。

应用拉格朗日乘子法后,原始问题模型被转换为对偶问题模型,其解即为原始问题模型的解。

令:

则:

其中,θ为模型参数,H为熵,KL散度用于衡量分布间的差异,q(z)为目标分布。通过应用Jensen不等式,可以推导出:

该KL散度的下界可以通过指数函数的形式进行表征,其具体表达式为:KL[q(z)||p(x)]\le \exp\left\{L(\hat{\mu}, \hat{\Sigma}) + \frac{1}{2}\left(\frac{\partial L}{\partial \mu_i}\right)^T(\hat{\mu}_i-\mu_i)(\hat{\mu}_i-\mu_i)^T + \frac{1}{2}\sum_{i。该表达式通过将损失函数的梯度信息与KL散度的下界建立联系,揭示了模型参数估计的优化机制。

由于 KL[\hat{\mu_i}|p(x)\le 0 ,所以:

于是:

KL散度值小于等于L(\hat{\mu}, \hat{\Sigma}),而后者又小于等于所有\mu_i和\Sigma_i的最大值。具体而言,L(\hat{\mu}, \hat{\Sigma})等于L(\mu_i,\Sigma_i)加上一些项,包括二次型和与Q相关的二次项,再减去KL散度。

对于任意两个聚类中心 μ_i 和 μ_j,我们假设它们分别对应均值为 μ_i、单位方差的高斯分布 q(数学符号) 和 p(数学符号)。则:q(数学符号)定义为 x_n 服从均值为 μ_i、单位方差的高斯分布,即 q(数学符号)=N(x_n; μ_i, Σ_i),其中 Σ_i为单位方差矩阵。同样的,p(数学符号)定义为 x_n 服从均值为 μ_i、单位方差的高斯分布,即 p(数学符号)=N(x_n; μ_i, Σ_i)。

其中,q(z|\mu_i)代表从均值为\mu_i、方差为\Sigma_i的高斯分布中抽取的一组值,而p(z|x)代表对数据点x进行无监督聚类后得到的分布。由于q(\mathcal{Z}=i)=N(x_n; \mu_i, \Sigma_i),因此p(z|x)可以视为均值为\mu_i、方差为\Sigma_i的高斯分布。然而,尽管q(z|\mu_i)p(z|x)均基于相同的均值和方差参数,但它们并不完全一致,存在一定的差异。这种差异通过D_{\mathrm{KL}}这一指标得以量化,D_{\mathrm{KL}}则衡量了这两个分布之间的差距。

时间复杂度

K-Means的运行时间复杂度为O(kn^2),其中n为样本数,k为类别数。

优缺点

K-Means算法的优点:

  • 易于实现
  • 可解释性强
  • 运行速度快
  • 算法简单、易于理解

K-Means算法的缺点:

  • 需要指定聚类的数目k
  • 只能处理凸数据集

3.2 DBSCAN算法

DBSCAN(基于密度的聚类算法)是一种用于识别和处理噪声数据的聚类方法。该算法通过将数据空间划分为若干区域来实现数据点的分组,其中核心数据点与周边数据点共同构成数据群组。在数据空间中,连接核心数据点与边缘数据点的连线被称为密度边界线。那些远离密度边界线的数据点则被视为噪声数据,这些数据点无需进行聚类分析。

划分过程

  1. 选择任意一个初始点,若其邻域内无其他邻近点,则该点被定义为孤立点(outlier)。
  2. 以孤立点为起点,沿着密度直线进行扩展,直到与半径r的距离小于该直线。
  3. 将这些扩展出的点归入当前簇中。
  4. 如果扩展出的点与半径r的距离小于该点的邻域内没有其他点,则该点被视为孤立点。否则,继续扩展并将其归入当前簇。
  5. 以当前簇的中心点作为新的密度基准,重复上述步骤,直至簇不再扩展。

算法过程

  1. 设定邻域半径ε。
  2. 选取作为初始样本的随机样本。
  3. 判断该样本是否为核心对象。具体而言:
    a. 如果该样本的所有近邻距离均小于ε,则该样本被确定为核心对象。
    b. 如果该样本的任一近邻距离大于ε,则该样本被确定为边缘对象。
  4. 对核心对象的邻域进行递归判断,直至所有样本均被遍历完毕。
  5. 对每个核心对象的邻域进行检查,判断其归属:
    a. 如果该核心对象的所有邻域均属于同一簇,则该核心对象所在簇的半径更新为r*。
    b. 如果该核心对象的任一邻域不属于任何簇,则该核心对象被标记为孤立点,并归类为噪声。
    c. 如果该核心对象的多个邻域属于不同簇,则该核心对象同样被标记为孤立点,并归类为噪声。
  6. 最后,返回所有被标记为噪声和核心对象的样本序列。

算法优化

注:m表示最小核心对象数量阈值

注:m表示最小核心对象数量阈值

时间复杂度

DBSCAN算法的时间复杂度取决于样本点的邻域大小,一般情况为O(n^2)。

优缺点

DBSCAN算法的优点:

  • 无需人工设定聚类数量
  • 能够处理复杂且异构的数据
  • 聚类精度可控

DBSCAN算法的缺点:

  • 无法识别孤立点
  • 需要事先知道样本的密度分布
  • 可能错分出一些噪声点

3.3 层次聚类算法

层次聚类技术,亦称层次聚类树模型(Hierarchical Clustering Trees, HCFT)或分层聚类法(Divisive Clustering Method, DCM)。其基本思路是首先将所有对象划分为多个初始集群,然后基于预设的距离或相似度准则,逐步合并这些集群,直至形成完整的层次结构。

单样本层次聚类法(Single-Linkage Clustering, SLCM)

基于任意两个样本点之间的最小距离,将数据集划分为若干初始簇。
将任意两个簇进行合并,并重新评估其间的距离。
持续执行上述步骤,直至所有样本点被整合为一个整体。
构建一棵层次结构化的树状图,其中每个叶子节点代表一个初始簇。

全样本层次聚类法(Complete-Linkage Clustering, CLCM)

  1. 基于任意两点间的最大距离进行初始簇划分
  2. 任意两个簇进行合并,并重新计算其间的距离
  3. 反复执行第二步,直至所有簇完成合并
  4. 构建一棵树结构,其中的叶子节点代表初始簇

平均链接层次聚类法(Average-Linkage Clustering, ALCM)

基于任意两个样本点的平均距离对数据集进行划分,确定初始簇的组成。随后,系统性地将任意两个簇进行合并,并重新评估其间的距离关系。持续执行上述步骤,直至所有样本点被整合为单一簇为止。最后,构建一棵层次结构化的树状图,其中每个叶子节点代表一个初始簇。

中心链接层次聚类法(Centroid-Linkage Clustering, CMLCM)

基于任意两个样本中心点的距离进行初始聚类划分,随后将两个簇进行合并,并重新计算其间的距离。依次重复上述步骤,直至所有样本被整合为一个簇为止。最终生成一棵层次结构树,其中每个叶子节点代表一个初始簇。

树形聚类法(Tree-based Clustering, TBC)

通过SLCM、CLCM或ALCM算法对所有数据点进行聚类。
为每一类簇生成一棵树。
将所有生成的树整合为一棵主树。

其他优化手段

除了以下提到的手段之外,层次聚类还可以采用其他优化方法,如EM算法和贪心算法,以实现更好的聚类效果。

时间复杂度

层次聚类算法的时间复杂度随着层数增加呈指数增长。

优缺点

层次聚类算法的优点:

  • 能够自动发现数据结构中的层次关系
  • 模型简单,容易理解

层次聚类算法的缺点:

  • 需要预先给定层次数目
  • 对初始分布敏感
  • 可能陷入局部最优解

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

4.1 K-Means算法

复制代码
    import numpy as np
    from sklearn.cluster import KMeans
    
    np.random.seed(42) # 设置随机种子
    
    data = np.array([[1, 2], [1, 4], [1, 0],[10, 2], [10, 4], [10, 0]]) # 设置数据集
    km = KMeans(n_clusters=2) # 创建KMeans模型,设置分为2类
    pred = km.fit_predict(data) # 训练模型并预测
    print("Cluster centers:", km.cluster_centers_) # 查看聚类中心
    print("Predicted labels:", pred) # 查看预测结果
    
      
      
      
      
      
      
      
      
      
    
    代码解读

输出:

复制代码
    Cluster centers: [[  9.76973684   1.53947368]
     [ 11.94736842  11.53947368]]
    Predicted labels: [1 1 1 0 0 0]
    
      
      
    
    代码解读

4.2 DBSCAN算法

复制代码
    import matplotlib.pyplot as plt
    from scipy.spatial import distance
    from sklearn.cluster import dbscan
    
    
    def plot_dbscan(db, data):
    core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
    core_samples_mask[db.core_sample_indices_] = True
    
    plt.figure()
    plt.clf()
    
    # Black removed and is used for noise instead.
    unique_labels = set(db.labels_)
    colors = [plt.cm.Spectral(each)
              for each in np.linspace(0, 1, len(unique_labels))]
    for k, col in zip(unique_labels, colors):
        if k == -1:
            # Black used for noise.
            col = 'k'
    
        class_member_mask = (db.labels_ == k)
    
        xy = data[class_member_mask & core_samples_mask]
        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,
                 markeredgecolor='k', markersize=14)
    
        xy = data[class_member_mask & ~core_samples_mask]
        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,
                 markeredgecolor='k', markersize=6)
    
    plt.title('Estimated number of clusters: %d' % n_clusters_)
    plt.show()
    
    
    if __name__ == '__main__':
    np.random.seed(42) # 设置随机种子
    
    # Generate sample data
    centers = [[1, 1], [-1, -1], [1, -1]]
    X, _ = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0)
    
    # Use scikit-learn's implementation of DBSCAN
    eps = 0.3
    min_samples = 10
    db = dbscan(X, eps=eps, min_samples=min_samples)
    
    # Plot result
    n_clusters_ = len(set(db.labels_)) - (1 if -1 in db.labels_ else 0)
    
    plot_dbscan(db, X)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

输出:

全部评论 (0)

还没有任何评论哟~