我正在阅读 Nick Pentreath 的《Machine learning with Spark》一书,作者在第 224-225 页讨论了使用 K-means 作为一种降维形式。
我从未见过这种降维方法,它是否有名称或/并且对特定形状的数据有用?
我引用描述算法的书:
假设我们使用 K 均值聚类模型对高维特征向量进行聚类,其中包含 k 个聚类。结果是一组 k 个聚类中心。
我们可以根据与每个聚类中心的距离来表示每个原始数据点。也就是说,我们可以计算一个数据点到每个聚类中心的距离。结果是每个数据点的一组 k 距离。
这k个距离可以形成一个新的k维向量。我们现在可以将原始数据表示为相对于原始特征维度的更低维度的新向量。
作者建议采用高斯距离。
对于二维数据有 2 个集群,我有以下内容:
K-均值:
应用具有范数 2 的算法:
应用具有高斯距离的算法(应用 dnorm(abs(z)):
之前图片的R代码:
set.seed(1)
N1 = 1000
N2 = 500
z1 = rnorm(N1) + 1i * rnorm(N1)
z2 = rnorm(N2, 2, 0.5) + 1i * rnorm(N2, 2, 2)
z = c(z1, z2)
cl = kmeans(cbind(Re(z), Im(z)), centers = 2)
plot(z, col = cl$cluster)
z_center = function(k, cl) {
return(cl$centers[k,1] + 1i * cl$centers[k,2])
}
xlab = "distance to cluster center 1"
ylab = "distance to cluster center 2"
out_dist = cbind(abs(z - z_center(1, cl)), abs(z - z_center(2, cl)))
plot(out_dist, col = cl$cluster, xlab = xlab, ylab = ylab)
abline(a=0, b=1, col = "blue")
out_dist = cbind(dnorm(abs(z - z_center(1, cl))), dnorm(abs(z - z_center(2, cl))))
plot(out_dist, col = cl$cluster, xlab = xlab, ylab = ylab)
abline(a=0, b=1, col = "blue")