Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >无监督学习:从理论到实践的全面指南

无监督学习:从理论到实践的全面指南

作者头像
TechLead
发布于 2024-06-21 04:46:24
发布于 2024-06-21 04:46:24
1.4K00
代码可运行
举报
文章被收录于专栏:TechLeadTechLead
运行总次数:0
代码可运行

本文深入讲解了无监督学习中的K-means、层次聚类、密度聚类、PCA、t-SNE和自编码器算法,涵盖其原理、数学基础、实现步骤及应用实例,并提供了详细的代码示例。 关注作者,复旦AI博士,分享AI领域全维度知识与研究。拥有10+年AI领域研究经验、复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,上亿营收AI产品研发负责人。

一、无监督学习概述

1.1 无监督学习的定义与背景

无监督学习(Unsupervised Learning)是一类机器学习任务,其中算法在没有标签的情况下,从未标记的数据中学习模式和结构。与有监督学习不同,无监督学习不依赖于预定义的输出,而是从数据本身提取信息,用于发现数据的内在规律和特征。

背景

无监督学习的应用背景非常广泛,尤其是在数据标注成本高昂或数据标签缺失的领域中。例如,生物信息学中的基因表达分析、天文学中的星系分类、社交网络分析中的社区检测等。随着数据规模的不断增长,无监督学习的重要性也日益凸显。

1.2 无监督学习的应用场景

无监督学习在许多领域中都有广泛的应用。以下是一些典型的应用场景:

数据聚类

数据聚类是无监督学习的一种主要任务,旨在将相似的数据点分组。例如,市场营销中的客户细分、图像处理中的图像分割、文本分析中的文档聚类等。

降维

降维技术用于减少数据的维度,以便更好地可视化和分析数据。例如,主成分分析(PCA)和t-SNE常用于高维数据的降维和可视化,帮助研究人员发现数据中的潜在结构和模式。

异常检测

无监督学习还用于检测数据中的异常点或异常模式。例如,在网络安全中检测异常流量,在金融行业中检测异常交易行为等。

1.3 与有监督学习的区别

数据依赖性

有监督学习依赖于大量标记数据进行训练,模型通过已知的输入-输出对进行学习。无监督学习则不需要标记数据,完全依赖数据的内在结构进行学习。

目标导向

有监督学习的目标是预测或分类,例如图像分类、语音识别等。无监督学习的目标是发现数据的模式和结构,例如聚类、降维等。

复杂性与挑战

无监督学习的挑战在于其不确定性。由于缺乏标签,评估无监督学习模型的效果往往更加复杂,需要依赖于外部指标或人为判断。

1.4 主要技术方法

聚类算法

聚类算法是无监督学习中最常见的技术之一。其目的是将相似的数据点分组,使同一组内的数据点尽可能相似,而不同组之间的数据点尽可能不同。常见的聚类算法包括K-means、层次聚类和DBSCAN。

降维技术

降维技术用于减少数据的维度,同时保留尽可能多的有用信息。这对于高维数据的处理和可视化尤为重要。主成分分析(PCA)和t-SNE是两种常见的降维技术。

生成模型

生成模型如生成对抗网络(GAN)和变分自编码器(VAE)近年来在无监督学习中取得了显著的进展。这些模型通过学习数据的分布来生成与原始数据相似的新数据,广泛应用于图像生成、数据增强等领域。

二、算法精讲

2.1 K-means算法精讲

K-means算法是一种经典且广泛应用的聚类算法,旨在将数据集分割成K个簇,使得同一簇内的数据点尽可能相似,而不同簇之间的数据点差异尽可能大。本文将详细介绍K-means算法的原理、数学基础、优化方法,并通过代码示例展示其具体实现。

2.1.1 算法原理

K-means算法通过迭代优化以下两个步骤实现数据的聚类:

  1. 初始化:随机选择K个数据点作为初始的簇中心(centroids)。
  2. 迭代优化
    • 分配步骤(Assignment Step):将每个数据点分配到距离其最近的簇中心所属的簇。
    • 更新步骤(Update Step):重新计算每个簇的中心,即每个簇内所有数据点的平均值,作为新的簇中心。

该过程不断重复,直到簇中心不再发生显著变化或达到预设的迭代次数。

2.1.2 数学基础

2.1.3 优化方法

尽管K-means算法简单且高效,但其结果依赖于初始簇中心的选择,容易陷入局部最优解。以下是几种常见的优化方法:

  1. 多次运行K-means:通过多次运行K-means算法,每次随机初始化簇中心,然后选择最优的结果。
  2. K-means++初始化:一种改进的初始化方法,选择初始簇中心时更加注重分布,能够显著提升算法的聚类效果。
  3. Mini-batch K-means:在大数据集上使用小批量数据进行更新,以提高计算效率。

2.1.4 代码示例

以下是使用Python和SciPy库实现K-means算法的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from scipy.spatial.distance import cdist

