隐马尔科夫模型

介绍
第一部分 参数方法——类密度模型参数估计
第二部分 监督学习——分类(基于似然的方法)
第三部分 监督学习——分类(基于判别式的方法)(参数方法——判别式参数估计)
第四部分 监督学习——回归
第五部分 监督学习——关联规则
第六部分 维度规约(特征的提取和组合)
第七部分 半参数方法
第八部分 非监督学习——聚类
第九部分 非参数方法——密度估计
第十部分 非参数方法——决策树实现的判别式
第十一部分 多层感知器——非参数估计器
第十二部分 局部模型
第十三部分 支持向量机与核机器
第十四部分 隐马尔科夫模型
第十五部分 参数的贝叶斯估计
第十六部分 集成学习——组合多学习器
第十七部分 增强学习
第十八部分 机器学习实验
第十九部分 特征工程与数据预处理

一般情况下,我们都会假设样本独立同分布,好处是整个样本的似然可由各个实例的似然之积得到。而这一假设在一些连续实例具有依赖性的应用中并不适用。马尔科夫模型所考虑的问题,不再假设样本实例间相互独立。而是把输入序列建模为由一个参数化的随机过程所产生的序列。

离散马尔科夫过程

考虑一个服从离散马尔科夫过程的系统,在任意时刻处于N个离散状态S_1,S_2,\cdots,S_3之一。将其在时刻 t 的状态记做q_t,t=1,2,\cdots
系统每一时刻的状态,根据以前各时刻的状态值,按一定的概率转移到另一个状态:P(q_{t+1}|q_t,q_{t-1},\cdots)
对于一阶马尔科夫模型,系统在 t+1 时刻的状态只依赖于 t 时刻的状态:P(q_{t+1}|q_t,q_{t-1},\cdots)=P(q_{t+1}|q_t)

我们假设状态从S_iS_j转移概率不受具体的时刻 t 影响,也就是从S_iS_j总具有相同的概率。记相应的转移概率为a_{ij}=P(q_{t+1}=S_j|q_t=S_i),并满足\sum_{j=1}^Na_{ij}=1,a_{ij}\geq0A=[a_{ij}]是一个N*N矩阵,称作转移概率矩阵

这样系统总是以概率a_{ij}从状态S_i转移到S_j,唯一的特例是第一个状态。定义初始状态概率为P(q_1=S_i)=\pi_i,并满足\sum_{i=1}^N\pi_i=1。并记\Pi=[\pi_i]为初始概率向量。

可观测马尔科夫模型

在可观测的马尔科夫模型中,状态时刻直接观测的属性。在任意时刻 t ,我们可以观测知道状态q_t。随着系统从一个状态变为另一个状态,可以得到一个观测状态序列。记观测序列为O=Q=\{q_1q_2\cdots q_T\},其概率为
P(O=Q|A,\Pi)=P(q_1)\prod^T_{t=1}P(q_t|q_{t-1})=\pi_{q1}a_{q_1q_2}\cdots a_{q_{T-1}q_T}

给定观测序列集X=\{O^k\}^K_{k=1},估计可观测马尔科夫模型的参数很直接。初始概率向量用以S_i开始的序列数占总序列数的比例来估计:
\hat{\pi}_i=\frac{1(q^k_1=S_i)}K,其中1(e),在e为真时等于1,否则为0。
而转移概率a_{ij}的估计则为从S_i转移到S_j的个数占所有从S_i转移的总数:
\hat{a}_{ij}=\frac{\sum_k\sum^{T-1}_{t=1}1(q^k_t=S_i\ \&\ q^k_{t+1}=S_j)}{\sum_k\sum^{T-1}_{t=1}1(q^k_t=S_i)}

隐马尔科夫模型

