t-SNE(t-distributed Stochastic Neighbor Embedding)是一种帮助我们将高维数据变成低维数据的工具,这样我们可以在二维或三维的图中看到数据的分布情况。
假设你有一份数据,里面记录了很多样本,比如每种花的多个特征(比如花瓣长度、花瓣宽度等)。我们想知道这些花在特征空间中的分布,看看是否能找到一些聚类现象(即相似的花种在一起,不同的花种分开)。t-SNE 可以帮助我们把这些高维数据"压缩"成二维或三维,以便观察。
t-SNE 的基本步骤
在高维空间中计算相似度:
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()
固定随机数可以使结果一致。