def initialize_centroids(X, k):
    """随机初始化k个簇中心"""
    indices = np.random.choice(X.shape[0], k, replace=False)
    return X[indices]

def assign_clusters(X, centroids):
    """分配数据点到最近的簇中心"""
    distances = cdist(X, centroids, 'euclidean')
    return np.argmin(distances, axis=1)

def update_centroids(X, labels, k):
    """更新簇中心为簇内所有数据点的平均值"""
    new_centroids = np.zeros((k, X.shape[1]))
    for i in range(k):
        points = X[labels == i]
        new_centroids[i] = points.mean(axis=0)
    return new_centroids

def kmeans(X, k, max_iters=100, tol=1e-4):
    """K-means算法实现"""
    centroids = initialize_centroids(X, k)
    for _ in range(max_iters):
        labels = assign_clusters(X, centroids)
        new_centroids = update_centroids(X, labels, k)
        if np.all(np.abs(new_centroids - centroids) < tol):
            break
        centroids = new_centroids
    return labels, centroids

# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42)

# 执行K-means算法
k = 4
labels, centroids = kmeans(X, k)

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', marker='o')
plt.scatter(centroids[:, 0], centroids[:, 1], s=300, c='red', marker='x')
plt.title("K-means Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
代码解析
  1. 初始化簇中心initialize_centroids函数通过随机选择数据点作为初始簇中心。
  2. 分配数据点assign_clusters函数计算每个数据点到所有簇中心的欧几里得距离,并将数据点分配到最近的簇。
  3. 更新簇中心update_centroids函数计算每个簇的新中心,即簇内所有数据点的平均值。
  4. K-means主函数kmeans函数在给定的迭代次数和收敛阈值下执行K-means算法,返回最终的簇标签和簇中心。

2.2 层次聚类算法精讲

层次聚类(Hierarchical Clustering)是一种无监督学习方法,通过建立层次结构将数据集进行聚类。与K-means等平面聚类方法不同,层次聚类创建一个树状结构(或称为树状图),能够展示数据点之间的嵌套关系。本文将详细介绍层次聚类的基本原理、类型、计算方法及其应用,并通过代码示例展示具体实现。

2.2.1 算法原理

层次聚类分为两种主要方法:凝聚(自下而上)和分裂(自上而下)。

凝聚层次聚类(Agglomerative Clustering)
  1. 初始化:将每个数据点视为一个独立的簇。
  2. 迭代合并:在每一步中,找到距离最近的两个簇并将其合并,重复这一过程直到所有数据点被合并到一个簇中或达到预设的簇数。
分裂层次聚类(Divisive Clustering)
  1. 初始化:将所有数据点视为一个单一的簇。
  2. 迭代分裂:在每一步中,选择一个簇并将其拆分为两个子簇,重复这一过程直到每个数据点成为一个独立的簇或达到预设的簇数。

2.2.2 距离度量

层次聚类中,定义簇之间的距离是关键步骤。常用的距离度量方法包括:

  • 最短距离法(Single Linkage):两个簇中最近点之间的距离。
  • 最长距离法(Complete Linkage):两个簇中最远点之间的距离。
  • 平均距离法(Average Linkage):两个簇中所有点对之间的平均距离。
  • 质心法(Centroid Linkage):两个簇的质心之间的距离。

2.2.3 数学基础

层次聚类算法的核心在于不断计算和更新簇间距离,具体步骤如下:

  1. 距离矩阵初始化:计算所有数据点对之间的距离,形成距离矩阵。
  2. 簇合并:根据选定的距离度量方法,找到距离最近的两个簇并合并。
  3. 距离矩阵更新:合并后重新计算新的簇与其他簇之间的距离,更新距离矩阵。

2.2.4 代码示例

以下是使用Python和SciPy库实现凝聚层次聚类的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
from sklearn.datasets import make_blobs

# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42)

# 计算层次聚类的链接矩阵
Z = linkage(X, method='ward')

# 绘制树状图
plt.figure(figsize=(10, 7))
dendrogram(Z)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()

# 根据距离阈值提取簇
max_d = 50  # 距离阈值
clusters = fcluster(Z, max_d, criterion='distance')

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', marker='o')
plt.title('Agglomerative Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
代码解析
  1. 生成样本数据:使用make_blobs生成一个包含四个簇的样本数据集。
  2. 计算链接矩阵:使用linkage函数计算层次聚类的链接矩阵,方法选择ward,即最小方差法。
  3. 绘制树状图:使用dendrogram函数绘制层次聚类的树状图,展示聚类的层次结构。
  4. 提取簇:使用fcluster函数根据距离阈值提取簇,max_d为距离阈值。
  5. 可视化聚类结果:根据提取的簇标签,绘制聚类结果的散点图。

2.2.5 层次聚类的优缺点

优点
  • 无需预定义簇数:层次聚类不需要预先指定簇的数量,这对于数据的探索性分析非常有用。
  • 层次结构:层次聚类可以生成树状图,展示数据点之间的层次关系,有助于理解数据的内在结构。
缺点
  • 计算复杂度高:层次聚类的计算复杂度较高,特别是对于大规模数据集,计算和内存开销都非常大。
  • 敏感性强:层次聚类对噪声和离群点非常敏感,这可能导致不准确的聚类结果。

2.2.6 应用实例

层次聚类广泛应用于各种领域,例如:

  • 生物信息学:基因表达数据的聚类分析,构建基因共表达网络。
  • 市场营销:客户细分,根据购买行为和偏好进行市场细分。
  • 文档聚类:基于内容的文档聚类,组织和分类大量文本数据。

2.3 密度聚类算法精讲

密度聚类算法是一类基于数据点密度的无监督学习方法,能够有效处理具有复杂形状和噪声的数据集。最著名的密度聚类算法是DBSCAN(Density-Based Spatial Clustering of Applications with Noise)。本文将详细介绍DBSCAN算法的原理、数学基础、参数选择、优缺点,并通过代码示例展示其具体实现。

2.3.1 算法原理

DBSCAN算法通过以下步骤实现聚类:

  1. 核心点识别:对每个数据点,计算其ε-邻域内的数据点数目。如果数据点的邻域内数据点数目超过最小点数(MinPts)阈值,则该数据点为核心点。
  2. 簇形成:从核心点出发,将其邻域内的所有点(包括其他核心点和边界点)加入同一簇。迭代进行,直到所有核心点都被处理。
  3. 噪声识别:未能被任何簇包含的点被标记为噪声。

2.3.2 数学基础

DBSCAN算法依赖于两个重要参数:

  • ε(Epsilon):定义数据点的邻域半径。
  • MinPts:定义一个点成为核心点所需的最小邻域点数。
核心点、边界点和噪声点
  • 核心点:邻域内数据点数目大于等于MinPts。
  • 边界点:邻域内数据点数目小于MinPts,但在核心点的邻域内。
  • 噪声点:既不是核心点也不是边界点的点。

2.3.3 算法步骤

  1. 初始化:遍历所有数据点。
  2. 扩展簇
    • 如果数据点为核心点,创建新簇,并将其邻域内的所有点添加到簇中。
    • 对于每个邻域内的核心点,继续扩展簇,直到无法再扩展。
  3. 处理完所有点:继续处理其他点,直到所有点都被访问。

2.3.4 参数选择

选择合适的ε和MinPts参数对DBSCAN的效果至关重要:

  • ε的选择:通过k-距离图选择ε值。绘制数据集中每个点到其k-最近邻的距离,寻找“肘部”点对应的距离作为ε值。
  • MinPts的选择:通常选择至少为数据集维度的2倍,即MinPts ≥ 2 * Dim。

2.3.5 优缺点

优点
  • 识别任意形状簇:DBSCAN能够发现任意形状的簇,不受簇形状的限制。
  • 处理噪声:DBSCAN可以有效地识别和处理噪声数据点。
  • 无需预定义簇数:DBSCAN不需要预定义簇的数量,这对于未知簇数的数据集非常有用。
缺点
  • 参数敏感性:DBSCAN对参数ε和MinPts较为敏感,选择不当会影响聚类效果。
  • 高维数据性能差:在高维数据中,DBSCAN的效果可能较差,需要进行降维处理。

2.3.6 代码示例

以下是使用Python和Scikit-learn库实现DBSCAN算法的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler

# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42)

# 数据标准化处理
X = StandardScaler().fit_transform(X)

# DBSCAN聚类
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
labels = db.labels_

# 获取核心点和噪声点
core_samples_mask = np.zeros_like(labels, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)

# 可视化聚类结果
unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]

plt.figure(figsize=(10, 7))
for k, col in zip(unique_labels, colors):
    if k == -1:
        # 黑色用于噪声点
        col = [0, 0, 0, 1]

    class_member_mask = (labels == k)

    xy = X[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=14)

    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=6)

