本文已参加「新人创作礼」活动,一起开启掘金创作之路。
这次带来的是 RStudio 的降维 - 多维标度法。
多维标度法 Multi-Dimensional Scaling
多维标度法也是一种降维方法.
多维标度分析基于以空间分布的形式表现对象之间相似性或距离远近来刻画数据之间相互关系。
它的基础数据是:
n维空间中的样本之间的距离矩阵D=(dij)2D=(dij)2- 或者
相似度矩阵C=(cij)2C=(cij)2, 它可以通过标准变换 dij=(cii−2cij+cjj)−−−−−−−−−−−−−√dij=(cii−2cij+cjj) 转换成距离矩阵
D1 = diag(0, nrow = 7)
D1[1,] = c(0,1,sqrt(3),2,sqrt(3),1,1)
D1[2,] = c(0,0,1,sqrt(3),2,sqrt(3),1)
D1[3,] = c(0,0,0,1,sqrt(3),2,1)
D1[4,] = c(0,0,0,0,1,sqrt(3),1)
D1[5,] = c(0,0,0,0,0,1,1)
D1[6,] = c(0,0,0,0,0,0,1)
D1
t(D1)
D1 = D1 + t(D1)
D1
d1 = as.dist(D1)
d1
library(MASS)
d1_mds = isoMDS(d1, k = 2)
xy = d1_mds$points
round(xy, 4)
plot(xy)
用MDS算法探索手写数字之间的关系
- 随机抽取出 MNIST 数据集中的一个子集(1000条样本)
- 计算这些样本之间的距离矩阵或者相似度矩阵
- 如果计算的是相似度矩阵,那么使用合适的公式将其转成距离矩阵
- 使用MDS算法将距离矩阵投影到k=2维空间中,得到坐标
- 基于坐标,将这些样本之间的关系可视化
- 研究同一类手写数字之间的远近关系,和不同数字之间的远近关系
- 其它研究问题
# 1. 随机抽取出 MNIST 数据集中的一个子集(1000条样本)
mnist_train = read.csv("./data/mnist_train.csv", header = F)
mnist_sample = mnist_train[sample(nrow(mnist_train),1000),]
table(mnist_sample[,1])
# 2. 计算这些样本之间的距离矩阵或者相似度矩阵
d2 = dist(mnist_sample[,-1], method = "euclidean")
# 3. 如果计算的是相似度矩阵,那么使用合适的公式将其转成距离矩阵
# 4. 使用MDS算法将距离矩阵投影到k=2维空间中,得到坐标
d2_mds = isoMDS(d2, k = 2)
# 5. 基于坐标,将这些样本之间的关系可视化
xy2 = d2_mds$points
digit = mnist_sample[,1]
plot(xy2, col = digit + 1)
apply(xy2, 2, range)
par(mfrow = c(3,4), mar = c(1,1,3,1))
for(i in 1:10){
plot(xy2[digit == (i-1),], col = i, main = i-1, xlim = c(-1035,1916), ylim = c(-1330, 1113))
}
# 6. 研究同一类手写数字之间的远近关系,和不同数字之间的远近关系
# 7. 其它研究问题
RGL example
install.packages("rgl")
library(rgl)
example(rgl)