机器学习算法深度总结

接触机器学习时间也不短了, 趁国庆放假, 做一下深度整理.

1. 大纲

若想在企业胜任算法相关岗位知识, 除了掌握常见算法, 会背后数学原理外, 还需要掌握算法优化, 特征工程, 模型评估和优化技能, 下面是我整理的一张机器学习读书笔记的各分支地图:


每一个分支及二级分支, 都涉及到较多的知识点, 需要找相关材料深入理解并熟练掌握.

下面按分支详细展开介绍.

2.监督学习

1. 线性模型

最简单的线性模型, 只能表现线性输入输出函数, 不能很好地与非线性函数近似, 解决实际问题上并无太大价值:



实际应用中常对线性模型进行扩展, 使其变为基于参数的线性模型, 用线性模型表示非线性输入:

(注意: 因为手敲黑体latex公式较费时, 黑体格式向量简写为普通体, 大家看到类似x^T形式相乘的公式, 就默认是对应的都是向量就好了).

基于数据的简单线性模型: f_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2
基于参数的线性模型: f_\theta(x) = \sum_{j=1}^b\theta_j\phi_j(x) = \theta^T\phi(x)
上式中, \phi_j是基函数\phi(x) = (\phi_1(x), \cdots, \phi_b(x))^T的第j个因子, \theta = (\theta_1, \cdots, \theta_b)^T的第j个因子.

举例: 基函数为多项式\phi(x) = (1, x, x^2, x^3)的线性模型 :
f_\theta(x) = \theta_0 + (\theta_1x_1 + \theta_2x_1^2 +\theta_2x_1^3 )+( \theta_1x_2 + \theta_2x_2^2 + \theta_2x_2^3 )

常见的基函数:

  • 多项式: \phi_j(x) = (1, x_j, x_j^2, \cdots, x_j^{b-1})
  • 高斯: \phi_j(x) = \exp(-\frac{(x-u_j)^2}{2s^2})
  • sigmoid: \phi_j(x) = \sigma(\frac{x-u_j}{s}), 其中\sigma(z) = \frac{1}{1+e^{-z}}
  • tanh: 2\sigma(z)-1

下图分别展示了多项式基函数, 高斯基函数和sigmoid基函数的图像:


后续关于线性模型的描述都基于这个最广义的基于参数的线性模型.

2. 最小二乘

1. 最小二乘学习法

最小二乘学习法(后续简称二乘法)是对模型输出和训练集输出的残差的平方和最小时的参数\theta进行学习:
J_{LS}(\theta) = \frac{1}{2}\sum_{i=1}^n(f_\theta(x_i)-y_i)^2
优化目标:
\hat{\theta}_{LS} = \underset{\theta}{argmin}J_{LS}(\theta)
二乘法也称L2损失最小化学习法.

