DALS023-机器学习02-条件概率与Loess拟合


title: DALS023-机器学习02-条件概率与Loess拟合
date: 2019-08-23 12:0:00
type: "tags"
tags:

  • 条件概率
  • Loess
    categories:
  • Data Analysis for the life sciences

前言

这一部分是《Data Analysis for the life sciences》的第9章机器学习的第2小节,这一部分的主要内容涉及条件概率与Loess回归,这一部分相关的Rmarkdown文档参见作者的Github

条件概率与期望

预测问题的结果可以分为两类,分别为分类结果(categorical outcomes)和连续型结果(continuous outcomes)。但是,许多算法都可以应用于这两种情况,这是因为条件概率(conditional probabilities)和条件期望(conditional expectations)之间有着一定联系。

对于分类数据,例如二分类结果,如果我们知道给在一组预测因子X=(X_1,\dots,X_p)^\top下预测的概率Y可能是k个结果中的任意一个,这种情况用方程表示就是:
f_k(x) = \mbox{Pr}(Y=k \mid X=x)
我们就可以优化我们的预测结果。尤其是,对于任意的 x ,我们可能预测出最大概率 f_k(x) 时的 k

为了简化我们的描述,我们只考虑二分类变量。我们可以认为 \mbox{Pr}(Y=1 \mid X=x) 是当 X=x 时,第1层的某结果在总体中的比例。考虑到期望是所有 Y 值的均值,在这个案例中,期望的概率就等于:f(x) \equiv \mbox{E}(Y \mid X=x)=\mbox{Pr}(Y=1 \mid X=x)。因此,我们在后面的描述中,就会使用期望,因为这种表示更加普遍。

通常来说,期望值是有着比较受欢迎的数学属性,因为它能够缩小预测值 \hat{Y}Y 之间的距离:
\mbox{E}\{ (\hat{Y} - Y)^2 \mid X=x \}

预测中的回归问题

我们在前面使用了父子的身高数据来介绍了回归,这里我们使用机器学习来解释一下这个数据分析过程。在我们前面的那个案例中,我们试图通常父母的身高X来预测儿子的身高Y。这里我们只有一个预测值(predictor)。现在如果我们被问到随机选择一个儿子,这个儿子的身高是多少,我们也许会使用平均值来回答,如下所示:

library(rafalib)
mypar(1,1)
library(UsingR)
data("father.son")
x=round(father.son$fheight) ##round to nearest inch
y=round(father.son$sheight)
hist(y,breaks=seq(min(y),max(y)))
abline(v=mean(y),col="red",lwd=2)
image

在这个案例中,我们也可以使用Y的分布近似服从正态分布来进行预测,那么也就是说,当我们回答平均值的时候,回答对的概率最大。

现在我们再来考虑一些情况,当我们有了更多的信息后,如何进行预测。例如,我们被告之,这个随机选择的这个儿子的父亲身高是71英寸(高于均值1.25个SD)。那么我们如何预测?

mypar(1,2)
plot(x,y,xlab="Father's height in inches",ylab="Son's height in inches",main=paste("correlation =",signif(cor(x,y),2)))
abline(v=c(-0.35,0.35)+71,col="red")
hist(y[x==71],xlab="Heights",nc=8,main="",xlim=range(y))
image

上图的左侧是儿子身高的散点图,其中红色围起来的部分是给定父亲身高是71英寸这个数据后,对应的儿子的身高。条件分布:儿子的身高数据分布就是被父亲71英寸这个数据限定了。

有了父亲身高是71英寸这个数据后,那么我们来猜儿子的身高时,最好的回答还是期望值(expectation),但是,我们的数据层(strata)已经发生了改变,也就是说,我们来猜测儿子身高Y时,要考虑到限制因素,即Y=71。因此,我们可以在这个条件之上,再来计算均值,这个均值就是条件期望(conditional expectation),因此我们对于任意x值来预测时,公式如下所示:
f(x) = E(Y \mid X=x)

通过微积分我们可以发现,这个结果更加接近于二元正态分布,我们可以换成下面的表示形式:
f(x) = \mu_Y + \rho \frac{\sigma_Y}{\sigma_X} (X-\mu_X)

如果我们使用样本的数据来估计这5个参数,那么我们就会得到回归线:

mypar(1,2)
plot(x,y,xlab="Father's height in inches",ylab="Son's height in inches",
     main=paste("correlation =",signif(cor(x,y),2)))
abline(v=c(-0.35,0.35)+71,col="red")
fit <- lm(y~x)
abline(fit,col=1)
hist(y[x==71],xlab="Heights",nc=8,main="",xlim=range(y))
abline(v = fit$coef[1] + fit$coef[2]*71, col=1)
image

