降维大杀器如何用 t-SNE 把高维数据“拍”扁得既好看又好懂在数据科学的世界里我们经常会遇到拥有几十甚至上百个特征维度的数据集。人类的大脑顶多能理解三维世界面对百维数据除了看表格我们还能怎么直观地感受它们这时候降维算法Dimension Reduction就派上用场了。今天我们要聊的就是降维界的人气顶流、可视化届的“美颜相机”——t-SNEt-Distributed Stochastic Neighbor Embeddingt-分布随机邻域嵌入。1. 为什么有了 PCA我们还需要 t-SNE说到降维很多人第一个想到的是PCA主成分分析。PCA 很好算得快而且是线性降维。但它有一个致命的缺点它只关注全局结构容易“欺负”局部细节。如果你的数据在超空间里是一个复杂的弯曲流形比如像瑞士卷那样卷起来PCA 这一巴掌拍下去原本离得很远的点可能会被强行压在一起导致原本不同的类别在低维空间里糊成一片。而t-SNE 的核心思想就是不管全局怎么变我要让在高维空间里离得近的点在低维空间里依然离得近。它非常擅长捕捉非线性结构能把复杂的分类数据完美地“聚”在一起。2. 深入浅出t-SNE 是如何工作的t-SNE 的核心逻辑可以用三步来概括第一步高维空间里的“亲密度”高斯分布在高维空间中t-SNE 会计算任意两个样本点之间的距离并把这个距离转换成条件概率使用高斯分布。两个点离得越近概率值亲密度越高。两个点离得越远概率值越接近于 0。第二步低维空间里的“映射”与 t 分布接着t-SNE 在低维空间比如 2D 或 3D中随机初始化相同数量的点。它同样会计算低维空间点的亲密度但这里它换了一个工具——t 分布具体是自由度为 1 的 t 分布即柯西分布。为什么要换成 t 分布拥挤问题 Crowding Problem在高维空间里可容纳点的“面积”非常大。当它们被映射到 2D 空间时空间变小了如果还用高斯分布所有的点都会被挤在中心。t 分布的尾部比高斯分布更厚这意味着在低维空间中离得远的点会被推得更远从而给不同的簇Cluster留出足够的边界。第三步让两个空间“同频共振”t-SNE 的目标是让低维空间的亲密度分布尽可能地接近高维空间的亲密度分布。它使用KL 散度Kullback-Leibler Divergence来衡量这两个分布的差异并通过梯度下降调整低维点的位置直到拉低 KL 散度。最终高维中的“邻居”在低维中也成了“邻居”。3. 灵魂拷问t-SNE 的四大避坑指南虽然 t-SNE 画出来的图极其惊艳经常能看到色彩斑斓、边界清晰的漂亮聚类图但在解读和使用它时有几个非常容易踩的雷区困惑度Perplexity不是越小越好Perplexity 粗略地代表了你认为每个点的邻居有多少个通常设在 5 到 50 之间。设得太小数据会变成一堆细碎的孤岛设得太大数据又会糊成一团。需要反复调参。簇与簇之间的距离没有任何物理意义t-SNE 只保证“局部近的还是近”但它无法保证全局距离。如果在图上看到 A 簇和 B 簇离得很近C 簇离得很远千万不要得出“A 和 B 更相似”的结论。簇的大小不代表数据量的多少t-SNE 会自动膨胀稀疏的簇压缩密集的簇以便让画面更好看。所以一个看起来很大的圆圈里面的数据点可能和旁边一个极小的圆圈一样多。随机初始化意味着每次结果都不同t-SNE 是基于随机初始化的算法。如果不设置固定的随机种子random_state你每次运行代码画出来的图可能都长得不一样。4. Python 实战代码极简版在 Python 中我们直接使用scikit-learn就能轻松上手importmatplotlib.pyplotaspltfromsklearn.manifoldimportTSNEfromsklearn.datasetsimportload_digits# 加载手写数字数据集8x8像素共64个特征digitsload_digits()X,ydigits.data,digits.target# 初始化 t-SNE降维到 2 维# 强烈建议设置 random_state 保证结果可复现tsneTSNE(n_components2,perplexity30,random_state42)X_tsnetsne.fit_transform(X)# 绘图plt.figure(figsize(10,8))scatterplt.scatter(X_tsne[:,0],X_tsne[:,1],cy,cmaptab10,alpha0.7)plt.colorbar(scatter)plt.title(t-SNE Visualization of Handwritten Digits)plt.xlabel(t-SNE Feature 1)plt.ylabel(t-SNE Feature 2)plt.show()总结t-SNE 就像是数据科学家的显微镜。它不适合用来做特征工程因为计算慢、且无法直接转换新数据但它是探索性数据分析EDA和成果展示的无敌神器。下次当你面对一堆看不懂的高维特征时不妨用 t-SNE 拍张照片说不定数据内部的秘密一眼就被你看穿了
深度学习-t-SNE
降维大杀器如何用 t-SNE 把高维数据“拍”扁得既好看又好懂在数据科学的世界里我们经常会遇到拥有几十甚至上百个特征维度的数据集。人类的大脑顶多能理解三维世界面对百维数据除了看表格我们还能怎么直观地感受它们这时候降维算法Dimension Reduction就派上用场了。今天我们要聊的就是降维界的人气顶流、可视化届的“美颜相机”——t-SNEt-Distributed Stochastic Neighbor Embeddingt-分布随机邻域嵌入。1. 为什么有了 PCA我们还需要 t-SNE说到降维很多人第一个想到的是PCA主成分分析。PCA 很好算得快而且是线性降维。但它有一个致命的缺点它只关注全局结构容易“欺负”局部细节。如果你的数据在超空间里是一个复杂的弯曲流形比如像瑞士卷那样卷起来PCA 这一巴掌拍下去原本离得很远的点可能会被强行压在一起导致原本不同的类别在低维空间里糊成一片。而t-SNE 的核心思想就是不管全局怎么变我要让在高维空间里离得近的点在低维空间里依然离得近。它非常擅长捕捉非线性结构能把复杂的分类数据完美地“聚”在一起。2. 深入浅出t-SNE 是如何工作的t-SNE 的核心逻辑可以用三步来概括第一步高维空间里的“亲密度”高斯分布在高维空间中t-SNE 会计算任意两个样本点之间的距离并把这个距离转换成条件概率使用高斯分布。两个点离得越近概率值亲密度越高。两个点离得越远概率值越接近于 0。第二步低维空间里的“映射”与 t 分布接着t-SNE 在低维空间比如 2D 或 3D中随机初始化相同数量的点。它同样会计算低维空间点的亲密度但这里它换了一个工具——t 分布具体是自由度为 1 的 t 分布即柯西分布。为什么要换成 t 分布拥挤问题 Crowding Problem在高维空间里可容纳点的“面积”非常大。当它们被映射到 2D 空间时空间变小了如果还用高斯分布所有的点都会被挤在中心。t 分布的尾部比高斯分布更厚这意味着在低维空间中离得远的点会被推得更远从而给不同的簇Cluster留出足够的边界。第三步让两个空间“同频共振”t-SNE 的目标是让低维空间的亲密度分布尽可能地接近高维空间的亲密度分布。它使用KL 散度Kullback-Leibler Divergence来衡量这两个分布的差异并通过梯度下降调整低维点的位置直到拉低 KL 散度。最终高维中的“邻居”在低维中也成了“邻居”。3. 灵魂拷问t-SNE 的四大避坑指南虽然 t-SNE 画出来的图极其惊艳经常能看到色彩斑斓、边界清晰的漂亮聚类图但在解读和使用它时有几个非常容易踩的雷区困惑度Perplexity不是越小越好Perplexity 粗略地代表了你认为每个点的邻居有多少个通常设在 5 到 50 之间。设得太小数据会变成一堆细碎的孤岛设得太大数据又会糊成一团。需要反复调参。簇与簇之间的距离没有任何物理意义t-SNE 只保证“局部近的还是近”但它无法保证全局距离。如果在图上看到 A 簇和 B 簇离得很近C 簇离得很远千万不要得出“A 和 B 更相似”的结论。簇的大小不代表数据量的多少t-SNE 会自动膨胀稀疏的簇压缩密集的簇以便让画面更好看。所以一个看起来很大的圆圈里面的数据点可能和旁边一个极小的圆圈一样多。随机初始化意味着每次结果都不同t-SNE 是基于随机初始化的算法。如果不设置固定的随机种子random_state你每次运行代码画出来的图可能都长得不一样。4. Python 实战代码极简版在 Python 中我们直接使用scikit-learn就能轻松上手importmatplotlib.pyplotaspltfromsklearn.manifoldimportTSNEfromsklearn.datasetsimportload_digits# 加载手写数字数据集8x8像素共64个特征digitsload_digits()X,ydigits.data,digits.target# 初始化 t-SNE降维到 2 维# 强烈建议设置 random_state 保证结果可复现tsneTSNE(n_components2,perplexity30,random_state42)X_tsnetsne.fit_transform(X)# 绘图plt.figure(figsize(10,8))scatterplt.scatter(X_tsne[:,0],X_tsne[:,1],cy,cmaptab10,alpha0.7)plt.colorbar(scatter)plt.title(t-SNE Visualization of Handwritten Digits)plt.xlabel(t-SNE Feature 1)plt.ylabel(t-SNE Feature 2)plt.show()总结t-SNE 就像是数据科学家的显微镜。它不适合用来做特征工程因为计算慢、且无法直接转换新数据但它是探索性数据分析EDA和成果展示的无敌神器。下次当你面对一堆看不懂的高维特征时不妨用 t-SNE 拍张照片说不定数据内部的秘密一眼就被你看穿了