线性模型f_\theta(x) = \sum_{j=1}^b\theta_j\phi_j(x) = \theta^T\phi(x)训练样本的残差平方J_{LS}表示如下:
J_{LS}(\theta)= \frac{1}{2}\|\Phi\theta-y\|^2
其中, y=(y_1,\cdots,y_n)^T是训练输出的n维行向量, \Phi是基函数的nxb设计矩阵:
\Phi= \begin{pmatrix} \phi_1(x_1) & \cdots & \phi_b(x_1) \\ \vdots & \ddots & \vdots \\ \phi_1(x_n) & \cdots & \phi_b(x_1n \end{pmatrix} = (\phi(x1), \cdots, \phi(x_n))
也是输入数据的基函数向量向量组成的列向量矩阵.
求平方差J_{LS}(\theta)的参数向量\theta的偏微分:
\nabla_{\theta}J_{LS} = (\frac{\partial J_{LS}}{\partial \theta_1}, \cdots, \frac{\partial J_{LS}}{\partial \theta_b})= \Phi^T\Phi\theta-\Phi^T\mathbf y
上式推导:

  1. 常用的矩阵求导公式:


  1. 改写为向量积
    2J_{LS}(\theta)= \|\Phi\theta-y\|^2 = (\Phi\theta-y)^T(\Phi\theta-y)

2.展开多项式
2J_{LS}(\theta)= y^Ty - 2\theta^T\Phi^Ty + \theta^T\Phi^T\Phi\theta

  1. 对第二项求关于\theta的导数:
    根据矩阵求导公式:
    \nabla_{x}(x^TA) = A

    \nabla_{\theta}(2\theta^T\Phi^Ty) = 2\Phi^Ty
  1. 对第三项求\theta的导数:
    根据矩阵求导公式:
    \nabla_{x}(x^TAx) = Ax+A^Tx

    \nabla_{\theta}(\theta^T\Phi^T\Phi\theta) = (\Phi^T\Phi)\theta+(\Phi^T\Phi)^T\theta = 2\Phi^T\Phi\theta \; \;\cdots(\Phi^T\Phi是对称矩阵, 有\Phi^T=\Phi)

第一项求\theta的导数为0, 故:
J_{LS}(\theta)=\Phi^T\Phi\theta-\Phi^Ty
得证.

\nabla \theta_{LS}=0J_{LS}(\theta)取得最小值, 此时最小二乘解满足\Phi^T\Phi \theta=\Phi^T\mathbf y
解得:
\hat \theta_{LS} = (\Phi^T\Phi)^{-1}\Phi^Ty

广义逆矩阵: 是对逆矩阵的推广, 只有方阵, 非奇异矩阵才有逆矩阵, 单矩形矩阵或奇异矩阵都可以定义广义逆矩阵.
令广义逆矩阵为:
\Phi^+ = (\Phi^T\Phi)^{-1}\Phi^T
, 则\hat \theta_{LS}可写为:
\hat \theta_{LS} = \Phi ^+y

2. 最小二乘解的性质

补充知识: 奇异值分解

矩阵A(m\times n)的SVD定义为:
A = U \Sigma V^T \;(此处A不要求是方阵)
奇异值在\Sigma主对角线上. U和V均为酋矩阵, 满足U^TU = I, V^TV=I
SVD分解步骤:
①对A^TA(n\times n)方阵(做特征分解: (A^TA)v_i = \lambda_iv_i, 所有特征向量组成V矩阵, V中的每个特征向量v_i为右奇异向量
②对AA^T(m\times m)方阵做特征分解: (AA^T)u_i = \lambda_iu_i, 所有特征向量组成U矩阵, U中的每个特征向量U_i为右奇异向量
③奇异值矩阵\Sigma为对角矩阵, 每个奇异值\sigma_i=\sqrt{\lambda_i}, \lambda_i为左奇异矩阵A^TA中奇异向量对应的特征值

设计矩阵\Phi(线性模型的基函数矩阵)的奇异值分解:
\phi = \sum_{k=1}^{min(n,b)}\kappa_k\psi_{k} \varphi_k^T

\kappa_k, \psi_{k}, \varphi_k分别称为奇异值, 左奇异向量, 右奇异向量.

  • 奇异值非负
  • 奇异向量满足正交性

\Phi的广义逆矩阵:
\Phi^+ =\sum_{k=1}^{min(n,b)}\kappa_k^+\psi_{k} \varphi_k^T
\kappa _k^+是标量\kappa的广义逆矩阵, \kappa^+ = \frac{1}{\kappa} (\kappa \neq 0时)
最小二乘解表示为:
\hat \theta_{LS}= \sum_{k=1}^{min(n,b)}\kappa_k^+(\psi_{k}^Ty) \varphi_k

模型输出向量变换为列向量:
(f_{\hat \theta_{LS}}(x_1), \cdots, f_{\hat \theta_{LS}}(x_n))^T = \Phi\hat \theta_{LS} = \Phi\Phi^+\mathbf{y}
因此, \Phi\Phi^+\Phi的正交投影矩阵, 最小二乘法输出向量\mathbf y是值域R(\Phi)的正交投影得到的.

带入真实函数中的参数\theta^*:
(f(x_1), \cdots, f(x_n))^T = \Phi \theta^*
可知, 真的输出值向量就存在于R(\Phi)
结论: 用最小二乘法的向量若是由R(\Phi)的正投影得到的, 则可以有效去除y中的噪音.
噪声期望E为0是, \hat \theta_{LS}就是真是参数\theta^*的无偏估计:
E[\hat \theta_{LS}] = \theta^*

渐近无偏性:
增加训练样本n, 上式E[\hat \theta_{LS}]会向着模型中最优参数方向收敛的性质

补充知识: 投影矩阵

  1. 投影到向量

    向量b在向量a上的投影(b)_a=\hat{x}a, 其中\hat{x}=\frac{a\cdot b}{a^\top a} (a,b均为向量)
    \hat{x}求解:
    设b在a直线上的投影为p=\hat{x}a, 作直线a的垂线直线e, 则e为向量b到向量p的最短距离, 且e=b-p.
    e\cdot a = a^T (b-p) = a^T\cdot b - \hat{x}a^T \cdot a = 0 \Rightarrow \hat{x} = \frac{a^T\cdot b}{a^T \cdot a}
  2. 投影到子空间
    若投影p, 向量b, 矩阵P满足p=Pb, 则称P为投影矩阵. 将p=\hat{x}a改写一下, p=\frac{a^T\cdot b}{a^T \cdot a} a = (\frac{a^T\cdot a}{a^T \cdot a}) b, 可将投影向量看做秩为1的投影矩阵P.
  3. 投影矩阵的两个典型的性质
    ① P是一个对称矩阵
    ②它的平方等于它自身:P2=P

3. 带约束的最小二乘

  • L2约束也称L2正则化, 回归问题里也叫岭回归(Ridge Regression),也叫权重衰减(weight decay), 可改善模型的过拟合.
  • L1约束也叫"稀疏规则算子"(Lasso regularization), 模型参数太多时, 模型求解耗时太多, 稀疏学习可将大部分参数置为0, 从而快速求解.

L1和L2约束二乘的参数空间:


1. L2约束二乘

约束条件如下:
\underset{\theta}{\min}J_{LS}(\theta)\quad 约束条件\|\theta\|^2 \leq R
L2参数空间, 是一个参数空间原点为圆心,R为半径内的圆(一般为超球):

引入拉格朗日对偶问题:

利用拉格朗日对偶问题, 求解:
\underset{\lambda}{\max}\min[J_{LS}(\theta) + \frac{\lambda}{2}(\|\theta\|^2-R)]\;s.t. \lambda \ge 0

的最优解问题, 可得到最优化问题\underset{\theta}{\min}J_{LS}(\theta)的解, 上式中拉格朗日待定因子\lambda的解由圆半径R决定

简化版(不由R决定\lambda):
\hat \theta = \underset{\theta}{argmin}[J_{LS}(\theta)+\frac{\lambda}{2}\|\theta\|^2] \; s.t. \lambda \ge 0

上式J_{LS}(\theta)表示对样本拟合程度, 与\frac{\lambda}{2}\|\theta\|^2组合得到最小值, 防止过拟合

L2约束的LS关于\theta的微分可通过下式求解:

\hat J_{LS}(\theta)= J_{LS}(\theta) + \frac{\lambda}{2}\|\theta\|^2 = \frac{1}{2}(\Phi\theta-y)^T(\Phi\theta-y) + \frac{\lambda}{2}\theta^T\theta \quad (1)

\nabla_\theta J_{LS}上文已经求过:

\nabla_\theta J_{LS} = \Phi^T\Phi\theta-\Phi^Ty \quad (2)

\nabla_\theta \theta^T\theta根据矩阵求导公式:

\nabla_\theta \theta^T\theta = 2\theta \quad(3)

综合(2)(3)求(1)中关于\theta的微分:

\nabla_\theta \hat J_{LS}(\theta)=\Phi^T\Phi\theta-\Phi^Ty + 2 \lambda \theta = (\Phi^T\Phi +\lambda I)\lambda -\Phi^Ty

令关于\theta的导数为0, L2约束的LS的解\theta为:
\hat \theta = (\Phi^T\Phi+\lambda I)^{-1}\Phi^T\mathbf y

上式结论:

  • 将矩阵\Phi^T\Phi和\lambda I相加提高其正则性, 进而更稳定地进行逆矩阵求解.
  • L2约束的LS也称为L2正则化的LS, 式(1)中的\|\theta\|^2称为正则项, \lambda为正则化参数
  • L2正则化有时也称岭回归

将设计矩阵\Phi做奇异值分解:
\Phi = \sum_{k=1}^{\min(n,b)}\kappa_k\psi_k\varphi_k^T

带入上上式, 则L2约束的LS解\hat \theta表示为:
\hat \theta = \sum_{k=1}^{\min(n,b)} \frac{\kappa_k}{\kappa_k^2+\lambda}\psi_k^Ty\varphi_k
上式结论:

  • \lambda=0时, L2约束的LS蜕化为一般的LS
  • 设计矩阵\Phi计算条件恶劣,包含极小的奇异值K_k时, K_k/K_k^2=1/K_k变得极大, 训练输出y的噪声会增加
  • 分母\kappa_k^2中加入正的常数\lambda, 避免\kappa_k/(\kappa_k^2+\lambda)过大, 进而可防止过拟合

拓展: 更一般L2约束的LS

更一般的L2约束LS使用b \times b正则化矩阵G, 可得到更一般的表示:

  • 问题表示:
    \underset{\theta}{\min}J_{LS}(\theta)\ s.t. \ \theta^TG\theta \le R

  • \hat \theta求解:
    更一般的L2约束的LS解\theta求解过程, 和标准L2约束的LS大体相同:
    \hat \theta = (\Phi^T\Phi + \lambda G)^{-1}\Phi^Ty

  • 参数空间:
    矩阵G对称正定时, \theta^TG\theta \leq R将数据限制在椭圆区域内. 下图为更一般的L2约束的LS参数空间:

模型选择

  • 部分空间约束或L2约束的LS, 都过分依赖正交投影矩阵P正则化参数λ的选择
  • 选择合适的P和λ至关重要
    采用不同的输入样本, 决定算法中各个参数值的过程称为模型选择

2. L1约束二乘

L1约束二乘的参数空间:



稀疏学习中常用L1进行条件约束:

\underset{\theta}{\min}J_{LS}(\theta)\quad 约束条件\|\theta\|_1 \leq R
其中, \|\theta\|_1=\sum_{j=1}^{b}|\theta_j|
再回顾L1和L2约束二乘的参数空间:

以含参线性模型为例对上图做分析:

f_{\theta} = \sum_{j=1}^b\theta_j\phi_j(x) =\theta^T\phi(x)

  • 训练误差J_{LS}是关于\theta的向下的二次凸函数, 因此J_{LS}在参数空间内有椭圆状等高线, 底部是最小二乘解\hat \theta_{LS}
  • \hat \theta_{L_2CLS}:椭圆等高线和圆周交点是L2约束LS的解\hat \theta_{LS}, 即L_2-Constrained Least Squares
  • \hat \theta_{L_1CLS}:椭圆等高线和菱形的角的焦点是L1约束LS的解\hat \theta, L1约束LS的解一定位于参数的轴

L1约束二乘求解

L1范数包含原点处不可微分的绝对值, 故不能像L2约束那样简单求解:


下面通过利用拉格朗日对偶问题求解, 考虑L1正则化的最优化问题:
\underset{\theta}{\min}J(\theta), J(\theta) = J_{LS}(\theta) + \lambda\|\theta\|_1

L1范数原点不能微分, 用微分的二次函数控制:
|\theta_j| <= \frac{\theta_j^2}{2c_j}+\frac{c_j}{2}, \forall c_j > 0

函数如图:


L2正则化LS一般表达式:
\hat \theta = \underset{\theta}{argmin}\tilde{J}(\theta), \tilde J(\theta) = J_{LS}(\theta)+\frac{\lambda}{2}\theta^T\tilde{\Theta}^+\theta + C

线性模型f_{\theta}(x)=\theta^T\phi(x)的解\hat \theta:
\hat \theta =(\Phi^T\Phi+\lambda\Theta^+)^{-1}\Phi^Ty
现在的解\Theta=\tilde\Theta的情况下,绝对值函数也是与二次函数的上界相外切的,因此,J(\tilde \theta)=\tilde J(\tilde \theta)是成立的。另外,\hat \theta\tilde J为最小的时候取到的,\tilde J(\hat \theta) \ge \tilde J(\hat \theta)也是成立的。由于\tilde J(\theta)是J的上界, 因此\tilde J(\hat \theta) \ge J(\hat \theta)也是成立的, 综上可得:
J(\tilde\theta) = \tilde J(\tilde \theta) \ge \tilde J(\hat \theta) \ge J(\hat \theta)
可见, 更新后的解\hat \theta)比现在的解\tilde \theta)更收敛, 具体如下图所示:

给定适当的初始值反复更新这个解, l1约束二乘的解就可使用l2约束二乘法来求得.

3.Lp约束二乘

L_p范数:
\|\theta\|_p = (\sum_{j=1}^b|\theta_j|^P)^{\frac{1}{p}} \le R
p=\infty时称最大值范数: \|\theta\|_{\infty} = \max\{|\theta_1|,\cdots,|\theta_b|\}
p=0时L_0范数表示非零向量元素个数:
\|\theta\|_0 = \sum_{j=1}^b\delta(\theta_j \ne 0), \delta(\theta_j \ne 0) = \begin{cases} 1& (\theta_j \ne 0) \\ 0&(\theta_j = 0) \end{cases}

L_p范数的单位球(R=1):


分析:

  1. p \leq 1时,坐标轴上呈现有峰值的尖形
  2. p \geq 1时,单位球呈现凸形

稀疏解存在的特殊条件:
1.约束空间为凸形(非凸优化困难)
2.坐标轴上呈现有峰值的尖形