在这个特殊的案例中,回归线提供了对 Y 更优化的预测函数,但是通常情况下这种情况并不真实,因为在典型的机器学习问题中,优化后的 f(x) 很少是一条直线。

练习

P379

平滑

相关的Rmarkdown文档见作者的Github

在所有的数据分析中,平滑(Smoothing)是一个非常强大的工具。当数据的分布的形状未知时,我们可以假定这些数据是平滑(smooth)的,我们就能够估计 f(x) 。平滑的主要思路就是将那些有着类似期望的数据归类,然后计算这些归类后的平均值,或者是对其进行简单的参数模型拟合。我们使用基因表达数据来介绍两个平滑工具。

下面的数据是源于相同RNA样本的基因表达数据。

##Following three packages are available from Bioconductor
library(Biobase)
# BiocManager::install("SpikeIn")
library(SpikeIn)
# BiocManager::install("hgu95acdf")
library(hgu95acdf)
data(SpikeIn95)

我们可以使用MA图 (Y = log ratios and X = averages) 来比较这两个重复样本的质量,我们可能通过一种方式对这些数据进行采样,这些采样方式要能平衡 X 中不同层的数据点的数目,如下所示:

##Example with two columns
i=10;j=9
##remove the spiked in genes and take random sample
library(GEOquery)
siNames<-colnames(pData(SpikeIn95))
ind <- which(!probeNames(SpikeIn95)%in%siNames)
pms <- pm(SpikeIn95)[ ind ,c(i,j)]
##pick a representative sample for A and order A
Y=log2(pms[,1])-log2(pms[,2])
X=(log2(pms[,1])+log2(pms[,2]))/2
set.seed(4)
ind <- tapply(seq(along=X),round(X*5),function(i)
  if(length(i)>20) return(sample(i,20)) else return(NULL))
ind <- unlist(ind)
X <- X[ind]
Y <- Y[ind]
o <-order(X)
X <- X[o]
Y <- Y[o]

采样结束后,我们来绘制散点图,如下所示:

library(rafalib)
mypar()
plot(X,Y)
image

在上面的MA图中我们可以看到 Y 取决于 X。这种取决关系存在着偏差,因为我们发现,它们在重复性方面有着偏差,这就意味着,如果不考虑 X, 那么 Y 的均值就是0。现在我们想预测 f(x)=\mbox{E}(Y \mid X=x) ,以便于移除假这种偏差。线性回归无法捕捉到表示上图曲线 f(x) 的曲率(curvature),如下所示:

mypar()
plot(X,Y)
fit <- lm(Y~X)
points(X,Y,pch=21,bg=ifelse(Y>fit$fitted,1,3))
abline(fit,col=2,lwd=4,lty=2)
image

微区间平滑(Bin Smoothing)

对于上述的数据,我们无法使用直线进行拟合,此时我们就要使用平滑处理的思想,也就是说把这些点分散到不同的组里,计算这些不同组的均值,这就是所谓的微区间平滑处理(我没有找到bin smoothing相应的中文翻译,这里说的微区间平滑是我自己造的词)。这种处理的通常思路就是,我们假定这些数据点分为很多微区间(bin),这样拟合的曲线是足够”平滑“的,那么在这个微区间中的这个曲线就会近似于常数(approximately constant)。如果我们假设这个曲线是常数(constant)的,那么所有位于某个微区间(bin)中的 Y 就有了相同的期望值。例如,在下面的图形中,如果我们将微区间的宽度设为1,我们标记出了在8.6和12.1处的微区间。我们还显示了,在这两个区间中拟合的 Y 的均值,如下所示:

mypar()
centers <- seq(min(X),max(X),0.1)
plot(X,Y,col="grey",pch=16)
windowSize <- .5
i <- 25
center<-centers[i]
ind=which(X>center-windowSize & X<center+windowSize)
fit<-mean(Y)
points(X[ind],Y[ind],bg=3,pch=21)
lines(c(min(X[ind]),max(X[ind])),c(fit,fit),col=2,lty=2,lwd=4)
i <- 60
center<-centers[i]
ind=which(X>center-windowSize & X<center+windowSize)
fit<-mean(Y[ind])
points(X[ind],Y[ind],bg=3,pch=21)
lines(c(min(X[ind]),max(X[ind])),c(fit,fit),col=2,lty=2,lwd=4)
image

我们通过计算每一个点附近的小区间,我们就能对构成的曲线的函数 f(x) 进行估计。下图显示了这个计算过程,即我们从最小的 x 值扩展到最大值过程中的这个估计值,同时我们还展示了最小值与最大值之间的10个值,一共是10张图片,如下所示:

