本篇开始学习这个系列教程的第八章Distance and Dimension Reduction,第一节首先介绍了下什么是距离,然后讲的是Euclidean Distance距离的计算方法。
简单介绍下距离
其实距离的概念很简单,比如说,当我们想把一些动物分成几个亚类时,我们就会定义一种距离,然后用距离的远近区分彼此间的相似性。很多高纬度数据的分析中也会或直接或间接运用距离这一概念,比如基因组学中很常见的热图就是一个典型的例子。
欧氏距离( Euclidean Distance)
- 二维坐标中的定义
若和
两个点同处于一个笛卡尔坐标系中,那么这两个点之间的欧式距离就是:
- 高维坐标中的定义
以R语言tissuesGeneExpression
包中的一组基因表达数据为例说明,该数据中共有样本189个,基因22,215个。在这组数据中我们既可以计算样本之间的距离,又可以去计算计算基因之间的距离。
为了定义高纬度数据的距离,首先我们要搞清楚我们用于计算的点是什么东西。其实也很简单,在本例中,如果你要计算样本之间的距离,那么每个点就代表每个样本,只不过每个点都有22,215个维度:,一个维度对应一个基因;如果你要计算基因
之间的距离,那么点就代表基因,每个基因都有189个维度:
,一个维度对应一个样本。
点定义好之后,剩下的就和在二维坐标上计算欧氏距离差不多了,比如计算样本和样本
之间的距离是:
基因或
之间的距离就是:
用矩阵代数计算距离
在矩阵代数相关的章节里,我们已知:
假设 :
那么方差便等于:
因此样本和样本
之间距离的计算公式就可以变成:
其中,和
对应第
和
列的样本。
举例
题目是分别计算样本1和样本2与样本89之间的距离,这里作者提供了3种计算方法,首先就是手工计算:
library(devtools)
install_github("genomicsclass/tissuesGeneExpression")
library(tissuesGeneExpression)
data(tissuesGeneExpression)
x <- e[,1]
y <- e[,2]
z <- e[,87]
sqrt(sum((x-y)^2))
## [1] 85.8546
sqrt(sum((x-z)^2))
## [1] 122.8919
第二种方法就是使用函数crossprod()
:
sqrt( crossprod(x-y) )
## [,1]
## [1,] 85.8546
sqrt( crossprod(x-z) )
## [,1]
## [1,] 122.8919
第三种是一个新方法,就是使用dist()
函数,这个函数的作用是计算每个行之间的距离,所以在这里我们还需要将矩阵转置一下:
d <- dist(t(e))
class(d)
## [1] "dist"
as.matrix(d)[1,2]
## [1] 85.8546
as.matrix(d)[1,87]
## [1] 122.8919
注意,如果你使用整个矩阵去计算的话,这个函数就会生成一个的矩阵,计算量这么大,非常有可能会让R卡死在那儿。不过
dist()
函数只会返回下三角矩阵,所以就没事。
网友评论