降维(dimension reduction)
对于高纬度数据来说,因为维度过多,所以很难去画图,那如果我们可以通过某种手段把高纬度数据的维度降低并同时尽量保留原始的数据信息的话,画图就会很简单了,这种手段就是降维。
例子:将二维降到一维
原文以一组虚拟的双胞胎身高数据()为例,具体数值等于每个个体的身高距平均身高几个标准差。如果以每一对双胞胎中的第一个为,以第二个为进行描点,那么这个图就是一个二维图像,且这些点分布在对角线上(图省略。。)。
这样的一组数据如何进行降维呢?先品一品下面的代码:
##先生成模拟的身高数据
library(rafalib)
library(MASS)
set.seed(1)
n <- 100
y=t(mvrnorm(n,c(0,0), matrix(c(1,0.95,0.95,1),2,2)))
z1 = (y[1,]+y[2,])/2 #求平均值
z2 = (y[1,]-y[2,]) #求差值
z = rbind( z1, z2) #新生成的z与y的维度相同
thelim <- c(-3,3)
mypar(1,2)
plot(y[1,],y[2,],xlab="Twin 1 (standardized height)",ylab="Twin 2 (standardized \
height)",xlim=thelim,ylim=thelim)
points(y[1,1:2],y[2,1:2],col=2,pch=16)
plot(z[1,],z[2,],xlim=thelim,ylim=thelim,xlab="Average height",ylab="Differnece \
in height")
points(z[1,1:2],z[2,1:2],col=2,pch=16)
他的做法其实很简单,就跟画MA图时一样,将轴变成双胞胎的身高的平均数,把轴变成双胞胎身高的差值。虽然经过了变换,但点与点之间的距离基本保持不变,比如图中的那两个红点。
这一过程在代数上其实就是将身高数据乘以一个矩阵而已:
矩阵旋转(Rotations)
如果矩阵的每一列是互相独立的随机变量,且标准差为,那么(minus,差值)和(add,和)的标准差就是(不知道是咋推导的
):
因此,如果我们将矩阵变成:
那么矩阵列变量的标准差就与矩阵列变量的方差相等,故而两点之间的距离也就是相等的:
A <- 1/sqrt(2)*matrix(c(1,1,1,-1),2,2)
z <- A%*%y
d <- dist(t(y))
d2 <- dist(t(z))
mypar(1,1)
plot(as.numeric(d),as.numeric(d2)) #as.numeric turns distnaces into long vector abline(0,1,col=2)
这种转换就叫做矩阵的转换(rotation of y),转换前图片上的点是围绕着对角线分布的,而转换后,那些点则围绕在与x轴平行的一条线上分布(或者说是与矩阵的第一个维度平行的一条直线),这就可以让我们达到既保持点与点之间的距离不变又让它维度降低的目的,现在我们就只用的第一个维度去计算距离:
d3 = dist(z[1,]) ##distance computed using just first dimension
mypar(1,1)
plot(as.numeric(d),as.numeric(d3))
abline(0,1)
可以看到,仅拿一个维度计算出的距离与实际距离非常接近。这里作者还讲了一个概念:转换矩阵的第一个维度就是第一主成分。
注意
统计学上通常会将个体设为行,将某种特征值设为列,和生物学上的习惯不太相同,所以咱们在别处看到的表达式什么的可能会不太一样。
原文链接