隐马尔科夫模型(HMM)中,系统状态是不可直接观测的,每个状态q_t只能记录一个观测值o_t,即O\neq Q
这个观测是状态的概率函数,假定每个状态的一个离散观测取自集合\{ v_1,v_2,\cdots,v_M \}。依然假设观测概率不依赖于具体的时刻 t ,b_j(m)\equiv P(o_t=v_m|q_t=S_j)是系统处在S_j时,观测到v_m(m=1,\cdots,M)的观测概率。记B=[b_j(m)]为观测概率矩阵。\lambda=(A,B,\Pi)定义了一个HMM模型。

由于状态的不可观测性,在隐马尔科夫模型中,随机性来自于两个方面,状态间转移的随机性,对状态观测的随机性。

HMM的三个基本问题:

  1. 给定一个模型\lambda,估计任意给定观测序列O=\{o_1 o_2 \cdots o_T\}的概率,即P(O|\lambda)
  2. 给定一个模型\lambda和一个观测序列O,找出状态序列Q^*,最大化产生O的概率。即最大化P(Q|O,\lambda)Q^*
  3. 给定观测序列的训练集X=\{ O^k \}_k,学习最大化得到X的概率P(X|\lambda)的模型\lambda^*

下面逐一介绍这些问题。

估计观测序列的概率

对于观测序列O=\{o_1 o_2 \cdots o_T \}和状态序列Q=\{q_1 q_2 \cdots q_T \}。在给定模型\lambda下,状态序列Q观测O的概率为P(O|Q,\lambda)=\prod^T_{t=1}P(O_t|q_t,\lambda)=b_{q_1}(o_1)b_{q_2}(o_2)\cdots b_{q_T}(o_T)。但这是无法直接计算的,因为状态q_t无法观测。
状态序列Q的概率为P(Q|\lambda)=P(q_1)\prod^T_{t=2}P(q_t|q_{t-1},\lambda)=\pi_{q_1}a_{q_1q_2}\cdots a_{q_{T-1}q_T}
由此得到联合密度
\begin{align} P(O,Q|\lambda)=&P(q_1)\prod^T_{t=2}P(q_t|q_{t-1},\lambda)\prod^T_{t=1}P(O_t|q_t,\lambda)\\ =&\pi_{q_1}b_{q_1}(o_1)a_{q_1q_2}b_{q_2}(o_2)\cdots a_{q_{T-1}q_T}b_{q_T}(o_T) \end{align}
从而可得到P(O|\lambda)=\sum_{Q}P(O,Q|\lambda)。但这样计算是不现实的的,因为如果假设所有的概率都不为0,那么有N^T种可能的状态序列Q

前(后)向过程是一种计算P(O|\lambda)的有效方法。及将整个观测序列,在 t 时刻分割为两部分。

先介绍前向过程,给定模型\lambda,定义正向变量\alpha_t(i)为到时刻 t 为止观测到部分序列\left\{ o_1o_2\cdots o_t \right\}且在时刻 t 状态为S_i的概率:
\alpha_t(i)\equiv P(o_1o_2\cdots o_t,q_t=S_i|\lambda)
这种表示方式可以通过积累每个时刻 t 的结果,并迭代地推算出整体的概率:
\begin{align} \alpha_{t+1}(j)=&P(o_1o_2\cdots o_{t+1},q_{t+1}=S_j|\lambda)\\ =&P(o_1o_2\cdots o_{t+1}|q_{t+1}=S_j,\lambda)P(q_{t+1}=S_j|\lambda)\\ =&P(o_1o_2\cdots o_t|q_{t+1}=S_j,\lambda)P(o_{t+1}|q_{t+1}=S_j,\lambda)P(q_{t+1}=S_j|\lambda)\\ =&P(o_1o_2\cdots o_t,q_{t+1}=S_j|\lambda)P(o_{t+1}|q_{t+1}=S_j,\lambda)\\ =&\sum_iP(o_1o_2\cdots o_t,q_t=S_i,q_{t+1}=S_j|\lambda)P(o_{t+1}|q_{t+1}=S_j,\lambda)\\ =&\sum_iP(o_1o_2\cdots o_t,q_{t+1}=S_j|q_t=S_i,\lambda)P(q_t=S_i|\lambda)P(o_{t+1}|q_{t+1}=S_j,\lambda)\\ =&\sum_iP(o_1o_2\cdots o_t|q_t=S_i,\lambda)P(q_{t+1}=S_j|q_t=S_i,\lambda)\\ &P(q_t=S_i|\lambda)P(o_{t+1}|q_{t+1}=S_j,\lambda) \\ =&\sum_iP(o_1o_2\cdots o_t,q_t=S_i|\lambda)P(q_{t+1}=S_j|q_t=S_i,\lambda)P(o_{t+1}|q_{t+1}=S_j,\lambda)\\ =&\left[ \sum^N_{i=1}a_t(i)a_{ij} \right]b_j(o_{t+1}) \end{align}
上式可以看做在t+1 时刻前,有N个可能的状态,通过转移概率a_{ij}转移到时刻 t+1的状态S_j,最终按概率得到状态S_j的观测o_{t+1}
通过前向过程,可以得到观测序列的概率为P(O|\lambda)=\sum^N_{i=1}P(O,q_T=S_i|\lambda)=\sum^N_{i=1}\alpha_T(i)
是产生整个观测序列并最终停留在所有可能状态S_i的概率之和。而计算\alpha_t(i)的复杂度为O(N^2T)