就像上图展示的那样,在坐标轴上呈有峰值的尖形是存在稀疏解的秘诀。另一方面,满足约束条件的空间如果不是凸型的话,可能存在局部最优解,但是最优化工作就会变得异常艰难。因此,当p=1时是稀疏解存在的唯一的凸型,由此可知,L1约束的最小二乘学习法是非常特殊的一种学习方法。

满足Lp范数的约束条件的空间性质:


4. 弹性网络(L1+L2)

L1约束的限制:

  1. 参数b比训练样本n多时, 线性模型可选择的最大特征数被局限为n
  2. 线性模型中形成集群构造(有多个基函数相似的集合)时, L_1LS选择一个忽略其它, 核模型输入样本是构造是更易形成集群构造
  3. 参数b比样本n少时, L_1的通用性比L_2更差

解决方案是L1+L2, 这个方法就是利用L1+L2范数的凸结合来进行约束的:
(1-\tau )\|\theta\|_1+\tau\|\theta\|^2 \le R
这里, \tau满足0 \le \tau \le 1的标量, \tau = 0时, L1+L2约束变为L1约束; \tau = 1时, L1+L2约束变为L2约束; 0 < \tau < 1时, (1-\tau)\|\theta\|_1+\tau\|\theta\|^2 \le R在参数轴上保持尖形.

\tau=0.5时, L1+L2范数的单位球如下图所示(黑实线):

由图可见, \tau=0.5时L1+L2范数的单位球和L_{1.4}范数的单位球形状完全相同, 然而, 如果用放大镜放大角的部分, 会发现L_{1.4}范数的单位球像L2那样平滑, 但是L1+L2范数的单位球则像L1范数那样呈尖形.
因此L1+L2范数约束也会想L1范数约束那样容易求得稀疏解.

此外, 另外,即使参数b比训练样本数n还要多,L1+L2约束的最小二乘学习法也可以拥有n个以上的非零参数。另外,当基函数为集合构造的时候,经常会以集合为单位对基函数进行选择,实验证明:L1+L2约束的最小二乘学习法比L1约束的最小二乘学习法具有更高的精度。然而,除了加入正则化参数λ之外,为了调整L1范数和L2范数的平衡,还需要引入参数T,这也是L1+L2约束最小二乘学习法在实际中所面临的问题。

2. SVM

1. 间隔最大化分类

考虑二分类:
f_{\omega,\gamma}(x) = \omega^Tx + \gamma
\omega为分割样本的超平面的法线, \gamma为截距.

2018-08-29 at 上午9.27.png

对各样本间隔m_i=f_{\omega, \gamma}(x_i)y_i为正时的\omega\gamma学习.

闭集约束条件: (\omega^Tx_i+\gamma)y_i \ge 1, \forall i = 1, \cdots, n

以上\omega\gamma存在时,称训练样本线性可分.

2.硬间隔SVM

分割最充分的超平面为最优解, 对应正则化后的间隔的最小值:

2018-08-29 at 上午9.38.png
  • 正则化间隔m_i:
    m_i = \frac{(\omega^Tx_i + \gamma)y_i}{\|\omega\|}
  • m_i最小化:
    min\left\{\frac{(\omega^Tx_i + \gamma)y_i}{\|\omega\|}\right\}_{I=1}^n = \frac{1}{\|\omega\|}

从几何学来讲, 间隔为两端的两个超平面\omega^Tx+\gamma=+1\omega^Tx+\gamma=-1的间距的一半, 使这个间隔最大的超平面对应的分类器称为硬间隔支持向量机分类器:

3.软间隔SVM

硬间隔SVM假定训练样本线性可分, 软件个SVM允许间隔计算出现少量误差:
min_{\omega,\gamma,\varepsilon}\left[\frac{1}{2}\|\omega\|^2+C\sum_{i=1}^n\varepsilon_i\right]\; 约束条件\;(\omega^Tx_i + \gamma)y_i \ge 1- \varepsilon_i, \varepsilon_i =\ge 0,\forall i=1,\cdots, n

C>0是调整误差范围参数, C越大, \sum_{i=1}^n\varepsilon_i越接近0, 软间隔SVM越接近硬间隔SVM.

通常的SVM指软间隔SVM.

2018-08-29 at 上午9.44.png

2. SVM求解

SVM最优化问题是目标函数为二次函数, 约束条件为线性的典型二次规划问题:

二次规划求解

导入拉格朗日变量:
L( \omega, \gamma, \xi, \alpha, \beta) = \frac{1}{2}\|\delta\|^2 + C \sum_{i=1}^n\xi{i} - \sum_{i=1}^n\alpha_i \left( ( \omega^T x_i+\gamma)y_i - 1 + \xi_i \right) - \sum_{i=1}^n\beta_i\xi_i

考虑最优化问题等价表现形式--拉格朗日对偶问题:
\underset{ \alpha, \beta}{max} \; \underset{ \omega, \gamma, \xi}{inf}\; L( \omega, \gamma, \xi, \alpha, \beta)\; s.t.\; \alpha \ge 0, \beta \ge 0

根据最优解条件可得:
\frac{\partial }{\partial \omega}L = 0 => \omega = \sum_{i=1}^n\alpha_iy_ix_i \\ \frac{\partial }{\partial \gamma}L = 0 => \sum_{i=1}^n\alpha_iy_i = 0 \\ \frac{\partial }{\partial \xi}L = 0 => \alpha_i + \beta_i = C, \forall i=1,\cdots,n

消去松弛变量\varepsilon可得拉格朗日对偶问题如下公式:

\hat \alpha = \underset{\alpha}{argmax}\left[\sum_{i=1}^n\alpha_i-\frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_jx_i^T \right]\; 约束条件\;\sum_{i=1}^n\alpha_iy_i = 0, 0 \le \alpha_i \le C\;, \forall i = 1,\cdots,n
上述最优化问题, 利用只有n个最优变量的二次规划问题, 求解比原始最优化问题跟高效. 原始的最优化问题:
min_{\omega,\gamma,\varepsilon}\left[\frac{1}{2}\|\omega\|^2+C\sum_{i=1}^n\varepsilon_i\right]\; 约束条件\;(\omega^Tx_i + \gamma)y_i \ge 1- \varepsilon_i, \varepsilon_i =\ge 0,\forall i=1,\cdots, n

拉格朗日对偶问题的解用\hat \alpha表示, 则SVM的解\hat \omega为:
\hat\omega = \sum_{i=1}^n\hat \alpha_iy_i\mathbf x_i
截距的解\hat \gamma:
\hat \gamma = y_i - \sum_{j:\hat \alpha_i>0} \hat \alpha_jy_jx_i^Tx_j

3. 稀疏性

KKT条件
对偶解的最优条件即KKT条件. 对偶变量和约束条件满足互补关系:
\alpha_i(m_i-1+\xi_i) = 0,\beta_i\xi_i = 0,\forall i = 1, \cdots, n
KKT条件:

KKT条件

4.核映射

核映射非线性模型
核映射使得SVM可以应用于非线性模型. 使用非线性函数\psi对输入样本\{x_i\}_{=1}^n使用线性SVM分类器.这种特征空间内的线性分类器, 在输入空间是非线性分类器.

如果特征空间维数比输入空间维数d更高,则样本线性可分的可能性更大, 然而特征空间维数过大, 计算量也会响应增加.

核映射可显著降低计算量: 学习时, 线性SVM分类器样本空间输入只存在内积形式x_i^Tx_j=\langle x_i,x_j \rangle; 非线性SVM分类器特征空间输入只存在内积形式\langle \psi(x_i), \psi(x_j) \rangle

核映射优势:

  • 通过核函数K( x,x')定义内积\langle \psi(x_i), \psi(x_j)\rangle, 不需要知道特征变换\psi具体是什么.
  • 输入x不是向量, 也可以正确分类.

常见的核函数:
多项式核函数
K( x, x') = ( x^Tx' + c)^p
高斯核函数
K( x, x') = \exp\left(- \frac{\| x -x'\|^2}{2h^2}\right)

核映射方法适用于只关注内积的任何算法, 如聚类分析, 降维,将现行算法轻松转化为非线性.

5. hinge损失的二乘求解

考虑将SVM分类作为最小二乘分类的扩展.
SVM分类器将0/1损失作为间隔m = f_\theta( x)y的函数单调非增, 但是二乘L_2损失不是单调非增, 直接应用有些不自然, 故考虑将如下Hinge损失作为代理损失:
max\{0, 1-m\}
Hinge损失在m<1时有线性递增趋势, 即分类错误时, 损失无穷递增

Hinge损失和0/1损失函数图像:


Hinge损失和0/1损失

Hinge损失最小化学习:
min_{\theta} = \sum_{i=1}^nmax\{0, 1-f_{\theta}( x_i)y_i\}

回顾线性分类问题和和模型分类问题
线性分类:
f_{\omega, \gamma}(x) = \omega^Tx+\gamma = \sum_{i=1}^n\omega_ix_i + \gamma

核模型分类问题:
f_{\theta, \gamma} = \sum_{j=1}^n\theta_jK(x,x_j)+\gamma