plt.title(f'Estimated number of clusters: {n_clusters_}\n'
          f'Number of noise points: {n_noise_}')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
代码解析
  1. 生成样本数据:使用make_blobs生成一个包含四个簇的样本数据集。
  2. 数据标准化:使用StandardScaler对数据进行标准化处理,确保不同特征在相同尺度上。
  3. DBSCAN聚类:使用DBSCAN函数进行聚类,设置参数epsmin_samples
  4. 获取核心点和噪声点:通过core_sample_indices_获取核心点,并统计簇的数量和噪声点的数量。
  5. 可视化聚类结果:根据簇标签绘制不同颜色的散点图,噪声点用黑色表示。

2.3.7 应用实例

DBSCAN广泛应用于各种领域,例如:

  • 地理信息系统:地理空间数据的聚类分析,识别城市区域或地貌特征。
  • 图像处理:图像中的目标检测和分割。
  • 金融分析:异常交易行为检测,识别潜在的欺诈行为。

2.4 主成分分析算法精讲

主成分分析(Principal Component Analysis,PCA)是一种经典的降维技术,通过线性变换将高维数据映射到低维空间,同时尽可能保留原始数据中的主要信息。PCA在数据预处理、特征提取、模式识别和数据可视化等领域具有广泛应用。本文将详细介绍PCA的原理、数学基础、实现步骤,并通过代码示例展示其具体实现。