相应的有后向过程,定义后向变量\beta_t(i)为在时刻 t 处于状态S_i且观察到部分序列\left\{ o_{t+1}\cdots o_T\right\}的概率,\beta_t(i)\equiv P(o_{t+1}\cdots o_T|q_t=S_i,\lambda)。递归计算如下:
\begin{align} \beta_t(i)=&P(o_{t+1}\cdots o_T|q_t=S_i,\lambda) \\ =&\sum_jP(o_{t+1}\cdots o_T,q_{t+1}=S_j|q_t=S_i,\lambda)\\ =&\sum_jP(o_{t+1}\cdots o_T|q_{t+1}=S_j,q_t=S_i,\lambda)P(q_{t+1}=S_j|q_t=S_i,\lambda)\\ =&\sum_jP(o_{t+1}|q_{t+1}=S_j,q_t=S_i,\lambda)P(o_{t+2}\cdots o_T|q_{t+1}=S_j,q_t=S_i,\lambda)\\ &P(q_{t+1}=S_j|q_t=S_i,\lambda)\\ =&\sum_jP(o_{t+1}|q_{t+1}=S_j,\lambda)P(o_{t+2}\cdots o_T|q_{t+1}=S_j,\lambda)P(q_{t+1}=S_j|q_t=S_i,\lambda) \\ =&\sum^N_{j=1}a_{ij} b_j(o_{t+1})\beta_{t+1}(j) \end{align}
在时刻 t 之后有N种可能的状态,通过转移概率a_{ij}转移到 t+1 时刻的新状态S_j,按概率得到观测o_{t+1},之后\beta_{t+1}(j)解释后面的所有观测。最后对所有可能的状态观测求和。
整个观测序列的概率为
\begin{align} P(O|\lambda)=&\sum^N_{i=1}P(O,q_1=S_i|\lambda)\\ =&\sum^N_{i=1}P(q_1=S_i|\lambda)P(o_1|q_1=S_i,\lambda)P(O|q_1=S_i,\lambda) \\ =&\sum^N_{i=1}\pi_ib_i(o_1)\beta_1(i) \end{align}

实际上,用前向变量和后向变量一起表示P(O|\lambda)
\begin{align} P(O|\lambda)=&\sum^N_{i=1}P(O,q_t=S_i|\lambda)\\ =&\sum^N_{i=1}P(o_1o_2\cdots o_t|q_t=S_i,\lambda)P(o_{t+1}\cdots o_T|q_t=S_i,\lambda)P(q_t=S_i|\lambda) \\ =&\sum^N_{i=1}\alpha_t(i)\beta_t(i) \end{align}
可以看到,前向变量\alpha_t(i)解释到时刻 t 并终止于到状态S_i的前一部分序列,后向变量\beta_t(i)解释从时刻 t 到时刻 T 的后一部分序列。
这在解决后面的问题时会用到。