对核模型分类问题进行Hinge损失最小化学习, 引入核矩阵K_{i,j} = K(x_i, x_j)L_2正则化项:
\underset{\theta, \gamma}{min}[ C\sum_{i=1}^nmax\{0, 1- f_{\theta, \gamma}(x_i)y \} + \frac{1}{2}\sum_{i,j=1}^n\theta_i\theta_jK(x_i, x_j) ]

3. 逻辑回归

1. 模型定义

逻辑回归属于基于概率分类的学习法. 基于概率的模式识别是指对模式x所对应的类别y的后验概率p(y|x)禁行学习.
其所属类别为后验概率最大时的类别:
\hat y = \underset{y=1,\cdots,c}{argmax}\ p(y|x)
预测类别的后验概率p(y=\hat y|x), 可理解为模式x所属类别y的可信度.
逻辑回归(logistic), 使用线性对数函数对分类后验概率p(y|x)进行模型化:
q(y|x;\theta) = \frac{\exp(\sum_{j=1}^b\theta_j^{(y)}\phi_j(x))}{\sum_{y'=1}^c \exp(\sum_{j=1}^b\theta_j^{(y')}\phi_j(x))}
上式, 分母是满足概率总和为1的约束条件的正则化项, 参数向量\theta维数为b \times c:

考虑二分类问题y\in \{+1,-1\}:
q(y=+1|x;\theta) + q(y=-1|x;\theta) = 1
使用上述关系式, logistic模型的参数个数从2b降为b个, 模型简化为:
q(y|x;\theta) =\frac{1}{1 + \exp(-y\sum_{j=1}^b\theta_j\phi_j(x))}

补充知识 -对数似然:

似然函数: \prod_{i=1}^{n}q(y_i|x_i;\theta)
对数似然: \sum_{i=1}^n\log\ q(y_i|x_i;\theta)
似然是n次相乘的结果, 一个非常小的值, 经常发生计算丢位现象, 因此, 一般用对数来解决, 即将乘法变换为加法防止丢位现象发生.

二分类逻辑回归模型改写为对数自然最大化:
\underset{\theta}{\min}\sum_{i=1}^n\log\{1+\exp(-y_i\sum_{j=1}^b\theta_j\phi_j(x_i))\}

已知关于参数的线性模型:
f_\theta(x) = \sum_{j=1}^b\theta_j\phi_j(x)
的间隔m=f_\theta(x)y和逻辑回归的损失\log(1+\exp(-m))是等价的.

2. 从最大似然估计 (MLE)理解

1. 决策函数

一个机器学习的模型,实际上是把决策函数限定在某一组条件下,这组限定条件就决定了模型的假设空间。当然,我们还希望这组限定条件简单而合理。而逻辑回归模型所做的假设是:
P(y=1|x;θ)=g(θ^Tx)=\frac{1}{1+\exp(−θ^Tx)}
这里的 g(h) 是sigmoid 函数,相应的决策函数为:
y^∗=1, if \ P(y=1|x)>0.5
选择0.5作为阈值是一个一般的做法,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。

选择0.5作为阈值是一个一般的做法,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。

2. 参数求解

