机器学习 高维数据可视化:t-SNE 降维算法

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。

🍎个人主页:小嗷犬的个人主页

🍊个人网站:小嗷犬的技术小站

🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


本文目录

    • [t-SNE 简介](#t-SNE 简介)
    • [sklearn 中的 t-SNE](#sklearn 中的 t-SNE)
    • [使用 t-SNE 可视化手写数字数据集](#使用 t-SNE 可视化手写数字数据集)

t-SNE 简介

t-SNE 的全称为 t-Distributed Stochastic Neighbor Embedding,是一种非线性降维算法,它可以将高维数据映射到低维空间,同时保持数据间的相对距离不变。t-SNE 通常用于可视化高维数据,它可以将高维数据映射到二维或三维空间,从而可以通过图形的方式展示数据的特征。

相比于 PCA 等线性降维算法,t-SNE 能够更好地保留数据的局部结构,因此在可视化高维数据时,t-SNE 通常能够展示出更好的效果。

sklearn 中的 t-SNE

sklearn 中的 t-SNE 位于 sklearn.manifold.TSNE,它的主要参数有:

  • n_components:降维后的维度,默认为 2
  • perplexity:困惑度,用于控制每个点周围的邻域大小,默认为 30,通常取值在 5 到 50 之间
  • early_exaggeration:控制 t-SNE 与原始空间距离的关注度,值越大,t-SNE 与原始空间距离越大,默认为 12
  • learning_rate:学习率,默认为 200,通常取值在 10 到 1000 之间
  • n_iter:迭代次数,默认为 1000
  • n_iter_without_progress:当连续多少次迭代没有改善时,训练提前结束,默认为 300
  • min_grad_norm:梯度的最小值,当梯度的平方和小于该值时,训练提前结束,默认为 1e-7
  • metric:距离度量,默认为欧氏距离
  • init:初始化,默认为随机初始化,也可以设置为 pca,表示使用 PCA 进行初始化
  • verbose:是否打印训练过程,默认为 0,不打印
  • random_state:随机种子

t-SNE 的训练过程比较耗时,因此在实际使用时,通常会先使用 PCA 等线性降维算法将数据降到较低的维度,然后再使用 t-SNE 将数据降到二维或三维空间。

使用 t-SNE 可视化手写数字数据集

下面我们使用 t-SNE 将手写数字数据集降到二维空间,并将降维后的数据可视化。

导入需要的包:

python 复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn import manifold, datasets
from sklearn.preprocessing import MinMaxScaler

from torchvision import datasets

加载手写数字数据集:

python 复制代码
digits = datasets.MNIST("./data", train=True, download=True)
X, y = digits.data.numpy().reshape(-1, 28 * 28), digits.targets.numpy()
n = 5000
X, y = X[:n], y[:n]
X.shape, y.shape  # ((5000, 784), (5000,))

可视化原始数据:

python 复制代码
n = 10  # 显示 10 * 10 个数字
img = np.zeros((30 * n, 30 * n))
for i in range(n):
    ix = 30 * i + 1
    for j in range(n):
        iy = 30 * j + 1
        img[ix : ix + 28, iy : iy + 28] = X[i * n + j].reshape(28, 28)
plt.figure(figsize=(8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.axis("off")
plt.show()

使用 t-SNE 将数据降到二维空间并可视化:

python 复制代码
# t-SNE 降维
tsne = manifold.TSNE(n_components=2, init="pca", random_state=0)
X_tsne = tsne.fit_transform(X)

# 归一化
scaler = MinMaxScaler()
X_norm = scaler.fit_transform(X_tsne)

# 可视化
plt.figure(figsize=(9, 9))
for i in range(X_norm.shape[0]):
    plt.text(
        X_norm[i, 0],
        X_norm[i, 1],
        str(y[i]),
        color=plt.cm.tab10(y[i]),
        fontdict={"size": 12},
        va="center",
        ha="center",
    )
plt.axis("off")
plt.show()
相关推荐
船长@Quant44 分钟前
文档构建:Sphinx全面使用指南 — 基础篇
python·markdown·sphinx·文档构建
喵手1 小时前
从 Java 到 Kotlin:在现有项目中迁移的最佳实践!
java·python·kotlin
liuweidong08021 小时前
【Pandas】pandas DataFrame rsub
开发语言·python·pandas
CH3_CH2_CHO1 小时前
不吃【Numpy】版
开发语言·python·numpy
Olafur_zbj2 小时前
【EDA】EDA中聚类(Clustering)和划分(Partitioning)
机器学习·数据挖掘·聚类
-曾牛2 小时前
企业级AI开发利器:Spring AI框架深度解析与实战
java·人工智能·python·spring·ai·rag·大模型应用
Light602 小时前
智启未来:深度解析Python Transformers库及其应用场景
开发语言·python·深度学习·自然语言处理·预训练模型·transformers库 |·|应用场景
坤岭2 小时前
Python基础
python
一个天蝎座 白勺 程序猿2 小时前
Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解
开发语言·爬虫·python
一眼青苔2 小时前
python环境使用conda,conda如何升级默认的python版本
开发语言·python·conda