最大化给定观测序列的状态序列

给定模型\lambda,寻找产生观测序列O=\left\{ o_1o_2\cdots o_T \right\}的概率最大的状态序列Q=\left\{ q_1q_2\cdots q_T \right\}
定义\gamma_t(i)为在时刻 t 处于状态S_i的概率,有
\begin{align}\gamma_t(i)=&P(q_t=S_i|O,\lambda)\\ =&\frac{P(O|q_t=S_i,\lambda)P(q_t=S_i|\lambda)}{P(O|\lambda)}\\ =&\frac{P(o_1o_2\cdots o_t|q_t=S_i,\lambda)P(o_t\cdots o_T|q_t=S_i,\lambda)P(q_t=S_i|\lambda)}{\sum^N_{j=1}\alpha_t(j)\beta_t(j)} \\ =&\frac{\alpha_t(i)\beta_t(i)}{\sum^N_{j=1}\alpha_t(j)\beta_t(j)} \end{align}
显然\sum_i\gamma_t(i)=1。为了找到状态序列,可以选取每个时刻 t 具有最高概率的状态:q_t^*=\arg\max_i\gamma_t(i)
但这有可能在连续的两个时刻选择到转移概率a_{ij}=0的两个状态。为了找到一个最好的状态序列,使用基于动态规划的Viterbi算法

给定模型\lambda和观测序列O,定义在时刻 t 导致前 t 个观测为给定观测并止于状态S_i的最高概率路径的概率:
\delta_t(i)=\max_{q_1q_2\cdots q_{t-1}}p(q_1q_2\cdots q_{t-1},q_t=S_i,o_1o_2\cdots o_t|\lambda)
于是可以递归地计算\delta_{t+1}(i)。根据动态规划的方法,最优路径可以从最后一个时刻T 反向读取。

首先初始化时刻 1 的概率:\delta_1(i)=\pi_ib_i(o_1)\Psi_1(i)=0
递归:\delta_t(j)=\max_i\delta_{t-1}a_{ij}b_j(o_t)\Psi_1(i)=\arg\max_i\delta_{t-1}(i)a_{ij}
终止时刻:p^*=\max_i\delta_T(i)q_T^*=\arg\max_i\delta_T(i)
路径回溯:q^*_t=\Psi_{t+1}(q_{t+!}^*),t=T-1,T-2,\cdots,1
\Psi_t(j)跟踪在时刻 t-1 最大化\delta_t(j)的状态,也就是前一时刻的最优状态。

学习模型参数

从数据中学习HMM模型\lambda^*,使得最大化训练序列样本X=\{O^k\}^K_{k=1}的似然。
对给定观测O和\lambda,定义\xi_t(i,j)为时刻 t 处于状态S_i且时刻 t+1 处于状态S_j的概率:
\begin{align} \xi_t(i,j)\equiv &P(q_t=S_i,q_{t+1}=S_j|O,\lambda)\\ =&\frac{P(O,q_t=S_i,q_{t+1}=S_j|\lambda)}{P(O|\lambda)}=\frac{P(O,q_t=S_i,q_{t+1}=S_j|\lambda)}{ \sum_k\sum_lP(O,q_t=S_k,q_{t+1}=S_l|\lambda)} \\ =&\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{ \sum_k\sum_l\alpha_t(k)a_{kl}b_l(o_{t+1})\beta_{t+1}(l)} \end{align}
\alpha_t(i)解释产生前 t 个观测且时刻 t 状态为S_i,以概率a_{ij}转移到状态S_j,产生 t+1 时刻的观测,而\beta_{t+1}(j)解释后面的观测序列。

对于状态可观测的情况,相当于监督学习,根据
\hat{a}_{ij}=\frac{\sum_k\sum^{T-1}_{t=1}1(q^k_t=S_i\ \&\ q^k_{t+1}=S_j)}{\sum_k\sum^{T-1}_{t=1}1(q^k_t=S_i)}
\hat{b}_j(o_m)=\frac{\sum_k\sum^{T-1}_{t=1}1(q^k_t=S_j\ \&\ o^k_{t+1}=v_m)}{\sum_k\sum^{T-1}_{t=1}1(q^k_t=S_j)}
直接学习模型。

