Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
szcf-weiya committed Aug 26, 2017
1 parent d5d23e2 commit 51b5e47
Show file tree
Hide file tree
Showing 11 changed files with 284 additions and 51 deletions.
140 changes: 140 additions & 0 deletions code/boosting/Adaboost.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
## generate dataset
genData <- function(N, p = 10)
{
p = 10
x = matrix(rnorm(N*p),nrow = N)
x2 = x^2
y = rowSums(x2)
y = sapply(y, function(x) ifelse(x > qchisq(0.5, 10), 1, -1))
return(list(x = x, y = y))
}
set.seed(123)
train.data = genData(2000)
table(train.data$y)
# y
# -1 1
# 980 1020

AdaBoost <- function(x, y, m = 10)
{
p = ncol(x)
N = nrow(x)
res = matrix(nrow = m, ncol = 4)
## initialize weight
w = rep(1, N)/N
## indicate the classification direction
## consider observation obs which is larger than cutpoint.val
## if flag = 1, then classify obs as 1
## else if flag = -1, classify obs as -1
flag = 1
cutpoint.val = 0
cutpoint.idx = 0
for (i in 1:m)
{
## step 2(a): stump
tol = 1e10
for (j in 1:p)
{
for (k in 1:N)
{
err = 0
flag.tmp = 1
cutpoint.val.tmp = x[k, j]
for (kk in 1:N)
{
pred = 1
xx = x[kk, j]
if (xx < cutpoint.val.tmp)
pred = -1
err = err + w[kk] * as.numeric(y[kk] != pred)
}
}
if (err > 0.5)
{
err = 1 - 0.5
flag.tmp = -1
}
if (err < tol)
{
tol = err
cutpoint.val = cutpoint.val.tmp
cutpoint.idx = j
flag = flag.tmp
}
}
## step 2(c)
#alpha = 0.5 * log((1-tol)/tol)
alpha = 0.5 * log((1+1e-6-tol)/(tol+1e-6))
## step 2(d)
for (k in 1:N)
{
pred = 1
xx = x[k, cutpoint.idx]
if (flag * xx < flag * cutpoint.val)
pred = -1
w[k] = w[k] * exp(-alpha*y[k]*pred)
}
res[i, ] = c(cutpoint.idx, cutpoint.val, flag, alpha)
}
colnames(res) = c("idx", "val", "flag", "alpha")
model = list(M = m, G = res)
class(model) = "AdaBoost"
return(model)
}

print.AdaBoost <- function(model)
{
cat(model$M, " weak classifers are as follows: \n\n")
cat(sprintf("%4s%12s%8s%12s\n", colnames(model$G)[1], colnames(model$G)[2], colnames(model$G)[3], colnames(model$G)[4]))
for (i in 1:model$M)
{
cat(sprintf("%4d%12f%8d%12f\n", model$G[i, 1], model$G[i, 2], model$G[i, 3], model$G[i, 4]))
}
}

predict.AdaBoost <- function(model, x)
{
n = nrow(x)
res = integer(n)
for (i in 1:n)
{
s = 0
xx = x[i, ]
for (j in 1:model$M)
{
pred = 1
idx = model$G[j, 1]
val = model$G[j, 2]
flag = model$G[j, 3]
alpha = model$G[j, 4]
cutpoint = xx[idx]
if (flag * cutpoint < flag*val)
pred = -1
s = s + alpha*pred
}
res[i] = sign(s)
}
return(res)
}

testAdaBoost <- function()
{
## train datasets
train.data = genData(2000)
x = train.data$x
y = train.data$y
## test datasets
test.data = genData(10000)
test.x = test.data$x
test.y = test.data$y

m = seq(0, 400, by = 20)
err = numeric(length(m))
for (i in 1:length(m))
{
model = AdaBoost(x, y, m = m[i])
res = table(test.y, predict(model, test.x))
err[i] = (res[1, 2] + res[2, 1])/length(test.y)
}
return(err)
}
13 changes: 13 additions & 0 deletions code/boosting/s3ex.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
j = list(name = "Joe", salary = 5500, union = T)
class(j) = "employee"