对数似然最大化
在逻辑回归模型中,令q(y=+1|x;\theta) =h_\theta(x) = \frac{1}{1+e^{-\theta x}}, 则q(y=-1|x;\theta) = 1-h_\theta(x)
故似然度可表示为:
\prod_{i=1}^m[h_\theta(x^{(i)}]^{y^{(i)}}[1-h_\theta(x^{(i)}]^{1-y^{(i)}}
对数似然:
J(θ)=−\frac{1}{m}\sum_{i=1}^m [y^{(i)} \log \; h_\theta(x^{(i)}) + (1-y^{(i)}) \log (1- h_\theta(x^{(i)})) ]

逻辑回归模型中,我们最大化似然函数和最小化交叉熵损失函数实际上是等价的。对于该优化问题,存在多种求解方法,这里以梯度下降的为例说明。梯度下降(Gradient Descent)又叫作最速梯度下降,是一种迭代求解的方法,通过在每一步选取使目标函数变化最快的一个方向调整参数的值来逼近最优值。

对于该优化问题,存在多种求解方法,这里以梯度下降求解为例说明。

  1. \theta以初始值
  2. 随机选择一个训练样本(x_i,y_i)
  3. 对于选定的训练样本, 已梯度上升方向对参数\theta进行更新:
    \theta_j \leftarrow \theta_j - \epsilon \nabla _{\theta}J_j(\theta)
    其中:
    \nabla _{\theta}J_j(\theta) = \frac{1}{N}(h_\theta(x^{(i)})-y^{(i)})x^{(i)} \\
    故:
    \theta_j= \theta_j - \epsilon[ \frac{1}{m}\sum_{j=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}]

L2约束的逻辑回归:
J(θ)=−\frac{1}{m}\sum_{i=1}^m [y^{(i)} \log \; h_\theta(x^{(i)}) + (1-y^{(i)}) \log (1- h_\theta(x^{(i)})) ] + \frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2

参数更新(梯度下降):
\theta_j= \theta_j - \epsilon[ \frac{1}{m}\sum_{j=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}] - \epsilon \frac{\lambda}{m}\theta_j
此处的h_\theta(x^{(i)}) = \frac{1}{1+\exp(-\theta^Tx^{(i)})}, 在这里λ称作正则化参数,它通过平衡拟合训练的目标和保持参数值较小的目标。从而来保持假设的形式相对简单,来避免过度的拟合。

3. 从最小化Logstic损失来理解

回顾逻辑回归模型, 并考虑二分类y \in \{+1,-1\}:
q(y|x;\theta) = \frac{\exp(\sum_{j=1}^b\theta_j^{(y)}\phi_j(x))}{ \exp(\sum_{j=1}^b\theta_j^{(y'=+1)}\phi_j(x)) + \exp(\sum_{j=1}^b\theta_j^{(y'=-1)}\phi_j(x))}
逻辑斯蒂回归二分类模型的基本假设是输出Y=1的对数几率是输入x的线性函数,换句话说
\log\frac{q(y=+1|x;\theta)}{q(y=-1|x;\theta)} = \theta^Tx \ \ (1)
对于二分类问题, 有:
q(y=+1|x;\theta) + q(y=-1|x;\theta) = 1 \ \ (2)
q(y=+1|x;\theta) = p_{+1}, q(y=-1|x;\theta) = p_{-1}, 结合(1)(2)式:
p_{+1} = p_{-1} \cdot \exp(\theta^Tx) = (1-p_{+1})exp(\theta^Tx)
故:
p_{+1} = \frac{\exp(\theta^Tx)}{1+\exp(\theta^Tx)} = \frac{1}{1+ \exp(-\theta^Tx)}\ \ (3) \\ p_{-1} = \frac{p_{+1}}{\exp(\theta^Tx)} = \frac{1}{1+\exp(\theta^Tx)} \ \ (4)
这里得到了q(y=+1|x;\theta)的决策函数\frac{1}{1+\exp(-z)}, 综合(3)(4)得:
q(y|x;\theta) = \frac{1}{1+\exp(-y\theta^Tx)}
在 training data 上进行 maximum log-likelihood 参数估计:
\underset{\theta}{\max}\log \prod_{i=1}^m P(y_i|x_i) = \underset{\theta}{\max}\sum_{i=1}^m\log(\frac{1}{1+\exp({-y_i\theta^Tx_i})})= \underset{\theta}{\max}\sum_{i=1}^m-\log(1+\exp({-y_i\theta^Tx_i}))
等价于:
\underset{\theta}{\min}\sum_{i=1}^m\log(1+\exp({-y_i\theta^Tx_i}))
L(\theta) = \sum_{i=1}^m\log(1+\exp({-y_i\theta^Tx_i})), 此时目标函数是 strongly convex 的。接下来我们考虑用 gradient descent 来对目标函数进行优化。首先其 Gradient 是:
\nabla_{\theta}L(\theta) = \sum_{i=1}^m-\frac{\exp(-y_i)}{1+\exp(-y_i\theta^Tx_i)}y_ix_i

L2正则化:
L'(\theta) = L(\theta) + \frac{\lambda}{2}\theta^T\theta \\ \nabla_{\theta}L'(\theta) = \sum_{i=1}^m-\frac{\exp(-y_i)}{1+\exp(-y_i\theta^Tx_i)}y_ix_i + \lambda \theta

4. 决策树

Decision Trees (DTs) 是一种用来classification和regression的无参监督学习方法。其目的是创建一种模型从数据特征中学习简单的决策规则来预测一个目标变量的值。

分类决策树由节点和有向边组成, 结点有内部结点和叶结点. 内部结点表示一个特征或属性, 叶结点表示一个类.


例如,在下面的图片中,决策树通过if-then-else的决策规则来学习数据从而估测数一个正弦图像。决策树越深入,决策规则就越复杂并且对数据的拟合越好。


决策树的优势:

  • 便于理解和解释。树的结构可以可视化出来。
  • 训练需要的数据少。其他机器学习模型通常需要数据规范化,比如构建虚拟变量和移除缺失值,不过请注意,这种模型不支持缺失值。
  • 由于训练决策树的数据点的数量导致了决策树的使用开销呈指数分布(训练树模型的时间复杂度是参与训练数据点的对数值)。
    = 能够处理数值型数据和分类数据。其他的技术通常只能用来专门分析某一种变量类型的数据集。详情请参阅算法。
  • 能够处理多路输出的问题。
  • 使用白盒模型。如果某种给定的情况在该模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况。相比之下,在黑盒模型中的结果就是很难说明清 楚地。
  • 可以通过数值统计测试来验证该模型。这对事解释验证该模型的可靠性成为可能。
  • 即使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好。

决策树的缺点包括:

  • 决策树模型容易产生一个过于复杂的模型,这样的模型对数据的泛化性能会很差。这就是所谓的过拟合.一些策略像剪枝、设置叶节点所需的最小样本数或设置数的最大深度是避免出现 该问题最为有效地方法。
  • 决策树可能是不稳定的,因为数据中的微小变化可能会导致完全不同的树生成。这个问题可以通过决策树的集成来得到缓解
  • 在多方面性能最优和简单化概念的要求下,学习一棵最优决策树通常是一个NP难问题。因此,实际的决策树学习算法是基于启发式算法,例如在每个节点进 行局部最优决策的贪心算法。这样的算法不能保证返回全局最优决策树。这个问题可以通过集成学习来训练多棵决策树来缓解,这多棵决策树一般通过对特征和样本有放回的随机采样来生成。
  • 有些概念很难被决策树学习到,因为决策树很难清楚的表述这些概念。例如XOR,奇偶或者复用器的问题。
  • 如果某些类在问题中占主导地位会使得创建的决策树有偏差。因此,我们建议在拟合前先对数据集进行平衡。

主要的决策树算法有ID3算法、C4.5算法和CART算法。

分类:
例如, 用经典数据集iris训练决策树, 预测鸢尾花卉种类:



回归:
决策树也可以用来解决回归问题, 预测结果为概率值:


决策树学习算法通常包含特征选择, 决策树生成和剪枝三个步骤.

1. 特征选择

特征选择的准则是信息增益或信息增益比, 特征选择决定用哪个特征划分特征空间.
几个基本概念:
信息增益
表示随机变量的不确定性度量, 随机变量X(离散, 且P(X=x_i)=p_i)的熵定义为:
H(X) = H(P) = -\sum_{i=1}^np_i\log p_i
若上式\log以2为底, 单位比特; 熵越大, 随机变量不确定性越大; p=0.5时, 熵最大(=1), 不确定性最大

条件熵:
条件熵H(Y|X)表示随机变量X的条件下Y的不确定性, 定义为X条件下Y的条件概率分布的熵对X的数学期望:
H(Y|X)= \sum_{i=1}^np_iH(Y|X = x_i)

经验熵经验条件熵
若H(X)和H(Y|X)中的概率若用极大似然估计得到, 则分别称为经验熵和经验条件熵.

信息增益
熵和条件熵之差称为信息增益, 表示得知特征X,则Y的不确定性减少的程度. 注, 决策树中默认熵和条件熵分别是经验熵和经验条件熵, 下同.

特征A对训练集D的信息增益g(D,A):
g(D,A) = H(D)-H(D|A)

信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比可以对这一问题进行校正。
信息增益比表示特征A对训练数据集D的信息增益比。gR(D,A)定义为其信息增益g(D,A)与训练数据集D关于特征A的值的熵HA(D)之比,即:
g_R(D,A) = \frac{g(D,A)}{H_A(D)}

基尼系数
分类问题中,假设有K个类,样本点属于第k类的概率为pk,则概率分布的基尼系数定义为:
Gini(p) = \sum_{k=1}^kp_k(1-p_k) = 1-\sum_{k=1}^kp_k^2

二分类问题, 若样本点属于第一个类的概率为p, 则概率分布的基尼系数为:
Gini(p) = 2p(1-p)
对于给定样本集合D的基尼系数为:
Gini(D) = 1-\sum_{K=1}^k(\frac{|C_k|}{|D|})^2
这里C_k是D中属于第k类的样本子集, K是类的个数.

若样本集合D根据特征A是否取某一可能值a被分割成D1和D2两部分,即:
D_1 = \{(x,y) \in D|A(x) = a\}, D_2 = D-D_1
则在特征A的条件下,集合D的基尼指数定义为:
Gini(D,A) = \frac{|D_1|}{|D|Gini(D_1)} + \frac{|D_2|}{|D|}Gini(D_2)
基尼系数Gini(D)表示集合D的不确定性,表示经A=a分割后集合D的不确定性。基尼系数越大,样本集合的不确定性越大,与熵类似。
从下图可以看出基尼指数和熵之半的曲线很接近,都可以近似地代表分类误差率。

信息增益计算方法
设训练集为D, |D|表示样本个数, 设有K个类C_k , k=1,2,\cdots, K, |C_k|为属于类C_k的样本个数, \sum_{k=1}^k|C_k|=|D|,.
设特征A有n个不同的取值\{a_1, a_2, \cdots, a_n\}, 根据特征A取值, 将D划分为n个子集D_1, D_2, \cdots, D_n, |D_i|D_i的样本个数, \sum_{i=1}^n|D_i|=|D|.
记子集D_i中属于类C_k的样本集合为D_{ik}, 即D_{ik}=D_i \bigcap C_k, |D_{ik}|D_{ik}的样本个数, 于是信息增益的算法如下:

(1) 计算数据集D的经验熵H(D)
H(D) = -\sum_{k=1}^k\frac{|C_k|}{|D|}log2\frac{|C_k|}{|D|}
(2) 计算特征A对数据集D的经验条件熵H(D|A)
H(D|A) = \sum_{i=1}^n\frac{|D_i|}{|D|}H(D_i) = -\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{D_i}\log_2\frac{|D_{ik}|}{|D_i|}
(3) 计算信息增益
g(D,A) = H(D)-H(D|A)
根据信息增益准则的特征选择方法是: 对训练数据集D, 计算每个特征的信息增益, 并比较他们的大小, 选择信息增益最大的特征.

2. 决策树的生成

常见的决策树算法: ID3, C4.5, C5.0 和 CART, 所有种类的决策树算法有哪些以及它们之间的区别?

  • ID3(Iterative Dichotomiser 3)由 Ross Quinlan 在1986年提出。该算法创建一个多路树,找到每个节点(即以贪心的方式)分类特征,这将产生分类目标的最大信息增益。决策树发展到其最大尺寸,然后通常利用剪枝来提高树对未知数据的泛化能力。
  • C4.5 是 ID3 的后继者,并且通过动态定义将连续属性值分割成一组离散间隔的离散属性(基于数字变量),消除了特征必须被明确分类的限制。C4.5 将训练的树(即,ID3算法的输出)转换成 if-then 规则的集合。然后评估每个规则的这些准确性,以确定应用它们的顺序。如果规则的准确性没有改变,则需要决策树的树枝来解决。
  • C5.0 是 Quinlan 根据专有许可证发布的最新版本。它使用更少的内存,并建立比 C4.5 更小的规则集,同时更准确。
  • CART(Classification and Regression Trees (分类和回归树))与 C4.5 非常相似,但它不同之处在于它支持数值目标变量(回归),并且不计算规则集。CART 使用在每个节点产生最大信息增益的特征和阈值来构造二叉树。
1. ID3算法

ID3算法核心: 在决策树各节点上用信息增益准则选择特征, 递归地构建决策树.
从根节点开始, 对结点计算所有可能的信息增益, 选择信息增益最大的特征作为结点特征,由该结点不同却只建立子结点; 再对子节点递归调用以上方法构建决策树, 知道所有特征的信息增益均很小或没有特征可以选择为止. 最后, 得到一个决策树.
ID3相当于用极大似然法进行概率模型的选择.

算法步骤如下:


ID3算法只有树的生成, 生成的树容易过拟合.

2. C4.5算法

与ID3算法相似,C4.5算法对ID3算法进行了改进,C4.5在生成的过程中,用信息增益比来选择特征.

3. CART

分类树与回归树(classification and regression tree,CART)模型(Breiman)既可用于分类也可用于回归。

CART是给定输入随机变量X条件下输出Y的条件概率分布的学习方法, 主要分决策树生成和决策树剪枝.

  • 决策树生成: 是递归构建二叉决策树的过程
  • 特征选择: 回归树用平方误差最小化准则, 分类树用基尼系数最小化准则, 禁行特征选择, 生成二叉树.

回归树生成:
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上输出值,构建二叉决策树:

(1) 选择最优切分变量j与切分点s,求解
J_s = \underset{j,s}{\min} [\underset{c1}{\min}\sum_{x_j \in R_1(j,s)}(y_i-c_1)^2 + \underset{c_2}{\min}\sum_{x_i \in R_2(j,s)}(y_i-c_2)^2 ]
遍历变量j,对固定的切分变量j扫描切分点s,选择使上式最小值的对(j,s)。
(2) 用选定的对(j,s)划分区域并决定相应的输出值:
单元划分
R_1(j,s) = \{x|x^{(j)} \le s \}, \ R_2(j,s) = \{ x|x^{(j)} > s \}
各单元上的最优值:
\hat{c_1} = \frac {1}{N_1}\sum_{x_i \in R_1(j,s)} y_i, \ \hat{c_2} = \frac {1}{N_2}\sum_{x_i \in R_2(j,s)} y_i
(3) 继续对两个子区域调用步骤(1),(2), 直至满足停止条件。
(4)将输入空间划分为M个区域R_1,R_2,\cdots,R_M,生成决策树:
f(x)= \begin{cases} \hat c_1 & x \le s \\ \hat c_2 & x > s \end{cases}
每一轮计算, 求解出决策树f(x)和训练数据的残差: r_i = y_i - f(x_i), 假设此时残差满足要求, 则算法停止, 此时的f(x)即为所求的回归树.

分类树生成:
对分类树用基尼系数(Gini index)最小化准则,进行特征选择,生成二叉决策树,其具体步骤如下:

(1) 设节点的训练数据集为, 计算现有特征对该数据集的基尼系数, 对每个特征A, 对其可能的每个取值a, 根据样本点对A=a的测试为"Y"或者"N"将D分成D_1D_2, 计算A=a时的基尼系数.
(2) 在所有可能的特征A及它们所有可能的切分点a中, 选择基尼系数最小的特征及其对应的切分点作为最有特征和最有切分点. 从现结点生成两个子结点,将训练数据集根据特征分配到两个子结点中去.
(3) 对两个子结点递归调用(1)(2), 知道满足停止条件.
(4)生成CART决策树.

算法停止的条件时节点中的样本个数小于预定阈值, 或样本集的基尼系数小于预定阈值(即样本基本属于同一类), 或者没有更多的特征.

3. 决策树剪枝

剪枝: 决策树学习中, 将已生成的过于复杂的树进行简化的过程称为剪枝(pruning).
过拟合: 决策树的过拟合指的是学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。

剪枝可以解决决策树过拟合问题, 具体: 去掉细分的叶结点, 使其回退到父结点甚至更高节点, 然后将父结点或更高节点改为新的叶结点.
决策树的生成对应于模型的局部选择, 只考虑局部最优; 决策树的剪枝对应于模型的全局选择, 需考虑全局最优.

决策树剪枝通常通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)实现.

决策树整体损失函数:

设数T的叶结点有|T|个, t是树T的叶结点, 该叶结点上游N_t个样本点, 其中k类样本点有N_tk个, k=1,2,\cdots,K
H_t(T)为叶结点t上的经验熵, \alpha \ge 0为参数, 则决策树的损失函数定义为:
C_\alpha(T) = \sum_{t=1}^{|T|}N_t H_t(T) + \alpha|T| \ \ (1)
其中, 经验熵H_t(T):
H_t(T)= - \sum_{k=1}^K \frac{N_{tk}}{N_t}\log \frac{N_{tk}}{N_t} \ \ (2)
将(1)中右边第一项记作C(T):
C(T) = \sum_{t=1}^{|T|}N_t H_t(T) = - \sum_{t=1}^{|T|} \sum_{k=1}^K \frac{N_{tk}}{N_t}\log \frac{N_{tk}}{N_t} \ \ (3)
将(3)带入(1), 得决策树学习的损失函数:
C_\alpha(T) = C(T) + \alpha|T|
上式C_\alpha(T)表示模型对训练数据的预测误差(拟合程度), |T|表示模型复杂度, 损失函数表示了二者的平衡.
参数\alpha \ge 0控制二者间的影响:
(1) 较大的\alpha促使选择较简单的模型
(2) 较小的\alpha促使选择较复杂的模型
(3) \alpha=0意味着只考虑模型数据拟合程度, 不考虑模型复杂度

(4) \alpha确定时, 子树越大, 模型和数据拟合越好, 但模型复杂度高; 反之, 子树越小, 模型复杂度低, 但和数据拟合不好

剪枝说明:

  • 决策树生成只考虑了提高信息增益(或信息增益比), 而决策树剪枝通过优化损失函数, 还考虑了减小模型复杂度.
  • 决策树生成学习局部模型, 决策树剪枝学习整体模型.
  • 上式定义的损失函数极小化等价于正则化的极大似然估计, 所以, 利用损失函数最小原则剪枝就是用正则化的极大似然估计进行模型选择.

树的剪枝算法:

输入: 生成算法产生的整个树, 以及参数\alpha;
输出: 修剪后的子树T_\alhp.
(1) 计算每个结点的经验熵;
(2) 递归地从树的叶结点向上回缩;
设一组叶结点回缩到其父节点前后的整体树分别为T_BT_A, 对应的损失函数值分别为C_\alpha(T_B)C_\alpha(T_A), 假如:
C_\alpha(T_A) \le C_\alpha(T_B) \ \ (4)
则进行剪枝, 将父节点变为新的叶结点.
(3) 返回(2), 直至不能继续为止, 得到损失函数最小的子树T_\alpha

注意, 式(4)决策树剪枝只需要考虑两个数的损失函数之差(), 其计算可在局部进行,故可用动态规划算法实现.

决策树剪枝示意图:


决策树的剪枝

5. 朴素贝叶斯

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法,即“简单”地假设每对特征之间相互独立。 给定一个类别 y和一个从x_1x_n的相关的特征向量, 贝叶斯定理阐述了以下关系:
P(y|x_1,\cdots,x_n) = \frac{P(y)P(x_1,\cdots,x_n|y)}{P(x_1,\cdots,x_n)}
使用简单(naive)的假设-每对特征之间都相互独立:
P(x_1,\cdots,x_n|y) = \prod_{i=1}^nP(x_i|y)
对于所有的i,这个关系式可以简化为:
P(y|x_1,\cdots,x_n) = \frac{P(y) \prod_{i=1}^nP(x_i|y)}{P(x_1,\cdots,x_n)}
由于在给定的输入中P(x_1,\cdots,x_n)是一个常量,我们使用下面的分类规则:
P(y|x_1,\cdots,x_n) \propto P(y)\prod_{i=1}^nP(x_i|y)
所以:
\hat y = \arg \underset{y}{\max}P(y)\prod_{i=1}^nP(x_i|y)
我们可以使用最大后验概率(Maximum A Posteriori, MAP) 来估计P(y)P(x_i \mid y); 前者是训练集中类别y的相对频率。
各种各样的的朴素贝叶斯分类器的差异大部分来自于处理 P(x_i \mid y)分布时的所做的假设不同。

尽管其假设过于简单,在很多实际情况下,朴素贝叶斯工作得很好,特别是文档分类和垃圾邮件过滤。这些工作都要求 一个小的训练集来估计必需参数。(至于为什么朴素贝叶斯表现得好的理论原因和它适用于哪些类型的数据,请参见下面的参考。)

相比于其他更复杂的方法,朴素贝叶斯学习器和分类器非常快。 分类条件分布的解耦意味着可以独立单独地把每个特征视为一维分布来估计。这样反过来有助于缓解维度灾难带来的问题。

另一方面,尽管朴素贝叶斯被认为是一种相当不错的分类器,但却不是好的估计器(estimator),所以不能太过于重视从 predict_proba 输出的概率。

1. 极大似然估计

朴素贝叶斯法中,学习意味着估计P(y)P(x_i|y), 可以用极大似然估计去计算相应的概率.
先验概率P(y)的极大似然估计:
P(y=c_k) = \frac{\sum_{i=1}^NI(y_i=c_k)}{N}, k=1,2,\cdots,K
上式中, I是指示函数, 假如训练数据中y=1的15个样本点有9个, 则c_k = c_1, P(y=c_1) = \frac{9}{15}
设第j个特征x^{(j)}可能的取值集合\{a_{j1}, a_{j2}, \cdots, a_{jS_J}, 条件概率P(X^{(j)}=a_{jl}|Y=c_k)的极大似然估计:
P(X^{(j)}=a_{jl}|Y=c_k) = \frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)} \\ j=1,2,\cdots,n; l=1,2,\cdots, S_j; k = 1,2, \cdots, K
式中, x_i^{(j)}是第i个样本的第j个特征; a_{jl}是第j个特征可能取的第l个值, I为指示函数

