为什么 t-SNE 不分离线性可分的类?
机器算法验证
分类
特纳
2022-03-15 19:14:59
1个回答
是的。
您可以使用以下代码来说服自己。
N <- 1000
P <- 3
# Generates some random data
data <- matrix(data = rnorm(N*P), nrow = N, ncol = P)
# Assignate linearly separable classes
labels <- (data[,1]+data[,2]>0)+1.
# Make sure that the data can be separated
plot(data[,1],data[,2], col = labels, xlab = 'x1', ylab = 'x2')
require(Rtsne)
model <- Rtsne::Rtsne(data)
# Observe this result while varying P
plot(model$Y, col = labels, type = 'p', pch = 21, xlab = 'tSNE x_1', ylab = 'tSNE x_2')
这就是当 P 为 3 时您会观察到的(只有一个与线性分离无关的属性,我们接近再现线性分离)。
对于 P 为 15,tSNE 无法再现线性分离。
发生了什么 ?
这很简单。tSNE 方法依赖于点之间的成对距离来产生聚类,因此完全不知道数据的任何可能的线性可分性。
如果您的点彼此“靠近”,在“边界”的不同侧,tSNE 将认为它们属于同一个集群。
这正是上述模拟的重点。当维数很大时,无论它们属于边界的哪一侧,点看起来都彼此靠近。这是 tSNE 未能在此处捕获的内容。
另一方面,当不相关维度的数量较少时,关闭点“别无选择”,只能在边界的同一侧。
边注。
即使你的神经网络性能不错,但这可能并不意味着你的数据是线性可分的(除非你的神经网络中只有一个单元)。事实上,神经网络可以识别非线性边界。如果您想测试数据集的“线性可分”程度,您应该使用线性支持向量机或回归。