2.4.1 算法原理

PCA通过寻找数据的主成分,将数据投影到这些主成分构成的子空间中。主成分是数据在变换后的坐标系中的新基向量,这些基向量是按数据方差大小排序的。具体步骤如下:

  1. 数据标准化:将数据中心化,使其均值为零。
  2. 协方差矩阵计算:计算数据的协方差矩阵。
  3. 特征值分解:对协方差矩阵进行特征值分解,得到特征值和特征向量。
  4. 选择主成分:选择前k个特征值对应的特征向量作为主成分。
  5. 数据变换:将原始数据投影到选定的主成分上,得到降维后的数据。

2.4.2 数学基础

2.4.3 实现步骤

以下是PCA算法的具体实现步骤:

  1. 数据准备:加载并标准化数据。
  2. 计算协方差矩阵:根据标准化数据计算协方差矩阵。
  3. 特征值分解:对协方差矩阵进行特征值分解。
  4. 选择主成分:选择前k个特征值对应的特征向量。
  5. 数据变换:将原始数据投影到选定的主成分上。

2.4.4 代码示例

以下是使用Python和Scikit-learn库实现PCA的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# 加载示例数据集
data = load_iris()
X = data.data
y = data.target

# 数据标准化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# PCA降维,选择前2个主成分
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_std)