但对于不可观测状态的隐马尔科夫过程,则为非监督问题。实际上隐马尔科夫模型相当于含有隐藏变量Q的模型P(X|\lambda)=\prod_kP(O^k,Q^k|\lambda)=\prod_k[\sum_{Q^k}P(O^k|Q^k,\lambda)P(Q^k|\lambda)]。(EM方法见《非监督学习——聚类》中的介绍,隐藏变量作为观测的源,是混和模型中的分支)使用作为一种EM过程的Baum-Welch算法进行解决。

全部样本的对数似然为\sum_k \log P(O^k,Q^k|\lambda)=\sum_k \sum_{Q^k}\log [P(O^k|Q^k,\lambda)P(Q^k|\lambda)]
每次迭代先计算E步,给定当前\lambda^l=(A^l,B^l,\Pi^l),计算当前的样本对数似然的期望为
\begin{align}E[\sum_k\log P(O^k,Q^k|\lambda)|O^k,\lambda^l]=&\sum_k \sum_{Q^k} \log [P(O^k,Q^k|\lambda)P(Q^k|O^k,\lambda^l)]\\ =&\sum_k \sum_{Q^k} \log [P(O^k,Q^k|\lambda)\frac{P(O^k,Q^k|\lambda^l)}{P(O^k|\lambda^l)}] \end{align}
由于P(O^k|\lambda^l)对于\lambda来说是常数,上式可略去该项:
\begin{align} E[\sum_k\log P(O^k,Q^k|\lambda)|O^k,\lambda^l]=&\sum_k \sum_{q\in Q^k} \log[P(O^k,Q^k|\lambda)P(O^k,Q^k|\lambda^l)]\\ =&\sum_k \sum_{q\in Q^k} \log [\pi_1^{qk}b_1^{qk}(o_1)a_{12}^{qk}\cdots a_{T-1T}^{qk}b_T^{qk}(o_T) P(O^k,Q^k|\lambda^l)]\\ =&\sum_k \sum_{q\in Q^k} \log \pi_1^{qk}P(O^k,Q^k|\lambda^l)+\\ &\sum_k \sum_{q\in Q^k} (\sum_t^{T-1}\log a_{tt+1}^{qk})P(O^k,Q^k|\lambda^l)+ \\ &\sum_k\sum_{q\in Q^k} (\sum_t^T\log b_t^{qk}(o_t))P(O^k,Q^k|\lambda^l) \end{align}
下面需要对极大化期望,上式的三个部分是独立的,可分别对其进行极大化求解。且对于每个观测序列 O^k ,假定它们是相互独立的,那么参数可在每个观测序列上求解后再取平均。
对每个观测序列:
1)\sum_{q\in Q^k}\log \pi_1^{qk}P(Q^k,O^k|\lambda^l)=\sum_{i=1}^N\log \pi_i^kP(Q^k,q^k_1=i|\lambda^l)满足约束\sum_{i=1}^N\pi_i^k=1,使用拉格朗日乘子法求解可得
\pi^k_i=\frac {P(O,q_1=i|\lambda^l)}{P(O|\lambda^l)}
2)\sum_{q\in Q^k} (\sum_t^{T_k-1}\log a_{tt+1}^{qk})P(O^k,Q^k|\lambda^l)=\sum_{i=1}^N \sum_{j=1}^N \sum_{t=1}^{T_k-1}\log a_{ij}^kP(O^k,q_t^k=i,q_{t+1}^k=j|\lambda^l),应用具有等式约束\sum_{i=1}^Na_{ij}^k=1,的拉格朗日乘子法可求得
a_{ij}^k=\frac{\sum_{t=1}^{T_k-1}P(O,q_t^k=i,q_{t+1}^k=j|\lambda^l)}{\sum_{t=1}^{T_k-1}P(O,q_t^k=i|\lambda^l)}
3)\sum_{q\in Q^k} (\sum_{t=1}^{T_k} \log b_t^{qk}(o_t))P(O^k,Q^k|\lambda^l)=\sum_{j=1}^N\sum_{t=1}^{T_k}\log b_j^k(o_t^k)P(O,q_t^k=j|\lambda^l)使用拉格朗日乘子法,等式约束为\sum_{m=1}^Mb_j^k(m)=1,可求得
b_j^k(m)=\frac{\sum_{t=1}^{T_k}P(O,q_i^k=j|\lambda^l)1(o_t^k=v_m)}{\sum_{t=1}^{T_k}P(O,q_i^k=j|\lambda^l)}

