如何利用t-SNE可视化自己的数据集分布

【转载】利用t-SNE可视化自己的数据集分布_tsne数据集制作-CSDN博客

安装

1、在Linux机器上执行下面操作。

2、使用代码之前需要先安装一个t-SNE的库,地址是GitHub - CannyLab/tsne-cuda: GPU Accelerated t-SNE for CUDA with Python bindings。该库是github上一个高分的开源库,用了cuda加速实现起来比sklearn的t-SNE要快得多,从读取到画图我自己实验确实只需要10秒不到的时间。

3、github上下载TSNE-CUDA项目到本地后,在终端的虚拟环境中输入

pip install -e .
安装好后输入

import tsnecuda
tsnecuda.test()
没有报错说明安装成功

3、在TSNE-CUDA文件夹下创建数据集文件data_set,data_set里放自己的数据集(比如我的数据集叫radar_oldANDyoung,里边包含train和val两个文件夹,每个文件夹下边分别有5个子文件夹,命名为1-5),其中1-5分别为类名,每个类下边是属于该类的图片

4、在examples文件夹下创建python文件,比如my_tSNE.py,把我下边的代码粘贴进去

5、几个需要修改的地方我的代码里基本都有注释,不懂的可以在本帖下边留言,不定期回复 

6、结果图:

代码

import numpy as np
from tsnecuda import TSNE
import matplotlib.pyplot as plt
import numpy as np
import cv2
import os
 
size = 224 #resize图片的大小,运行时如果爆显存的话把这里调小即可
 
# get_data(Input_path,Label)
# 作用:读取Input_path里的图片,并给每张图打上自定义标签Label
def get_data(Input_path,Label): 
    Image_names=os.listdir(Input_path) #获取目录下所有图片名称列表
    data=np.zeros((len(Image_names),size*size*3)) #初始化一个np.array数组用于存数据,自己图片是n维的就把3改成n即可
    label=np.zeros((len(Image_names),1)) #初始化一个np.array数组用于存数据
 
    #为当前文件下所有图片分配自定义标签Label
    for k in range(len(Image_names)):
        label[k][0]=Label
        
    for i in range(len(Image_names)):
        image_path=os.path.join(Input_path,Image_names[i])
        img=cv2.imread(image_path)
        img=cv2.resize(img,(size,size)) #(size,size,3)
        img = img.flatten() #(3*size*size,)
        data[i]=img
    return data, label
 
#重点来了,这里是根据自己想查看的数据来自定义修改代码,得到自己的x_train和y_train
#x_train是待分析的数据
#y_train是待分析的自定义标签
#比如,我想分析训练集中5个类的分布情况
#先读取每一个类的数据,然后给他们自定义标签1-5
#然后把data拼在一起,label拼在一起,前者叫x_train,后者叫y_train
data1, label1 = get_data('../data_set/radar_oldANDyoung/train/1',1) #根据自己的路径合理更改
data2, label2 = get_data('../data_set/radar_oldANDyoung/train/2',2) 
data3, label3 = get_data('../data_set/radar_oldANDyoung/train/3',3) 
data4, label4 = get_data('../data_set/radar_oldANDyoung/train/4',4) 
data5, label5 = get_data('../data_set/radar_oldANDyoung/train/5',5) 
#得出数据后把他们拼起来
data = np.vstack((data1,data2,data3,data4,data5))
label = np.vstack((label1,label2,label3,label4,label5))
 
(x_train,y_train) = (data,label)
print(y_train.shape) #(n_samples,1)
print(x_train.shape) #(n_samples,size*size*3)
 
#t-SNE,输出结果是(n_samples,2)
#TSNE的参数和sklearn的T-SNE一样,不懂的自行查看即可
tsne = TSNE(n_iter=1000, verbose=1,num_neighbors=32,device=0)
tsne_results = tsne.fit_transform(x_train)
 
print(tsne_results.shape) #(n_samples,2)
 
# 画图
fig = plt.figure( figsize=(8,8) )
ax = fig.add_subplot(1, 1, 1, title='TSNE-radar' )
 
# Create the scatter
#ax.scatter()的用法自行百度
scatter  = ax.scatter(
    x=tsne_results[:,0],
    y=tsne_results[:,1],
    c=y_train,
    # cmap=plt.cm.get_cmap('Paired'),
    # alpha=0.4,
    s=10)
 
#ax.legend添加类标签
legend1 = ax.legend(*scatter.legend_elements(),loc="lower left", title="Classes")
ax.add_artist(legend1)
 
#显示图片
plt.show()
#保存图片
plt.savefig('./tSNE_radar.jpg')


 
 

————————————————
版权声明:本文为CSDN博主「Nudge636」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ts1637605540/article/details/125766434

<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() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值