windowSize<-0.5
smooth<-rep(NA,length(centers))
mypar (4,3)
for(i in seq(along=centers)){
  center<-centers[i]
  ind=which(X>center-windowSize & X<center+windowSize)
  smooth[i]<-mean(Y[ind])
  if(i%%round(length(centers)/12)==1){ ##we show 12
    plot(X,Y,col="grey",pch=16)
    points(X[ind],Y[ind],bg=3,pch=21)
    lines(c(min(X[ind]),max(X[ind])),c(smooth[i],smooth[i]),col=2,lwd=2)
    lines(centers[1:i],smooth[1:i],col="black")
    points(centers[i],smooth[i],col="black",pch=16,cex=1.5)
  }
}
image

最终的结果就如下所示:

mypar (1,1)
plot(X,Y,col="darkgrey",pch=16)
lines(centers,smooth,col="black",lwd=3)
image

在R中有许多函数可以进行平滑处理(bin smoothers),例如ksmooth。但是在实际计算过程中,我们更偏向使用一些稍微复杂的模型来对数据进行拟合。在最后一个案例,也就是最后一张图,这个曲线就不怎么平滑,有一些粗糙。我们后面会介绍loess方法会改善这一点。

Loess

Loess的全称是Local weighted regression,即局部权重回归,它在原理上类似于微区间平滑处理。但Loess与微区间平滑处理的主要区别就在于,在微区间中我是使用直线,还是抛物线进行拟合。Loess计算会增大微区间的数目,但这会使我们的估计更稳定。下图展示了两个微区间的拟合曲线,这两个区间比较宽,使用宽区间主要是因为拟合曲线提供了更多的灵活性,如下所示:

centers <- seq(min(X),max(X),0.1)
mypar (1,1)
plot(X,Y,col="darkgrey",pch=16)
windowSize <- 1.25
i <- 25
center<-centers[i]
ind=which(X>center-windowSize & X<center+windowSize)
fit<-lm(Y~X,subset=ind)
points(X[ind],Y[ind],bg=3,pch=21)
a <- min(X[ind]);b <- max(X[ind])
lines(c(a,b),fit$coef[1]+fit$coef[2]*c(a,b),col=2,lty=2,lwd=3)
i <- 60
center<-centers[i]
ind=which(X>center-windowSize & X<center+windowSize)
fit<-lm(Y~X,subset=ind)
points(X[ind],Y[ind],bg=3,pch=21)
a <- min(X[ind]);b <- max(X[ind])
lines(c(a,b),fit$coef[1]+fit$coef[2]*c(a,b),col=2,lty=2,lwd=3)
当我们

现在我们展示一下通过12步处理来对这些数据进行loess拟合,如下所示:

library(rafalib)
mypar (4,3)
windowSize<-1.25
smooth<-rep(NA,length(centers))
for(i in seq(along=centers)){
  center<-centers[i]
  ind=which(X>center-windowSize & X<center+windowSize)
  fit<-lm(Y~X,subset=ind)
  smooth[i]<-fit$coef[1]+fit$coef[2]*center
  if(i%%round(length(centers)/12)==1){ ##we show 12
    plot(X,Y,col="grey",pch=16)
    points(X[ind],Y[ind],bg=3,pch=21)
    a <- min(X[ind]);b <- max(X[ind])
    lines(c(a,b),fit$coef[1]+fit$coef[2]*c(a,b),col=2,lwd=2)
    
    lines(centers[1:i],smooth[1:i],col="black")
    points(centers[i],smooth[i],col="black",pch=16,cex=1.5)
  }
}
image

最终的结果就是生成一条更加平滑的拟合曲线用于估计我们的局部参数,如下所示:

mypar (1,1)
plot(X,Y,col="darkgrey",pch=16)
lines(centers,smooth,col="black",lwd=3)
image

R中的函数loess()可以进行上述的分析,如下所示:

fit <- loess(Y~X, degree=1, span=1/3)
newx <- seq(min(X),max(X),len=100) 
smooth <- predict(fit,newdata=data.frame(X=newx))
mypar ()
plot(X,Y,col="darkgrey",pch=16)
lines(newx,smooth,col="black",lwd=3)
image

loess()函数与其它的曲线平滑处理函数(bin smoother)还有三点重要的区别:

第一,loess()函数会保持局部拟合中的点数不变,而非保持区间的数目不变。局部拟合中的点数是通过span参数决定的,这是一个比值。例如,如果 N 是数据点的数目,那么 span = 0.5 则表示针对一个确定的 xloess()将会使用 0.5*N 个最接近的点对 x 进行拟合。

第二,使用参数模型来对 f(x) 进行拟合时,loess()会使用加权最小平方和来进行计算,那些权重比较大的点就是那些更接近 x 的点。

第三,loess()函数会选择更稳健(robustly)的局部模型来进行拟合。这是一种迭代算法,其中在一次迭代中拟合了模型之后,对于那些检测到的异常值就会在下一次迭代中降低其权重。如果要想使用这个参数,可以设定family = "symmetric"

练习

P389

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容