# 可视化降维后的数据
plt.figure(figsize=(10, 7))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k', s=150)
plt.title('PCA of Iris Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.colorbar()
plt.show()
代码解析
  1. 加载数据:使用load_iris函数加载鸢尾花数据集。
  2. 数据标准化:使用StandardScaler对数据进行标准化处理,确保每个特征具有零均值和单位方差。
  3. PCA降维:使用PCA类对标准化后的数据进行降维,选择前两个主成分。
  4. 可视化:绘制降维后的数据散点图,展示不同类别的数据点在主成分空间的分布。

2.4.5 优缺点

优点
  • 降维效果显著:PCA能够有效减少数据的维度,保留主要信息,便于后续分析和处理。
  • 计算高效:PCA的计算复杂度较低,适用于大规模数据集。
  • 无参数要求:PCA不需要设置超参数,使用方便。
缺点
  • 线性假设:PCA假设数据与主成分之间的关系是线性的,对于非线性数据表现不佳。
  • 解释性差:主成分是线性组合,难以直接解释每个主成分的具体含义。
  • 对噪声敏感:PCA对噪声数据较为敏感,可能受到噪声的干扰。

2.4.6 应用实例

PCA广泛应用于各种领域,例如:

  • 图像处理:图像压缩与特征提取。
  • 金融分析:股票收益率数据的降维与风险管理。
  • 生物信息学:基因表达数据的降维与聚类分析。

2.5 t-SNE算法精讲

t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维技术,尤其擅长在低维空间中保持高维数据的局部结构。t-SNE广泛应用于数据可视化,特别是在处理高维数据时,能够揭示数据的内在结构和模式。本文将详细介绍t-SNE的原理、数学基础、实现步骤,并通过代码示例展示其具体实现。

2.5.1 算法原理

t-SNE通过构建高维数据点之间的相似度,然后将这些相似度映射到低维空间中,使得相似的数据点在低维空间中尽可能靠近。其核心思想包括以下几个步骤:

  1. 高维空间中的相似度计算:在高维空间中,t-SNE使用高斯分布计算数据点之间的相似度。
  2. 低维空间中的相似度计算:在低维空间中,t-SNE使用t分布计算数据点之间的相似度。
  3. 相似度匹配:通过最小化两种空间中相似度分布之间的Kullback-Leibler散度(KL散度),将高维数据映射到低维空间。

2.5.2 数学基础

2.5.3 实现步骤

  1. 数据准备:加载并标准化数据。
  2. 相似度计算:在高维空间中计算数据点之间的相似度。
  3. 初始嵌入:在低维空间中初始化数据点的位置。
  4. 优化:通过梯度下降法最小化KL散度,更新低维嵌入。
  5. 可视化:展示降维后的数据。

2.5.4 代码示例

以下是使用Python和Scikit-learn库实现t-SNE的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_digits

# 加载示例数据集
data = load_digits()
X = data.data
y = data.target

# 数据标准化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# t-SNE降维
tsne = TSNE(n_components=2, perplexity=30, n_iter=300)
X_tsne = tsne.fit_transform(X_std)

# 可视化降维后的数据
plt.figure(figsize=(10, 7))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis', edgecolor='k', s=100)
plt.title('t-SNE of Digits Dataset')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.colorbar(scatter)
plt.show()
代码解析
  1. 加载数据:使用load_digits函数加载手写数字数据集。
  2. 数据标准化:使用StandardScaler对数据进行标准化处理,确保每个特征具有零均值和单位方差。
  3. t-SNE降维:使用t-SNE类对标准化后的数据进行降维,设置参数n_components为2(即二维空间),perplexity为30,n_iter为300。
  4. 可视化:绘制降维后的数据散点图,展示不同类别的数据点在t-SNE空间的分布。

2.5.5 优缺点

优点
  • 保持局部结构:t-SNE能够有效保持高维数据的局部结构,使得相似的数据点在低维空间中靠近。
  • 适合高维数据:t-SNE在处理高维数据时表现出色,能够揭示数据的内在模式和结构。
缺点
  • 计算复杂度高:t-SNE的计算复杂度较高,特别是在大规模数据集上,计算时间较长。
  • 参数敏感性:t-SNE对参数(如perplexity)较为敏感,需要仔细调整以获得最佳效果。
  • 难以解释:t-SNE的结果难以解释,不适用于所有降维任务。

2.5.6 应用实例

t-SNE广泛应用于各种领域,例如:

  • 图像处理:高维图像特征的可视化分析。
  • 自然语言处理:词向量和句向量的可视化。
  • 生物信息学:基因表达数据的可视化。

2.6 自编码器算法精讲

自编码器(Autoencoder)是一类用于无监督学习的神经网络,主要用于降维、特征提取和数据生成。自编码器通过将输入数据编码为低维表示,然后再解码为原始数据,来学习数据的有效表示。本文将详细介绍自编码器的原理、数学基础、常见变种及其实现步骤,并通过代码示例展示其具体实现。

2.6.1 算法原理

2.6.2 数学基础

2.6.3 常见变种

去噪自编码器(Denoising Autoencoder, DAE)

在输入数据上添加噪声,通过去噪训练自编码器,使其更具鲁棒性。

稀疏自编码器(Sparse Autoencoder, SAE)

在编码器中添加稀疏性约束,鼓励模型学习稀疏表示。

变分自编码器(Variational Autoencoder, VAE)

基于概率模型的自编码器,通过学习数据的潜在分布生成新数据。

2.6.4 实现步骤

  1. 数据准备:加载并标准化数据。
  2. 模型构建:定义编码器和解码器的结构。
  3. 模型训练:使用反向传播算法最小化重建误差,训练自编码器。
  4. 数据重建:使用训练好的自编码器对数据进行重建和降维。

2.6.5 代码示例

以下是使用Python和PyTorch实现一个简单自编码器的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 定义自编码器模型
class Autoencoder(nn.Module):
    def __init__(self):
        super(Autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(28 * 28, 128),
            nn.ReLU(True),
            nn.Linear(128, 64),
            nn.ReLU(True),
            nn.Linear(64, 12),
            nn.ReLU(True),
            nn.Linear(12, 3)
        )
        self.decoder = nn.Sequential(
            nn.Linear(3, 12),
            nn.ReLU(True),
            nn.Linear(12, 64),
            nn.ReLU(True),
            nn.Linear(64, 128),
            nn.ReLU(True),
            nn.Linear(128, 28 * 28),
            nn.Tanh()
        )

    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x

# 数据加载和预处理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=128, shuffle=True)

# 初始化模型、损失函数和优化器
model = Autoencoder()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3)

# 模型训练
num_epochs = 20
for epoch in range(num_epochs):
    for data in train_loader:
        img, _ = data
        img = img.view(img.size(0), -1)
        output = model(img)
        loss = criterion(output, img)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 可视化重建结果
import matplotlib.pyplot as plt

# 获取一个批次的测试数据
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=10, shuffle=True)
dataiter = iter(test_loader)
images, _ = dataiter.next()
images = images.view(images.size(0), -1)

# 重建图像
outputs = model(images)

# 展示原始图像和重建图像
fig, axes = plt.subplots(2, 10, figsize=(10, 2))
for i in range(10):
    axes[0, i].imshow(images[i].view(28, 28).detach().numpy(), cmap='gray')
    axes[1, i].imshow(outputs[i].view(28, 28).detach().numpy(), cmap='gray')
plt.show()
代码解析
  1. 定义模型:使用PyTorch定义一个简单的自编码器模型,包括编码器和解码器。编码器将输入数据降维,解码器将低维表示还原为原始数据。
  2. 数据加载和预处理:使用torchvision加载MNIST数据集,并对数据进行标准化处理。
  3. 初始化模型、损失函数和优化器:使用均方误差(MSE)作为损失函数,使用Adam优化器进行模型训练。
  4. 模型训练:通过反向传播算法最小化重建误差,迭代训练自编码器。
  5. 可视化重建结果:对测试数据进行重建,并展示原始图像和重建图像的对比。