对于全体样本X=\left\{ O^k \right\}_{k=1}^K,参数在每个观测上取平均得到\lambda^{l+1}=(A^{l+1},B^{l+1},\Pi^{l+1})
\pi^{l+1}_i=\frac{\sum_{k=1}^K\gamma_t^k(i)}K \tag{a}
a_{ij}^{l+1}=\frac{\sum_{k=1}^K\sum_{t=1}^{T_k-1}\xi^k_t(i,j)}{\sum_{k=1}^K\sum_{t=1}^{T_k-1}\gamma_t^k(i)}\tag{b}
b_j^{l+1}(m)=\frac{\sum_{k=1}^K\sum_{t=1}^{T_k}\gamma_t^k(j)1(o_t^k=v_m)}{\sum_{k=1}^K\sum_{t=1}^{T_k}\gamma_t^k(j)}\tag{c}

观测为连续时

上述讨论的马尔科夫模型,假设观测是离散的,服从多项式分布。对于观测值为连续时,一种方法是将其离散化,通过向量量化转换为最近的离散向量索引。
如果不做离散化处理,对于连续量,简单地假设其服从正态分布p(O_t|q_t=S_j,\lambda)\sim N(\mu_j,\sigma_j^2)。这种情况下,对隐马尔科夫模型参数(c)的估计变为
\mu^{l+1}_j=\frac{\sum_{k=1}^K\sum_{t=1}^{T_k}\gamma_t^k(j)o_t^k}{\sum_{k=1}^K\sum_{t=1}^{T_k}\gamma_t^k(j)}
(\sigma_j^2)^{l+1}=\frac{\sum_{k=1}^K\sum_{t=1}^{T_k}\gamma_t^k(j)(o_t^k-\mu_j^{l+1})^2}{\sum_{k=1}^K\sum_{t=1}^{T_k}\gamma_t^k(j)}

HMM模型中的复杂度

在HMM模型中,影响其复杂度的主要有两个方面。
首先对于隐马尔科夫模型,状态是不可观测的,状态的个数N 也是未知的。在训练模型前,假定N 的大小就是一种归纳偏倚,较小的N对应较小的复杂度。
另一个是HMM的拓扑,对于状态转移矩阵,在有些应用中不是全矩阵。某些状态只会转移到特定的状态,存在部分a_{ij}=0使得模型的复杂度降低。


马尔科夫模型的应用

不再假设样本间相互独立,马尔科夫模型对连续样本序列进行了建模。可以将一个样本序列看做一个样本,就像在“学习模型参数”部分所做的那样。这样每个样本可看做来自于某个马尔科夫模型。
通过计算样本来自某个模型的后验:P(\lambda_i|O)=\frac{P(O|\lambda_i)P(\lambda_i)}{\sum_iP(O|\lambda_i)P(\lambda_i)}
可以做到对样本序列的分类,每个类由一个马尔科夫模型描述。这在语音识别的场景中被广泛使用。通过基本的音素,在时间上构成语音,使用HMM将它们顺序组合。注意HMM模型学习的是时间结构,而在基本单元(序列中的单元)上,尤其是复杂的基本单元,常结合其他方法(如神经网络)进行学习。

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

推荐阅读更多精彩内容