使用t-SNE可视化图像embedding 图像特征可视化

本文介绍使用t-SNE降维技术对图像特征进行可视化的方法,包括如何利用sklearn包实现散点图和网格图的绘制,以及在处理图像遮挡问题上的尝试。


t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维技术,主要用途为对高维数据进行可视化。

easy sample(使用sklearn包):

from matplotlib.offsetbox import OffsetImage, AnnotationBbox
from sklearn.manifold import TSNE
import cv2
import numpy as np
import matplotlib.pyplot as plt


# 传入图像的embedding特征和对应的图像路径
def draw_tsne(features, imgs):
    """
    Args:
        feature: [n_samples  embed_dim], full data embedding of test samples.
        imgs:        list [n_samples], list of datapaths corresponding to <feature>
    """
    #print(imgs)
    # 初始化一个TSNE模型,这里的参数设置可以查看SKlearn的官网
    tsne = TSNE(n_components=2, init='pca', perplexity=30)
    # Y是降成两维后的数据
    Y = tsne.fit_transform(features)
    fig, ax = plt.subplots()
    # 设置图像大小
    # fig.set_size_inches(21.6, 14.4)
    plt.axis('off')
    imscatter(Y[:, 0], Y[:, 1], imgs, zoom=0.1, ax=ax)
    plt.savefig(fname='figure.jpg', format='jpg')
    plt.show()


def imscatter(x, y, images, zoom, ax=None):
    artists = []
    for x0, y0, image in zip(x, y, images):
        print(image)
        im = cv2.imread(image)
        im = cv2.resize(im, (224, 224))
        im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
        im_f = OffsetImage(im, zoom=zoom)
        ab = AnnotationBbox(im_f, (x0, y0), xycoords='data', frameon=False)
        artists.append(ax.add_artist(ab))
    ax.update_datalim(np.column_stack([x, y]))
    ax.autoscale()
    return artists


x = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 
<think>好的,用户想了解如何使用t-SNE进行特征可视化,包括方法和实现步骤。首先我需要回忆t-SNE的基本概念和流程,确保信息准确。根据用户提供的三个引用,引用[1]提到了t-SNE的基本概念和sklearn的参数说明,引用[2]有Python实现的例子,引用[3]则总结了t-SNE的优势和应用场景。接下来需要结合这些信息来组织回答。 首先,要解释t-SNE是什么,它的作用是什么。这部分需要简明扼要,让用户有个初步认识。然后分步骤说明实现方法,可能包括数据准备、模型训练、特征提取、t-SNE降维和可视化。每个步骤需要具体,比如在数据准备阶段需要标准化数据,特征提取可能用CNN的例子,降维时使用sklearn的TSNE类,可视化用matplotlib或seaborn。同时要提到参数调整的重要性,比如perplexity和learning_rate的设置,以及结果解读的注意事项。 然后,需要给出一个Python的代码示例,这能让用户更直观地理解实现过程。代码应包括数据加载、预处理、特征提取(比如用PCA替代CNN,因为用户可能没有现成的模型)、t-SNE降维和绘图。代码注释要清楚,参数说明参考引用[1]中的sklearn函数参数。 接下来是注意事项,需要强调t-SNE的随机性、计算资源消耗和高维结构保留能力,这部分引用[3]中的内容,说明其优势和局限性。最后生成相关问题,引导用户进一步学习,比如与其他降维方法比较、参数影响、处理大数据时的优化等。 需要检查是否符合用户的格式要求:数学公式用$...$,独立公式用$$...$$,中文回答,结构清晰,引用标记正确。比如在解释高维空间相似度时,使用公式:$p_{j|i} = \frac{\exp(-||x_i - x_j||^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-||x_i - x_k||^2 / 2\sigma_i^2)}$,并确保LaTeX语法正确。 最后确认是否覆盖了用户的问题,是否引用了正确的资料,比如在参数说明部分引用[1],在优势和局限性部分引用[3]。同时确保生成的三个相关问题与t-SNE相关,帮助用户深入理解。</think>### t-SNE特征可视化方法及实现步骤 t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维算法,专门用于高维数据的可视化。其核心思想是通过概率分布建模,在低维空间中保留高维数据的局部结构[^1]。 --- #### **实现步骤** 1. **数据准备** - 标准化数据:对特征矩阵进行归一化处理,消除量纲影响 $$X_{\text{norm}} = \frac{X - \mu}{\sigma}$$ - 示例数据集:MNIST手写数字、CIFAR-10图像等 2. **模型训练与特征提取** - 使用卷积神经网络(CNN)等模型提取深层特征 - 最后一层全连接层输出作为特征向量 ```python # 示例:使用预训练模型提取特征 from tensorflow.keras.applications import VGG16 model = VGG16(weights='imagenet', include_top=False) features = model.predict(images) ``` 3. **t-SNE降维** - 使用`sklearn.manifold.TSNE`实现,关键参数: - `n_components`:降维后的维度(通常为2或3) - `perplexity`:控制局部结构的敏感度(建议5-50) - `learning_rate`:优化步长(通常100-1000)[^2] ```python from sklearn.manifold import TSNE tsne = TSNE(n_components=2, perplexity=30, random_state=42) X_tsne = tsne.fit_transform(features) ``` 4. **可视化** - 用散点图展示降维结果,不同类别用颜色区分 ```python import matplotlib.pyplot as plt plt.scatter(X_tsne[:,0], X_tsne[:,1], c=labels, cmap='tab10') plt.colorbar() plt.title('t-SNE Visualization') plt.show() ``` --- #### **技术原理** - **高维空间相似度**:通过高斯分布计算数据点相似度 $$p_{j|i} = \frac{\exp(-||x_i - x_j||^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-||x_i - x_k||^2 / 2\sigma_i^2)}$$ - **低维空间相似度**:采用t分布建模,避免“拥挤问题” $$q_{ij} = \frac{(1 + ||y_i - y_j||^2)^{-1}}{\sum_{k \neq l}(1 + ||y_k - y_l||^2)^{-1}}$$ --- #### **注意事项** 1. 结果具有随机性,建议多次运行取稳定结果 2. 计算复杂度为$O(n^2)$,大数据集需使用`Barnes-Hut`近似算法 3. 可配合PCA先进行初步降维(如保留95%方差)[^3] 4. 不同类别的分离程度反映原始特征区分性 --- ### 完整代码示例 ```python # 数据加载与预处理 from sklearn.datasets import load_digits import numpy as np digits = load_digits() X = digits.data / 16.0 # 归一化到[0,1] y = digits.target # t-SNE降维 from sklearn.manifold import TSNE tsne = TSNE(n_components=2, perplexity=40, n_iter=300) X_2d = tsne.fit_transform(X) # 可视化 import matplotlib.pyplot as plt plt.figure(figsize=(10,8)) plt.scatter(X_2d[:,0], X_2d[:,1], c=y, cmap='jet', alpha=0.7) plt.colorbar(ticks=range(10)) plt.clim(-0.5,9.5) plt.title('MNIST t-SNE Projection') plt.show() ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值