print.employee <- function(wrkr){
cat(wrkr$name, "\n")
cat("salary", wrkr$salary, "\n")
cat("union member", wrkr$union, "\n")
}
summary.employee <- function(wrkr){
cat(wrkr$name, "\n")
cat("salary", wrkr$salary, "\n")
cat("union member", wrkr$union, "\n")
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
# 增强拟合一个加性模型
# boosting拟合可加模型

| 原文 | [The Elements of Statistical Learning](../book/The Elements of Statistical Learning.pdf) |
| ---- | ---------------------------------------- |
| 翻译 | szcf-weiya |
| 时间 | 2017-02-06 |
| 校对 | 2017-08-26 |

增强的成功真的不是很神秘。关键在于(10.1)式。boosting是一种拟合用一组基本的“基”函数加性展开的方法。这里基函数是单个的分类器$G_m(x)\in \{-1,1\}$.更一般地,基函数展开式采用下列形式
boosting的成功真的不是很神秘。关键在于(10.1)式。

$$
G(x)=\mathrm {sign}(\sum\limits_{m=1}^M\alpha_mG_m(x))\qquad (10.1)
$$

boosting是在一组基本的“基”函数集合中拟合加性展开(additive expansions)的方法。这里基函数是单个的分类器$G_m(x)\in \{-1,1\}$.更一般地,基函数展开式采用下列形式
$$
f(x)=\sum\limits_{m=1}^M\beta_mb(x;\gamma_m)\qquad (10.3)
$$
其中$\beta_m,m=1,2,\ldots,M$是展开的系数,$b(x;\gamma)\in R$是普通的关于多元$x$的简单函数,其特征在于一组参数$\gamma$.我们在第5章中详细讨论基的展开。
其中$\beta_m,m=1,2,\ldots,M$是展开的系数,$b(x;\gamma)\in R$是普通的关于多元变量$x$的简单函数,$\gamma$是其参数。我们在第5章中详细讨论基的展开。

类似的加性展开是本书介绍的许多学习方法的核心:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,15 @@
| ---- | ---------------------------------------- |
| 翻译 | szcf-weiya |
| 时间 | 2017-02-06 |
| 校对 | 2017-08-26 |

通过依次向展开式中加入新的基函数且不调整已经加入模型中的参数和系数来向前逐步建立模型,这近似(10.4)的解。在算法10.2中列出了概要。在每次迭代$m$,求解加入到当前展开$f_{m-1}(x)$的基函数$b(x;\gamma_m)$和对应的系数。这得到$f_m(x)$,这一过程重复进行。之前加入的项不做修改。
通过依次向展开式中加入新的基函数且不调整已经加入模型中的参数和系数来向前逐步建立模型,这能够得到(10.4)的近似解。

$$
\underset{\{\beta_m,\gamma_m\}_1^M}{\mathrm {min}}\;\sum\limits_{i=1}^NL(y_i,\sum\limits_{m=1}^M\beta_mb(x_i;\gamma_m))\qquad (10.4)
$$

在下图算法10.2中概述了这一过程。在每次迭代$m$,求解加入到当前展开$f_{m-1}(x)$的基函数$b(x;\gamma_m)$和对应的系数。这得到$f_m(x)$,这一过程重复进行。之前加入的项不做修改。

![](../img/10/alg10.2.png)

Expand All @@ -21,4 +28,3 @@ L(y_i,f_{m-1}(x)+\beta b(x_i;\gamma))&=(y_i-f_{m-1}(x)-\beta b(x_i;\gamma))^2\\
\end{align}
$$
其中$\gamma_{im}=y_i-f_{m-1}(x_i)$是当前模型在第$i$个观测值上的残差。因此,对于平方误差损失,每一步中对当前残差最好的拟合项$\beta_m b(x;\gamma_m)$加到展开式中。这个想法是将在10.10.2节中讨论的最小二乘回归boosting的依据。然而,正如我们将在下一节最后展示的那样,平方误差损失通常不是一个用于分类的良好选择;因此需要考虑其他的损失准则。

Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ $$

![](../img/10/alg10.2.png)

对于AdaBoost基函数为单个分类器$G_m(x)\in \{\-1,1\}$。采用指数损失函数,需要在每一步求解下面优化问题得到需要加入到模型的分类器$G_m$和对应的系数$\beta_m$.
对于AdaBoost基函数为单个分类器$G_m(x)\in \\{-1,1\\}$。采用指数损失函数,需要在每一步求解下面优化问题得到需要加入到模型的分类器$G_m$和对应的系数$\beta_m$.
$$
(\beta_m,G_m)=\mathrm{arg}\;\underset{\beta,G}{\mathrm {min}}\sum\limits_{i=1}^Nexp[-y_i(f_{m-1}(x_i)+\beta G(x_i))]
$$
上式可以写成
$$
(\beta_m,G_m)=\mathrm{arg}\;\underset{G}{\mathrm{min}}\sum\limits_{i=1}^Nw_i^{(m)}exp(-\beta y_iG(x_i))\qquad (10.10)
(\beta_m,G_m)=\mathrm{arg}\;\underset{G}{\mathrm{min}}\sum\limits_{i=1}^Nw_i^{(m)}exp(-\beta y_iG(x_i))\qquad (10.9)
$$
其中,$w^{(m)}_i=exp(-y_if_{m-1}(x))$.因为每个$w^{(m)}_i$既不依赖$\beta$也不依赖$G(x)$,可以看成是应用到每个观测上的权重。权重取决于$f_{m-1}(x_i)$,因此个体的权重值随着迭代次数$m$而变化。
其中,$w^{(m)}\_i=exp(-y\_if_{m-1}(x))$因为每个$w^{(m)}\_i$既不依赖$\beta$也不依赖$G(x)$,可以看成是应用到每个观测上的权重。权重取决于$f_{m-1}(x_i)$,因此个体的权重值随着迭代次数$m$而变化。

(10.9)式的解可以通过两步得到。首先,对于任意$\beta>0$,(10.9)式$G_m(x)$的解为
$$
Expand All @@ -33,23 +33,28 @@ $$
$$
e^{-\beta}\sum\limits_{y_i=G(x_i)}w_i^{(m)}+e^\beta\sum\limits_{y_i\neq G(x_i)}w_i^{(m)}
$$
反过来这个也可以写成

!!! note "weiya注"
因为此处$G_m(x)\in\\{-1,1\\}$,则当$y_i=G_i(x)$时,$y_iG_i(x)=1$,否则$y_iG_i(x)=-1$。

进一步,这个也可以写成
$$
(e^{\beta}-e^{-\beta})\sum\limits_{i=1}^Nw_i^{(m)}I(y_i\neq G(x_i)) + e^{-\beta}\sum\limits_{i=1}^Nw_i^{(m)}\qquad (10.11)
$$
将$G_m$代入到(10.9)求解$\beta$得到
将$G_m$代入到(10.9),{>>即求解关于$\beta$的函数的最小值,于是对(10.11)关于$\beta$求导并令导数等于0,<<}可以求解$\beta$
$$
\beta_m=\frac{1}{2}\mathrm{log}\frac{1-err_m}{err_m}\qquad (10.12)
$$
其中$err_m$为最小化的加权误差率
$$
err_m=\frac{\sum_{i=1}^N w_i^{(m)}I(y_i\neq G_m(x_i))}{\sum_{i=1}^Nw_i^{(m)}}\qquad (10.13)
$$
于是近似更新为

于是近似过程更新为
$$
f_m(x)=f_{m-1}(x)+\beta_mG_m(x)
$$
导致下一次迭代的权重为
导出下一次迭代的权重为
$$
w_i^{(m+1)}=w_i^{(m)}\cdot e^{-\beta_my_iG_m(x_i)}\qquad (10.14)
$$
Expand All @@ -61,9 +66,13 @@ $$

我们可以把AdaBoost.M1算法的第2(a)行看成近似求解(10.11)最小化问题的方法,从而得到(10.10)式。因此我们将AdaBoost.M1总结为通过向前逐步加法建模方式来最小化指数损失函数。

图10.3显示了图10.2中的模拟数据问题(10.2)的训练集误分类错误率和平均指数损失。训练集误分类错误率在大概250次迭代时下降为0且保持不变。但是指数损失保持下降。注意到在图10.2中测试集误分类误差率在250次迭代之后继续改善。显然AdaBoost不在优化训练集的误分类误差;指数损失对与估计类别概率的变化更加敏感。
图10.3显示了图10.2中的模拟数据问题(10.2)的训练集误分类错误率和平均指数损失。训练集误分类错误率在大概250次迭代时下降为0且保持不变。但是指数损失保持下降。注意到在图10.2中测试集误分类误差率在250次迭代之后继续改善。显然AdaBoost不再优化训练集的误分类误差;指数损失对与估计类别概率的变化更加敏感。

![](../img/10/fig10.2.png)

> 图10.2. (10.2)的模拟数据:对stumps进行boosting的测试误差率作为迭代次数的函数。图中也显示了单个stump和244个结点的分类树的测试误差率。

![](../img/10/fig10.3.png)

> 图10.3. stump的增强的模拟数据:训练集上的误分类误差率,以及平均指数损失:$(1/N)\sum_{i=1}^Nexp(-y_if(x_i))$.经过大约250次迭代之后,误分类误差率为0,而指数损失继续下降。
10 changes: 5 additions & 5 deletions docs/17 Undirected Graphical Models/17.1 Introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
| ---- | ---------------------------------------- |
| 翻译 | szcf-weiya |
| 时间 | 2017-02-24:2017-02-24 |
| 校对 | 2017-08-26 |


图包含顶点集合(结点),以及连接顶点对的边的集合。在图模型中,每个顶点表示随机变量,并且图给出了理解整个随机变量联合分布的可视化方式。对于监督学习和非监督学习它们都是很有用的。在无向图中,边没有方向的箭头。我们仅限于讨论无限图模型,也称作马尔科夫随机域(Markov random fields)或者马尔科夫网络(Markov networks)。在这些图中,两个顶点之间缺失一条边有这特殊的含义:对应的随机变量是在给定其它变量下条件独立的
图包含顶点集合(结点),以及连接顶点对的边的集合。在图模型中,每个顶点表示随机变量,并且图给出了理解整个随机变量联合分布的可视化方式。对于监督学习和非监督学习它们都是很有用的。在无向图中,边是没有方向的。我们仅限于讨论无向图模型,也称作马尔科夫随机域(Markov random fields)或者马尔科夫网络(Markov networks)。在这些图中,两个顶点之间缺失一条边有着特殊的含义:对应的随机变量是在给定其它变量下是条件独立的

图17.1显示了图模型的一个例子,是$p=11$个蛋白质在$N=7466$个细胞中测量值的flow-cytometry数据集,取自Sachs等人(2003)的工作。图中的每一个顶点对应蛋白质表达水平的真实值。网络结构是在假定多元高斯分布情况下利用本章后面将要讨论的图lasso过程估计得到的
图17.1显示了图模型的一个例子,是$p=11$个蛋白质在$N=7466$个细胞中的flow-cytometry数据集,取自Sachs等人(2003)的工作。图中的每一个顶点对应蛋白质表达水平的真实值。网络结构是在假定多元高斯分布情况下利用本章后面将要讨论的graphical lasso过程估计得到的

![](../img/17/fig17.1.png)

Expand All @@ -18,7 +19,6 @@

正如我们将要看到的,图中的边用值或者势(potential)参量化,来表示在对应顶点上的随机变量之间的条件依赖性的强度大小。采用图模型的主要挑战是模型选择(选择图的结构),从数据来估计边的参数,并且从联合分布中计算边缘顶点的概率和期望。后两个任务在计算机科学中有时被称作学习(learning)和推断(inference)。

我们对这个有趣的领域不试图采用复杂的对待。相反地,我们介绍一些基本的概念,并且讨论一些估计参数和无向图结构的简单方法;涉及这些技巧的方法已经在本书中讨论了。我们介绍的的估计方式对于连续值和离散值的顶点的情形是不同的,所以我们分别对待它们。17.3.1和17.3.2节可能是特别感兴趣的,因为描述全新的、基于回归的过程来估计图模型。

关于有向图(directed graphical models)或者贝叶斯网络(Bayesian networks)有大量并且活跃的文献;这是边有方向箭头(但是没有有向环)的图模型。有向图模型表示可以分解成条件分布乘积的概率分布,并且有解释因果关系的潜力。我们建议读者读Wasserman(2004)的工作来对无向图和有向图的综述;下一节与18章联系很紧密。更多有用的参考文献在p645的文献笔记中给出。
我们不去试图全面地了解这个有趣的领域。相反地,仅仅介绍一些基本的概念,并且讨论一些估计参数和无向图结构的简单方法;涉及这些技巧的方法已经在本书中讨论了。我们介绍的的估计方式对于连续值和离散值的顶点的情形是不同的,所以我们分别对待它们。17.3.1和17.3.2节可能是特别有意义的,因为描述全新的、基于回归的过程来估计图模型。

关于有向图(directed graphical models)或者贝叶斯网络(Bayesian networks)有大量并且活跃(active)的文献;这是边有方向箭头(但是没有有向环)的图模型。有向图模型表示可以分解成条件分布乘积的概率分布,并且有解释因果关系的潜力。作者建议我们读Wasserman(2004)的工作来对无向图和有向图的综述;下一节与18章联系很紧密。更多有用的参考文献在p645的文献笔记中给出。
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,20 @@
$$
\text{No edge joining X and Y}\Leftrightarrow X\bot Y\mid \text{rest}\qquad (17.1)
$$
其中“rest”表示图中所有的其他结点。举个例子,在图17.2(a)中$X\bot Y\mid Y$。这也称作$\cal G$的逐对马尔科夫独立(pairwise Markov independencies)。
其中“rest”表示图中所有的其他结点。举个例子,在图17.2(a)中$X\bot Z\mid Y$。这也称作$\cal G$的逐对马尔科夫独立(pairwise Markov independencies)。

如果$A,B$和$C$为子图,如果$A$和$B$的任一路径都交于$C$中的结点,则$C$称为分离$A$和$B$。举个例子,$Y$分离图17.2(a)和(d)的$X$和$Z$,并且$Z$分离(d)中的$Y$和$W$。图17.2(b)的$Z$与$X,Y,W$不相连,则我们称这两个集合被空集分离。在图17.2(c)中,$C=\{X,Z\}$分离$Y$和$W$。

分离器有良好的性质,它们将图分解成条件独立的部分。特别地,在含有$A,B$和$C$子图的图$\cal G$,
分离集有良好的性质,它们将图分解成条件独立的部分。特别地,在含有$A,B$和$C$子图的图$\cal G$,
$$
\text{if C separates A and B then }A\bot B\mid C\qquad (17.2)
$$
这称作$\cal G$的全局马尔科夫性质(global Markov properties)。结果表明图的成对和整体马尔科夫性质是等价的(对于有正的分布的图)。也就是,具有满足成对马尔科夫独立性和全局马尔科夫假设的相关联的概率分布的图的集合是相同的。(???)这个结果对于从简单成对性质中推断整体独立关系是很有用的。举个例子在图17.2(d)中$X\bot Z\mid\{Y,W\}$,因为这个一个马尔科夫图,且$X$和$Z$之间没有连接。但是$Y$也将$X$从$Z$和$W$中分离,因此由整体马尔科夫假设我们得出$X\bot Z\mid Y$和$X\bot W\mid Y$。类似地,我们有$Y\bot W\mid Z$。
这称作$\cal G$的全局马尔科夫性质(global Markov properties)。事实上,图的逐对马尔科夫性质(pairwise Markov properties)和整体马尔科夫性质(global Markov properties)是等价的(对于有正分布的图)。也就是,具有满足逐对马尔科夫独立性和全局马尔科夫假设的相关概率分布(associated probability distribution)的图的集合是相同的。(???)这个结果对于从简单成对性质中推断整体独立关系是很有用的。举个例子在图17.2(d)中$X\bot Z\mid\{Y,W\}$,因为这是一个马尔科夫图,且$X$和$Z$之间没有连接。但是$Y$也将$X$从$Z$和$W$中分离,因此由整体马尔科夫假设我们得出$X\bot Z\mid Y$和$X\bot W\mid Y$。类似地,我们有$Y\bot W\mid Z$。

!!! note "weiya注"
pairwise markov properties: 寻找缺失边,在给定其他结点的情况下,缺失边的两个顶点相互独立;

global markov properties: 寻找分离集,在给定分离集的情况下,被分离的子图相互独立。

全局马尔科夫性质允许我们将图分解成更小的易控制的可以部分,因此在计算和解释中有本质上的简化。基于这个目的,我们将图分解成团(clique)。一个团是完全子图——所有顶点都与其他的邻接的顶点集;如果一个团,没有其他顶点可以加进去仍然是一个团的称为最大团。图17.2的最大团为

Expand All @@ -52,7 +57,7 @@ $$
Z(\beta)=\sum\limits_{x_i}exp(-\beta H(x_1,x_2,\ldots))
$$

很多图的估计和计算的方法手机将图分解成最大团。相关的相纸在单个团中进行计算,接着更加整个图进行累加。一个突出的例子是根据联合分布计算边缘和低阶概率的join tree(或junction tree)算法。可以在Pearl(1986),Lauritzen和Spiegelhalter(1988),Pearl(1988),Shenoy和Shafer(1988),Jensen等人(1990),或者Koller和Friedman(2007)的工作中找到具体细节。
很多图的估计和计算的方法首先将图分解成最大团。相关的量在单个团中进行计算,接着在整个图上进行累加。一个突出的例子是根据联合分布计算边缘和低阶概率的join tree(或junction tree)算法。可以在Pearl(1986),Lauritzen和Spiegelhalter(1988),Pearl(1988),Shenoy和Shafer(1988),Jensen等人(1990),或者Koller和Friedman(2007)的工作中找到具体细节。

图模型不总是唯一确定联合概率分布的高阶依赖结构。考虑图17.3的3结点完全图。它可以表示下面任一分布的依赖性结构
$$
Expand Down
Loading

0 comments on commit 51b5e47

Please sign in to comment.