补充知识: 指示函数

X的子集A的指示函数I_A定义为:
I_A(x) = \begin{cases} 1 & \text{ if } x \in A \\ 0 & \text{ if } x \notin A \end{cases}
A的指示函数记作I_A(x)X_A(x), 指示函数也称特征函数.

2. 朴素贝叶斯算法

输入: 训练数据T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \}, 其中x_i = (x_i^{(1)},x_i^{(2)},\cdots, x_i^{(n)})^T, x_i^{(j)}是第i个样本的第j个特征, x_i^{(j)}\in \{a_{j1}, a_{j2}, \cdots, a_{jS_j}\}, a_{jl}是第j个特征可能取得第l个值, j=1,\cdots,n, l=1,\cdots, S_j, y_i \in \{c1,\cdots,c_K\}; 实例x;
输出: 实例x的分类
(1) 计算先验概率及条件概率
先验概率P(y):
P(y=c_k) = \frac{\sum_{i=1}^NI(y_i=c_k)}{N}, k=1,2,\cdots,K
条件概率P(X^{(j)}=a_{jl}|Y=c_k):
P(X^{(j)}=a_{jl}|Y=c_k) = \frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)} \\ j=1,2,\cdots,n; l=1,2,\cdots, S_j; k = 1,2, \cdots, K
(2)对于给定的实例x=(x^{(1)},\cdots,x^{(n)})^T, 计算:
P(Y=c_k)\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k), k=1,\cdots,K
(3)确定实例x的分类
y= \arg \underset{c_k}{\max} P(Y=c_k)\prod_{j=1}^n P(X^{(j)} = x^{(j)}|Y=c_k)
我们要做的就是统计对每一个类别来说,每一维特征每个特征出现的频率。频率有可能出现0的情况,我们需要进行*拉普拉斯平滑操作。