2.6.6 优缺点

优点
  • 特征提取:自编码器能够自动学习数据的低维表示,有助于特征提取和数据降维。
  • 数据生成:通过变种自编码器(如VAE),可以生成新数据,具有广泛应用。
  • 无监督学习:无需标签数据,自编码器能够在无监督学习任务中发挥重要作用。
缺点
  • 过拟合风险:自编码器可能在训练数据上过拟合,导致泛化能力差。
  • 高计算成本:训练深度自编码器需要大量计算资源,特别是在大规模数据集上。
  • 对噪声敏感:自编码器对噪声数据较为敏感,可能需要去噪自编码器(DAE)来提高鲁棒性。

2.6.7 应用实例

自编码器在多个领域具有广泛应用,例如:

  • 图像处理:图像降噪、图像压缩与重建。
  • 自然语言处理:文本表示学习、语言模型预训练。
  • 生物信息学:基因表达数据降维与聚类分析。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TechLead 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
可视化编排云服务,工作流 ASW 开始公测!
ASW 简介 应用与服务编排工作流(Application Services Workflow,ASW)是对腾讯云服务进行可视化编排,组合成工作流模板的应用程序集成类产品。可以更简单、更直观、更快速地构建和更新应用。 ASW 可以用拖拽组件的方式来编排分布式任务和服务,工作流会按照设定好的顺序可靠地协调执行,并在必要时支持执行用户定义的重试逻辑,确保任务和服务按照模板定义的步骤顺利完成。 同时,您将无需编写代码,只需用可视化编排的方式快速构建自动化工作流模板,并实例化为任务去执行,或发布为服务接口提供对外
腾讯云serverless团队
2021/01/22
3.3K0
使用 ASW 工作流创建您的第一个函数编排
应用与服务编排工作流(Application Services Workflow,ASW)是一个用来协调分布式任务执行的编排产品,根据腾讯云状态语言定义来编排分布式任务和服务,工作流会按照设定好的顺序可靠地协调执行,将云函数与多个腾讯云服务按步骤进行调度,通过低代码配置,就可以完成开发和运行业务流程所需要的任务协调、状态管理以及错误处理等繁琐工作,让研发团队能更简单、更高效的构建与更新应用。 01. ASW 工作流与传统工作流的对比 特性 ASW 工作流传统工作流易用性已完成云服务集成, 方便调用云上资源
腾讯云serverless团队
2021/04/29
2.1K0
重磅发布!腾讯云 ASW 工作流,可视化编排云服务
业界的云服务编排需要开发者编写代码,实际业务场景面对的常常是复杂的逻辑结构,开发人员要花大量时间处理组件间的逻辑和代码,学习成本高,难度大。
腾讯云工作流
2021/04/27
3.1K0
重磅发布!腾讯云 ASW 工作流,可视化编排云服务
业界的云服务编排需要开发者编写代码,实际业务场景面对的常常是复杂的逻辑结构,开发人员要花大量时间处理组件间的逻辑和代码,学习成本高,难度大。 通过腾讯云 ASW 工作流,设定好执行步骤,即可将多个腾讯云服务按步骤进行调度,极大地简化了开发复杂度。ASW 预置了常见的应用模板,一键部署,开箱即用。 —— 产品优势 —— 01. 支持全量云服务 ASW 支持全量腾讯云产品服务的编排调度,即云 API 支持的所有产品服务,包括 AI 服务、云函数、Severless 服务等。通过任务调度多个服务产品,完成复杂业
腾讯云serverless团队
2021/04/27
3K0
技术架构解密 - 应用与服务编排工作流 ASW
腾讯云应用与服务编排工作流 ASW(Application Service Workflow)是新一代计算架构体系下的服务编排解决方案,用来协调分布式任务执行的编排产品。在应用与服务编排工作流中设定好任务执行步骤,可以将多个腾讯云服务按步骤进行调度,完成各种业务应用场景。能简化开发和运行业务流程所需要的任务协调、状态管理以及错误处理等繁琐工作,更简单、更高效的构建应用。像胶水一样粘合云上各种产品和服务,提供面向用户场景的端到端解决方案。 01. 应用与服务编排工作流 ASW 背景介绍 随着云计算
腾讯云serverless团队
2021/07/14
2.1K0
ASW 工作流最佳实践(二):使用 ASW 并发调用函数
在音视频转码、ETL 作业处理、基因数据处理等诸多场景中,我们都可以通过工作流并行调用云函数,将任务进行并行处理,大大提高任务处理的吞吐量,满足应用场景的高实时性、高并发能力。 在《使用 ASW 工作流创建您的第一个函数编排》文章中,我们分享了如何使用 ASW 编排一个 Sum 云函数进行求和计算。本期文章主要分享如何使用 ASW 的 Map 节点能力进行并发的数据求和计算。 01. 创建函数 1. 登录「云函数控制台」,创建一个函数名称为 Sum,运行环境为 Python 3.6 的云函数。 云函数控
腾讯云serverless团队
2021/05/18
7790
如何快速搭建一个 AI 识别处理的流水线?
本文为您介绍如何使用 ASW 编排云函数与 AI 产品服务,快速搭建一个 AI 智能识别的处理流水线。通过 ASW 编排调用腾讯云 AI 能力,完成 活体检测、语音识别、关键字采样、自动审核 等一系列自动化识别认证流程,提供开箱即用、灵活便捷、高弹性高可用的 AI 智能识别处理场景。 尤其适合社区人脸识别,金融交易人脸支付,智能线上开户等 AI 人工智能场景。 01. ASW 工作流 - 「AI 识别」系统架构 在「智能线上开户」的场景中,用户在应用客户端登录,客户端将用户视频采集后上传到 COS,通过
腾讯云serverless团队
2021/06/21
1.3K0
COS 数据工作流 + Serverless云函数自定义处理能力发布!
在工业 4.0 的浪潮下,智能和数据与物理世界结合越加紧密,多元化、灵活、高效的数据处理能力成为各行各业的热点需求。虽然对象存储 COS 已经预置电商、文创、教育、社交、安防等行业需要的基础数据处理能力,但在特殊流程和定制化需求方面公有云依然难以做到全方位满足客户需求。 01. 数据工作流全新能力出炉: 支持自定义云函数 COS 数据工作流是一套完整的端到云到端的数据存储、处理、发布等「一站式」云上智能解决方案。 COS 数据工作流最新增加了自定义函数的处理能力,开发者可添加 Serverless 云函数
腾讯云serverless团队
2021/08/06
1.2K0
工作流自动化是什么?为什么要用低代码实现工作流自动化?
在数字化转型浪潮中,企业不断寻求创新的方法来提升运营效率,优化工作流程,而低代码平台的出现,无疑为这一进程增添了新的动力。尤其是当提及工作流自动化时,低代码技术以其独特的优势,正逐渐成为企业加速转型、拥抱数字化的首选工具。
Zoho Creator低代码
2024/07/05
3050
ASW 工作流最佳实践(四):并行多任务处理
在数据处理、多媒体文件处理、商品审核、容器运维管理等系统架构中,往往需要并行多路任务处理的场景 。 例如电商商品审核系统,商家每天对商品进行管理更新后,商品数据需要通过商品中台进行一系列的审核操作:如 图片审核、死链检测、商品打标、文本审核、统一类目 等环节。海量更新的商品数据会先投递到 Ckafka,商品中台需要一个能快速处理大量数据,高并发、高吞吐量的数据处理流水线。 利用 ASW 低代码、灵活便捷的特性,通过 ASW + 云函数作为微服务的粘合剂,可快速搭建一个高效可用、易扩展性的微服务架构应用。A
腾讯云serverless团队
2021/06/03
1.2K0
中台整合零售:腾讯电商业务中台的 Serverless 架构升级
零售领域变革不是一个新话题,从电商到 O2O ,从无人售货柜到机器人导购,腾讯云的尝试一直未曾止步。对于传统零售企业来说,通过数据中台可以让顾客与需求更好地匹配,同时实现平台上多触点获取流量。而技术中台,则可以帮助零售企业提升整体运营效率,在提高安全性的基础上,还能享受 AI 时代带来的智能化红利。 谈及腾讯电商业务中台,腾讯云应用与服务编排工作流 ASW 的项目负责人王子一认为,“以消费者为中心,实现上下游的产业协同,赋能商家,商家一次接入后,可应用于如下全部业务场景:检索业务、广告业务、智能广告投放、
腾讯云serverless团队
2022/01/25
2.4K0
79.8K star!这款开源自动化神器让技术团队效率飙升,400+集成玩转AI工作流!
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
小华同学ai
2025/04/13
6090
79.8K star!这款开源自动化神器让技术团队效率飙升,400+集成玩转AI工作流!
CODING 助力 ZEGO 即构科技建立统一研发管理工作流,高效打造云视频服务
---- “CODING 提供了从“需求”到“交付”的端到端工作协同和持续交付工具,提升了开发运维之间的沟通合作效率,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。” —— 廖念波,ZEGO 即构科技技术副总裁  客户背景  ZEGO 即构科技(https://www.zego.im/)是一家全球云通讯服务商,专注自研音视频引擎,在音频前处理、网络自适应和跨平台兼容性等方面,达到国际一流水平,同时充分利用基础云服务商的能力,构建了 MSDN 海量有序自学习数据网络,服务覆盖全球,链接 5 亿终
腾讯云 CODING
2023/01/11
1.6K0
CODING 助力 ZEGO 即构科技建立统一研发管理工作流,高效打造云视频服务
发布更新|腾讯云 Serverless 产品动态 20210120
一、ASW 工作流公测发布 公测时间: 2021-01-22 产品背景: 应用与服务编排工作流(Application Services Workflow,以下简称:ASW)是按照业务场景对腾讯云服务进行可视化编排,组合成工作流模板的应用程序集成类产品,可以更简单、更直观、更快速地构建和更新应用。 产品功能: 支持云函数、视频处理 MPS、语音识别 ASR、自然语言处理 NLP、通用文字识别 General OCR 服务的编排能力 产品介绍: https://cloud.tencent.com/produ
腾讯云serverless团队
2021/01/21
1.1K0
52.5k star,超强开源工作流自动化神器!
如果你是开发者,那么你可以使用如http、redis、jenkins、mysql等节点来构建你的工作流,当然了,这只是它最简单的使用场景。
大侠之运维
2024/12/26
6430
2022爱分析· 银行数字化厂商全景报告
《银行业保险业数字化转型指导意见》《金融科技发展规划(2022-2025年)》等文件对银行业数字化转型做了明确要求,到2025年银行业数字化转型取得明显成效,基于数据资产和数字化技术的金融创新有序实践,个性化、差异化、定制化产品和服务开发能力明显增强,金融服务质量和效率显著提高。
爱分析ifenxi
2022/08/03
6910
2022爱分析· 银行数字化厂商全景报告
RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐
MaxKB = Max Knowledge Base,是一款基于 LLM 大语言模型的开源知识库问答系统,旨在成为企业的最强大脑。它能够帮助企业高效地管理知识,并提供智能问答功能。想象一下,你有一个虚拟助手,可以回答各种关于公司内部知识的问题,无论是政策、流程,还是技术文档,MaxKB 都能快速准确地给出答案:比如公司内网如何访问、如何提交视觉设计需求等等
汀丶人工智能
2024/08/05
12.4K0
RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐
COS 数据工作流 + Serverless云函数自定义处理能力发布!
在工业4.0的浪潮下,智能和数据与物理世界结合越加紧密,多元化、灵活、高效的数据处理能力成为各行各业的热点需求。
云存储
2021/08/05
4210
COS 数据工作流 + Serverless云函数自定义处理能力发布!
智慧警务:如何利用视频智能分析技术助力城市警务可视化综合监管与指挥系统
随着移动互联网、大数据、云计算、物联网、AI人工智能等新兴技术的快速发展及广泛应用,城市管理及公安机关的警务管理逐渐转向智能化、数字化、网格化方向发展。对公安工作而言,科技创新具有战略性、基础性和全局性地位。以“智能协同、共治共享、扁平集约”为创新发展理念的智慧警务模式已日渐清晰,推动警务机制改革与现代科技应用深度融合,也已经成为城市建设管理与社会和谐稳定发展的重要任务。
TSINGSEE青犀视频
2021/05/26
2.8K0
年终总结 | 开发者必备书籍、工具、资料汇总贴(2024)
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中。
腾讯产业互联网学堂
2023/12/25
3580
推荐阅读
可视化编排云服务,工作流 ASW 开始公测!
3.3K0
使用 ASW 工作流创建您的第一个函数编排
2.1K0
重磅发布!腾讯云 ASW 工作流,可视化编排云服务
3.1K0
重磅发布!腾讯云 ASW 工作流,可视化编排云服务
3K0
技术架构解密 - 应用与服务编排工作流 ASW
2.1K0
ASW 工作流最佳实践(二):使用 ASW 并发调用函数
7790
如何快速搭建一个 AI 识别处理的流水线?
1.3K0
COS 数据工作流 + Serverless云函数自定义处理能力发布!
1.2K0
工作流自动化是什么?为什么要用低代码实现工作流自动化?
3050
ASW 工作流最佳实践(四):并行多任务处理
1.2K0
中台整合零售:腾讯电商业务中台的 Serverless 架构升级
2.4K0
79.8K star!这款开源自动化神器让技术团队效率飙升,400+集成玩转AI工作流!
6090
CODING 助力 ZEGO 即构科技建立统一研发管理工作流,高效打造云视频服务
1.6K0
发布更新|腾讯云 Serverless 产品动态 20210120
1.1K0
52.5k star,超强开源工作流自动化神器!
6430
2022爱分析· 银行数字化厂商全景报告
6910
RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐
12.4K0
COS 数据工作流 + Serverless云函数自定义处理能力发布!
4210
智慧警务:如何利用视频智能分析技术助力城市警务可视化综合监管与指挥系统
2.8K0
年终总结 | 开发者必备书籍、工具、资料汇总贴(2024)
3580
相关推荐
可视化编排云服务,工作流 ASW 开始公测!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验