从不会到不怕——用R语言搞懂t-SNE

文摘   2024-11-16 05:30   德国  

t-SNE(t-distributed Stochastic Neighbor Embedding)是一种帮助我们将高维数据变成低维数据的工具,这样我们可以在二维或三维的图中看到数据的分布情况。

假设你有一份数据,里面记录了很多样本,比如每种花的多个特征(比如花瓣长度、花瓣宽度等)。我们想知道这些花在特征空间中的分布,看看是否能找到一些聚类现象(即相似的花种在一起,不同的花种分开)。t-SNE 可以帮助我们把这些高维数据"压缩"成二维或三维,以便观察。

t-SNE 的基本步骤

  1. 在高维空间中计算相似度
  • t-SNE 的第一步是计算每个点(数据样本)与其他点的“相似度”。相似度越高,意味着两个样本在高维空间中越接近。
  • 具体计算方法是:从一个点出发,根据它到其他点的距离来计算相似度,距离越近,相似度越高。可以想象为,靠近的点会吸引,远离的点会排斥。
  • 在低维空间中计算相似度
    • 一开始,我们随机把数据点放在低维空间(比如一个二维平面)中,然后计算它们的相似度。
    • 这一步和高维空间的相似度计算类似,但是我们使用 t-分布来计算,这种分布能让低维空间的点更容易分开,避免所有点挤在一起。
  • 优化:让低维空间的相似度尽量接近高维空间的相似度
    • t-SNE 会不断地移动低维空间中的点,使得低维空间中的相似度尽量接近高维空间中的相似度。
    • 举个例子,如果两个点在高维空间中非常接近,t-SNE 会尽量让它们在二维平面中也靠得很近;如果两个点在高维空间中距离较远,它们在二维平面中也应该保持距离。
    • 这种不断调整和优化的过程,确保了降维后的结果能保留高维空间中的聚类和结构信息。

    用 R 实现 t-SNE 示例

    # 安装和加载必要的包install.packages("Rtsne")library(Rtsne)install.packages("ggplot2")library(ggplot2)
    # 加载鸢尾花数据集data(iris)iris_data <- iris[, 1:4] # 只使用数值特征,不包含种类标签
    # 运行 t-SNE 算法set.seed(42) # 设置随机种子,保证结果可复现tsne_result <- Rtsne(iris_data, dims = 2, perplexity = 30, verbose = TRUE, max_iter = 500)
    # 将结果转换为数据框tsne_data <- as.data.frame(tsne_result$Y)tsne_data$Species <- iris$Species
    # 绘制 t-SNE 结果图ggplot(tsne_data, aes(x = V1, y = V2, color = Species)) + geom_point(size = 2) + labs(title = "t-SNE on Iris Dataset") + theme_minimal()

    结果分析

    代码运行后,你会得到一个二维散点图。在这个图中:
    • 三种不同颜色的点代表三种不同的鸢尾花。
    • 可以看到三种花在二维空间中形成了三个簇,这意味着 t-SNE 成功保留了高维空间中三类花的分布信息。

    t-SNE 的关键点

    • perplexity 参数:决定 t-SNE 关注每个点的“邻居”数量。简单来说,它代表了一个平衡点,值越高,考虑的邻居越多。可以通过调整 perplexity 来观察对结果的影响。
    • 慢速优化:t-SNE 逐步调整低维点的位置,尽量还原高维空间中的结构关系。因此它适合中小规模的数据集,数据太大时会比较慢。
    • 随机性:由于初始点的位置是随机的,每次运行结果可能会略有不同。使用 set.seed() 固定随机数可以使结果一致。

    Dr Leo
    ENT医生的科研分享
     最新文章