3. 贝叶斯估计

贝叶斯估计解决用极大似然估计可能出现的估计概率为0情况, 具体做法是在随机变量各个取值的频数上赋予一个整数\lambda > 0
条件概率的贝叶斯估计:
P(X^{(j)}=a_{jl}|Y=c_k) = \frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)+\lambda}{\sum_{i=1}^NI(y_i=c_k) +S_j\lambda}
先验概率的贝叶斯估计:
P(y=c_k) = \frac{\sum_{i=1}^NI(y_i=c_k)+\lambda}{N+K \lambda}
\lambda=0时是极大似然估计
\lambda=1时是拉普拉斯平滑(Lapalce smoothing)
\lambda<1时是利德斯通(Lidstone smoothing)

补充: 多项分布朴素贝叶斯(Sklearn)

服从多项分布数据的朴素贝叶斯算法,也是用于文本分类(这个领域中数据往往以词向量表示,尽管在实践中 tf-idf 向量在预测时表现良好)的两大经典朴素贝叶斯算法之一。 分布参数由每类 y的\theta_y = (\theta_{y1},\ldots,\theta_{yn})向量决定,式中n是特征的数量(对于文本分类,是词汇量的大小)\theta_{yi}是样本中属于类 y中特征i概率P(x_i \mid y)
参数\theta_y使用平滑过的最大似然估计法来估计,即相对频率计数:
\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}
式中N_{yi} = \sum_{x \in T} x_i是 训练集 T中 特征y在类 y中出现的次数,N_{y} = \sum_{i=1}^{|T|} N_{yi}是类y中出现所有特征的计数总和。
先验平滑因子 \alpha \ge 0应用于在学习样本中没有出现的特征,以防在将来的计算中出现0概率输出。 \alpha = 1被称为拉普拉斯平滑(Lapalce smoothing),而\alpha < 1被称为利德斯通(Lidstone smoothing)。

6. 最大熵模型

最大熵原理认为满足约束条件的模型集合中选取熵最大的模型是最好的模型, 最大熵模型可由最大熵原理导出.

1. 最大熵原理

设离散随机变量X的概率分布P, 则其熵H(P)=-\sum_xP(x)\log P(x)满足不等式:
0 \le H(P) \le \log|X|
当X服从均匀分布时, 熵最大. 举例: X取值:\{A,B,C\}, 假设有约束:P(A)+P(B)=3/10, 则X服从均匀分布即A和B等概率P(A)=P(B)=1/2 \times (3/10)时熵最大.

2. 最大熵模型

输入: 训练集T=\{(x_1,y_1), \cdots, (x_N,y_N)\}
学习目标: 用最大熵原理选择最好的分类模型
联合分布P(X,Y)和边缘分布P(X)的经验分布:
\tilde P(X,Y) = \frac{v(X=x,Y=y)}{N} \\ \tilde P(X) = \frac{v(X=x)}{N}

特征函数(指示函数)f(x,y):
f(x,y) = \begin{cases} 1 & \text{ if } x,y \in A \\ 0 & \text{ otherwise } \end{cases}

特征函数f(x,y)关于经验分布\tilde P(X,Y)的期望E_{\tilde p}(f):
E_{\tilde p}(f) = \sum_{x,y} \tilde P(x,y)f(x,y) \ \ (1)
特征函数f(x,y)关于模型P(Y|X)与经验分布\tilde P(X)的期望E_p(f):
E_p(f) = \sum_{x,y} \tilde P(x)P(y|x)f(x,y) \ \ (2)
假设上式(1)(2)中的两个期望值相等:
E_p(f)=E_{\tilde P}(f) \ \ (3)
可将(3)作为模型约束条件, 如有n个特征函数f_1,\cdots,f_n, 那么有n个约束条件.

下面, 由以上结论导出最大熵模型.

最大熵模型定义:
设满足所有约束条件的模型集合为C \equiv \{ P|E_P(f_i) = E_{\tilde P}(f_i), i=1,\cdots,n \}
定义在条件概率分布P(Y|X)上的条件熵:
H(P)= - \sum_{x,y} \tilde P (x)P(y|x)\log P(y|x)
则模型集合C中条件熵H(P)最大的模型称为最大熵模型.

3. 最大熵模型学习

最大熵模型学习可以形式化为约束最优化问题.
输入:
数据集T=\{(x_1,y_1),\cdots,(x_N,y_N)\}
特征函数f_1(x,y), \cdots, f_n(x,y)
约束最优化问题:
\begin{align*} & \underset{P\in C}{\max}H(P) = -\sum_{x,y}\tilde P(x)P(y|x)\log P(y|x) \\ s.t. \ & E_P(f_i) = E_{\tilde P}(f_i), i = 1,\cdots,n \\ & \sum_yP(y|x) = 1 \end{align*}
按最优化习惯, 将最大值问题改为等价的最小值问题:
\begin{align*} & \underset{P\in C}{\min}-H(P) = \sum_{x,y}\tilde P(x)P(y|x)\log P(y|x) \\ s.t. \ & E_P(f_i) = E_{\tilde P}(f_i), i = 1,\cdots,n \\ & \sum_yP(y|x) = 1 \end{align*}
将约束最优化的原始问题转换为无约束最优化的对偶问题, 引入拉格朗日乘子w_0,\cdots,w_n, 定义拉格朗日函数L(P,w):

\begin{align*} L(P,w) &= -H(P) + w_0(1-\sum_yP(y|x)) + \sum_{i=1}^n w_i(E_{\tilde P}(f_i)-E_P(f_i)) \\ &=\sum_{x,y}\tilde P(x)P(y|x)\log P(y|x) + w_0\left (1-\sum_y P(y|x)) + \sum_{i=1}^nw_i(\sum_{x,y} \tilde P(x,y)f_i(x,y) - \sum_{x,y} \tilde P(x)P(y|x)f_i(x,y) \right ) \end{align*}
最优化化的原始问题:
\underset{P \in C}{\min} \underset{w}{\max} L(P,w)
对偶问题:
\underset{w}{\max} \underset{P \in C}{\min} L(P,w)

由于拉格朗日函数L(P,w)是P的凸函数, 原始问题的解和对偶问题的解释等价的, 下面求对偶问题内部的极小化问题\underset{P \in C}{\min} L(P,w), 将其记作:
\Psi(w) = \underset{P \in C}{\min} L(P,w) = L(P_w, w)
\Psi(w)便是对偶函数, 将其的解记作:
P_w = \arg \underset{P \in C}{\min} L(P,w) = P_w(y|x)
第一步, P_w求解:

L,w)P(y|x)的偏导数:
\begin{align*} \nabla_{P(y|w)} L(P,w) &= \sum_{x,y}\tilde P(x)(\log P(y|x)+1) - \sum_yw_0 -\sum_{x,y}\left (\tilde P(x)\sum_{i=1}^nw_if_i(x,y) \right) \\ & = \sum_{x,y}\tilde P(x) \left ( \log P(y|x) + 1 - w_0 -\sum_{i=1}^nw_i f_i(x,y) \right ) \end{align*}
令偏导数为0, 在\tilde P(x)>0的情况下, 解得:
P(y|x) = exp( \sum_{i=1}^nw_if_i(x,y) + w_0 -1) = \frac{\exp(\sum_{i=1}^n w_i f_i(x,y)}{\exp(1-w_0)}
由于\sum_y P(y|x) = 1, 得:
\begin{align*} P_w(y|x) = \frac{1}{Z_w(x)}\exp (\sum_{i=1}^nw_i f_i(x,y)) \;\; & (1) \\ Z_w(x) = \sum_y \exp(\sum_{i=1}^nw_i f_i(x,y)) \;\; & (2) \end{align*}
由(1)(2)表示的模型P_w=P_w(y|x)就是最大熵模型, 其中Z_w(x)称为规范化因子, f_i(x,y)是特征函数, w_i是特征的权值.

第二步, 求解\underset{w}{\max} \Psi(w):

将其解即为w^*, 有:
w^* = \arg \underset{w}{\max} \Psi(w) \; \; (3)
求解(3)得到对偶函数\Psi(w)的极大值w^*, 用来表示P^*.

因此, 算法学习到的最大熵模型为: P^*=P_{w^*}=P_{w^*}(y|x), 最大熵模型的学习归结为对偶函数\Psi(w)的极大化.

总结:

  1. 对偶问题的极大化等价于最大熵模型的极大似然估计. 详细证明见<统计学习方法> P87
  2. 最大熵模型和逻辑斯蒂回归模型有相似的结构, 他们被称为对数线性模型(log linear model)
  3. 对数线性模型的学习就是对模型进行极大似然估计或正则化的极大似然估计

7. EM算法

概率模型有时既有观测变量, 又有隐变量, 当存在隐变量时, 直接的最大似然估计无法直接搞定。
EM算法是一种迭代算法, 对于含有隐变量(hidden variable)的概率模型参数的极大似然估计或极大后验概率估计.
EM算法每次迭代分两步: E步, 求期望; M步, 求极大; 因此EM算法称为期望极大算法.

最经典的例子就是抛3个硬币:

假设三枚硬币, 分别记作A,B,C,正面出现的概率分别为\pi, p, q. ,抛A硬币决定B和C(A正面, 选B; A反面, 选C), 然后抛B或者C决定正反面, 正面记1, 反面记0; 然后估算3个硬币的正反面概率值。

下面对着三枚硬币建模模型:
\begin{align*} P(y|\theta) &= \sum_z P(y,z|\theta) = \sum_z P(z|\theta)P(y|z,\theta) \\ &= \pi p^y(1-p)^{1-y} + (1-\pi)q^y(1-q)^{1-y} \ \ (1) \end{align*}
上式, 随机变量y是观测变量, 一次试验最终结果是1, 则y=1; 否则, y=0; 随机变量z是隐变量, 表示中间为观测到的掷硬币A的结果; \theta=(\pi, p, q)是模型参数, 这模型是以上数据的生成模型.

注意: 对隐变量的理解是理解EM算法的第一要义, 这里, 随机变量y的数据可以观测, 但是随机变量z的数据不可观测.

我们可以简单的来核对一下这个概率模型写得对不对。我们画出一次抛掷硬币的整个过程,并计算出相应的概率。然后带入到上面的公式中就可以知道模型构建是否正确了。

case A(z) B C prob
1 1 1 - \pi * p
2 1 0 - \pi * (1-p)
3 0 - 1 (1-\pi)*q
4 0 - 0 (1-\pi)*(1-q)

分析:

  1. 试验结果为1
    根据上表, 有P(y=1) = P(case1)+P(case3) = \pi * p + (1-\pi)*q
    同时, y=1带入上式(1), 有:
    P(y=1|\theta) =\pi p^1(1-p)^{1-1} + (1-\pi)q^1(1-q)^{1-1} = \pi p + (1-\pi)q
  2. 试验结果为0
    根据上表, 有P(y=0) = P(case2)+P(case4) = \pi * (1-p) + (1-\pi)*(1-q)
    同时, y=1带入上式(1), 有:
    P(y=0|\theta) =\pi p^0(1-p)^{1-0} + (1-\pi)q^0(1-q)^{1-0} = \pi * (1-p) + (1-\pi)*(1-q)
    可见, 公式(1)符合实际实验结果.

用极大似然估计求参数\theta:
观测数据Y=(Y_1,\cdots,Y_n)^T, 为观测数据Z=(Z_1,\cdots,Z_n)^T, 则观测数据的似然函数为:
P(Y|\theta) = \sum_Z P(Z|\theta)P(Y|Z,\theta)
即,
P(Y|\theta) = \prod_{j=1}^n[ \pi p^{y_j}(1-p)^{1-y_j} + (1-\pi)q^{y_j}(1-q)^{1-y_j}]
考虑求模型参数\theta=(\pi, p, q)的极大似然估计:
\hat \theta = \arg \underset{\theta}{\max} \log P(Y|\theta)
该问题没有解析解, 只能通过迭代的方法求解, EM算法便是可求解这一问题的一种迭代算法.

一般地, 用Y表示观测变量的数据, Z表示隐变量的数据, Y和Z连在一起称为完全数据, 观测数据Y又称不完全数据.

不完全数据Y的概率分布是P(Y|\theta), 对数似然函数L(\theta) = \log P(Y|\theta)
完全数据Y和Z的联合概率分布P(Y,Z|\theta), 对数似然函数是\log P(Y,Z|\theta)

EM算法通过迭代求L(\theta) = \log P(Y|\theta)的极大似然估计, 每次迭代先求E(期望), 后求M(极大化).

Q函数:

完全数据的对数似然\log P(Y,Z|\theta)关于给定观测数据Y和当前参数\theta^{(i)}下对未观测数据Z的条件概率分布P(Z|Y,\theta^{(i)}的期望称为Q函数:
Q(\theta, \theta^{(i)} = E_Z[\log P(Y,Z|\theta)|Y,\theta^{(i)}]

EM算法:
输入: 观测变量数据, 隐变量数据Z, 二者联合分布P(Y,Z|\theta), 条件分布P(Z|Y,\theta)
输出: 模型参数\theta

(1) 选择参数的初值\theta^{(0)}, 开始迭代
注意: EM算法对初始值敏感, 不同的初值可能得到不同的参数估计值
(2) E步: 第i+1次迭代的E步, 计算:
\begin{align*} Q(\theta, \theta^{(i)}) &= E_Z[\log P(Y,Z|\theta) \| Y, \theta^{(i)}] \\ &=\sum_Z\log P(Y,Z|\theta)P(Z|Y,\theta^{(i)}) \end{align*}
这里 , Q^{(i)}是第i次迭代参数\theta的估计值, P(Z|Y, \theta^{(i)})是在观测数据Y和当前参数估计\theta^{(i)}下隐变量数据Z的条件概率分布
(3)M步: 求使Q(\theta, \theta^{(i)})极大化的\theta, 确定第i+1次迭代的参数估计值\theta^{(i+1)}, 完成一次迭代\theta^{(i)} \rightarrow \theta^{(i+1)}:
\theta^{(i+1)} = \arg \underset{\theta}{\max} Q(\theta, \theta^{(i)})
每次迭代使似然函数增大或达到局部极值.
(4) 重复(2)(3)步, 直到收敛.
迭代终止条件, 一般是对较小的\epsilon_1,\epsilon_2, 若满足:
\|\theta^{(i+1)}-\theta^{(i)} \| < \epsilon_1 \; \; \text{or} \; \; \| Q(\theta^{(i+1)},\theta^{(i)})-Q(\theta^{(i)},\theta^{(i)}) \| < \epsilon_2
则停止迭代.

8. 集成学习

集成学习(Ensemble)是一大类模型融合策略和方法的统称, 包含多种集成学习思想.
集成学习把性能较低的多种弱学习期, 通过适当组合形成高性能强学习器的方法. "三个臭皮匠顶个诸葛亮"这样的言语来形容集成学习器.
常见的集成学习分为对弱学习器独立学习的Bagging学习法和对多个弱学习器依次进行的Boosting学习法. 下面是展示了这两种集成学习法的示意图:


1. Boosting

boosting方法训练基分类器时采用串行方式, 各个基分类器之间有依赖.
基本思路: 基分类器层层叠加, 每一层训练时, 对前一层基分类器分错的样本,给予更高的权重. 测试时, 对各层分类器结果加权得到最终结果.
同时, 进行加权时, 最开始就能正确分类的样本,权重会逐渐减小, 有可能造成简单样本反而不能正确分类, 故, Boosting学习应边学习边更新样本券种, 并把学习过程中得到的所有分类器放在一起, 对其可信度平局后得到最终强分类器.
样本加权方法有很多, 最标准的就是Adaboost算法, Adaboost是英文Adaptive Boosting的缩写, 是自适应怎强的意思.

2. Bagging

Bagging是根据英文单词BootstrapAggregation创造的新词,统计学上的Bootstrap称为自主法, 是指有重复随机选取n个样本, 生成和原始样本集稍有差异样本集的方法.
Bagging学习法, 一方面经由自主法生成虚拟训练样本, 并对这些样本学习;另一方面, 反复重复该过程后对得到的多个分类器输出通过投票的方式做出集体决策.
Bagging学习, 重复次数较大, 不易过拟合; 对多个弱分类器学习是并行过程,故Bagging可并行学习.
典型的Bagging学习法是基于决策树基分类器的随机森林(Random Forest).

参考

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

推荐阅读更多精彩内容