[CS229]Notes One

监督学习

首先通过讨论监督学习的一些例子来开始。假设有份关于房价的数据集,包括居住面积和房价:



将这份数据集可视化:



像上面这份数据集,我们该如何预测其他不同面积房屋的价格呢?为了后续学习更容易讲解一些概念,这里约定一些符号表示的意义。
符号 意义
x(i) 输入变量,输入特征
y(i) 输出/目标,label,准备去预测的量
(x(i),y(i)) 单个训练样本
{(x(i),y(i));i=1,...,m} 训练集,包含m个样本
i 上表i表示训练集中的m个样本的索引
输入空间
输出空间

上面的例子中

以更正式的形式描述监督学习问题,我们的目标是,对于给定训练集,去学习一个假设函数h(输入空间到输出空间的映射),假设函数可以对目标值做个很好的预测。过程大致如下:


当我们尝试预测的值是连续的,称为回归问题;若是离散的,即分类问题。

第一部分: 线性回归

为了使我们的房价预测样本更有趣,在每一个房屋样本里面增加一个卧室num这个feature。



这样,输入空间(R^2)变为二维向量。x(i)_1表示第i个样本的第一个feature(居住面积),x(i)_2表示其卧室num。为了实现监督学习,我们必须要决定如何表示假设函数h,作为最初的选择,决定用输入的线性函数来估计目标值y:



这儿θ_i为参数,也称权重。为了简化表达,引入x_0=1,则上式可简化为:

n为输入变量的个数及feature num(不包括x_0)

现在的问题归结为,给我们一个数据集,我们如何选择学习这些参数θ_i?一个合理直观的方法就是让我们的假设函数值h(x)接近真实的值 y,至少对于我们训练集的样本要这样做。为了更好的描述,定义代价函数cost function:


最小均方算法(LMS)

我们的目标很直接,就是选择合适的θ,使得代价函数J(θ)最小化。这儿考虑用梯度下降算法,首先随即初始化θ值,然后按照下面公式重复更新θ:


这儿值得注意的是θ_j,j=0,...,n更新要同时进行,这里α称为学习率。

这是一个非常自然的算法,它重复地向J的最急剧下降的方向迈出了一步。为了实现这个算法,先算出公式右边的偏导项。简单起见,假设训练集只有一个样本(x,y),这样可以忽略求和:



对于单样本训练集,更新规则很简单:



这个更新方法称为最小均方更新规则。这个更新规则有一些性质很自然直观:
  • 每次更新的幅度和误差项{y(i)-h(x(i))}成比例。因此如果遇到一个样本目标真实值和预测值很接近,我们只会小幅度更新;反之类似。

上面是单个样本集的最小均方更新规则(LMS rule),更改上面公式可获得多样本集的最小均方更新规则(LMS rule)。



这种方法在每个步骤上考虑了整个训练集中的每个例子,称为批量梯度下降。

注意,虽然梯度下降通常容易受到局部极小值的影响,但我们这里针对线性回归提出的优化问题只有一个全局最优,而没有其他局部最优,因此梯度下降总是收敛(假设学习速率α不太大)到全局最优。事实上,J是一个凸二次函数。

这里是一个梯度下降的例子,因为它是运行最小化二次函数。


上面所示的椭圆是二次函数的等值线。还显示了由(48,30)处初始化的梯度下降所获得的轨迹。图中的X(用直线连接)标记连续梯度下降通过的值。
当我们运行批量梯度下降来拟合我们之前的数据集上的θ,学习预测房价作为居住面积的函数,我们得到θ0=71.27,θ1=0.1345。如果我们绘制h(x)作为x(面积)的函数,包括训练数据,我们得到以下图:



以上结果用批量梯度下降法得到,有一种替代批量梯度下降的算法也很好。考虑下面的算法:


在该算法中,我们重复地遍历训练集,并且每次遇到一个训练样本时,我们只根据与单个训练样本有关的误差梯度来更新参数。该算法称为随机梯度下降(也称为增量梯度下降)。然而,批量梯度下降在采取一次更新迭代之前必须扫描整个训练集,如果m很大的话则每次迭代代价较高,随机梯度下降可以立即开始取得进展,并且继续以其所查看的每个样本取得进展。通常,随机梯度下降比批量梯度下降更快地将J(θ)“接近”到最小值。由于这些原因,特别是当训练集较大时,随机梯度下降通常比批量梯度下降更优选。

正规方程

梯度下降给出了使J最小化的一种方法。我们来讨论第二种方法,这次显式地执行最小化,而不使用迭代算法。在这个方法中,我们将通过显式地取其相对于θj的导数,并将它们设置为零来最小化J。为了使我们能够做到这一点,让我们介绍一些用矩阵进行微积分的符号。

矩阵偏导

对于函数f:R^(m×n) ---》R,从m×n矩阵到实数的映射,我们定义f关于A的导数为:



因此梯度本身就是一个m×n矩阵,第(i,j)项等于

举个例子,假设A是个2*2矩阵,f如下所示:



A_ij表示A的i行j列元素,可以得到:



我们还引入了迹算子,用tr.表示,它表示一个方阵对角线元素的和:

性质:

  • 当两个矩阵A、B,AB是方阵,trAB=trBA.


  • 当A,B为方阵,a是一个实数有如下公式成立。

总结下矩阵导数的一些事实,方程(4)仅适用于非奇异方阵A,其中|A|表示A的行列式。


回到最小二乘法

借助于矩阵导数的工具,现在让我们继续以封闭形式找到使J(θ)最小的θ值。我们首先用矩阵向量表示法重新编写J。
给定训练集,将设计矩阵X定义m*n矩阵(实际上m*n+1,如果我们包括截距项),每行是一个训练样本的所有feature:



同样处理,将y设计为m维向量包括所有的目标值:



因为:

所以:

可得到代价函数如下:



为了最小化J,对参数θ求偏导。结合公式(2)(3),可得:

因此:


为了最小化J,我们令偏导数为0,即可获得正规方程。



那么,使得J(θ)取最小值得θ为:


概率解释

当面对回归问题时,为什么线性回归,特别是为什么最小二乘成本函数J可能是一个合理的选择?在本节中,我们将给出一组概率假设,在此假设下,最小二乘回归被导出为非常自然的算法。

让我们假设目标变量和输入满足下面等式:


ε(i)是一个误差项,它捕捉了未建模的特征(例如,如果存在与预测房价非常相关的一些特征,但是我们没有考虑进来),或者是随机噪声。我们进一步假设ε(i)是独立同分布的,而且都满足均值为0方差为σ^2的高斯分布。ε(i)的概率密度函数如下:


进一步可得到:

上面公式表示在给定x(i)而且由θ参数化的y(i)分布,注意这里θ是参数不是随机变量。

给定X和θ,y(i)的分布是什么?数据的概率由p(y|X;θ)决定。对于固定的θ这个量通常是看做y的函数。当我们希望明确的将此视为θ的函数,我们将这称之为似然函数:

注意因为前面假设ε(i)独立同分布,进一步简化可得:

现在,给出了关于x(i)和y(i)的概率模型,选择参数θ的最佳合理方法是什么?最大似然原理告诉我们,我们应该选择θ,以便使数据尽可能高的概率。所以我们应该将通过最大化L(θ)选择θ。
我们也可以最大化L(θ)的任何严格增长函数。特别地,如果我们以最大化对数似然为例:


因此最大化ℓ(θ)和最下化下面式子是等价的:


我们认识到它就是我们的代价函数J(θ),我们原来的最小二乘代价函数。

综上所述:在之前关于数据的概率假设下,最小二乘回归对应于寻找θ的最大似然估计。因此,这是一组假设,根据这些假设,最小二乘回归可以作为一种非常自然的方法,仅仅进行最大似然估计。

还要注意,在我们之前的讨论中,我们对θ的最终选择并不取决于方差σ,实际上,即使σ未知,我们也会得到相同的结果。稍后我们将再次使用这个事实,当我们讨论指数族和广义线性模型时。

局部加权线性回归

考虑到x∈R预测y的问题。下面的最左边图显示了将y=θ0+θ1x拟合到数据集的结果。我们看到数据不是直线的,所以拟合不是很好。

相反,如果我们添加了一个额外的特征x2,并且拟合y=θ0+θ1x+θ2x2,那么我们就获得了对数据稍微更好的拟合(中间图)。天真地说,好像我们添加的feature越多越好。然而添加过多新的feature也有危险(过拟合)。最右边的图是拟合五阶多项式的结果。我们看到,即使拟合曲线完美地通过数据,我们也不会期望这是对不同居住区(x)的房价(y)的非常好的预测。没有正式定义这些术语的含义,我们将左边的图形称为欠拟合的实例,其中数据清楚地显示了模型未捕获的结构,而右边的图形是过拟合的实例。

如前所述,并且如上面的示例所示,特征的选择对于确保学习算法的良好性能非常重要。在本部分中,让我们简要地讨论局部加权线性回归(LWR)算法,它假设有足够的训练数据,使得特征选择不那么关键。这种处理将非常简单,因为您将有机会在作业中亲自探索LWR算法的一些特性。

在原始线性回归算法中,为了在x处(即,评估h(x))进行预测,我们将:

  1. 通过最小化代价函数拟合参数θ;
  2. 输出θ'x。

相比之下,局部加权线性回归算法执行以下操作:


这里,w(i)是非负值权重。直观地看,如果对于第i个样本w(i)很大,那么在选择θ时将尽可能的使得[y(i)-θ'x(i)]^2 小。反之,若对于第i个样本w(i)很小,那么在拟合θ时这一项[y(i)-θ'x(i)]^2 会被忽略。

权重的一个标准的选择如下:


请注意,权重取决于我们尝试评估x的特定feature x。此外,如果|x(i)-x|很小,那么w(i)接近1; 如果|x(i)-x| 很大,那么w(i)很小。因此,选择θ时给予接近特定feature x的训练样本更高的“权重”。参数τ控制训练样例的权重随着其x(i)距特定feature x的距离而下降的速度;τ被称为带宽参数,也是您在作业中尝试的东西。

局部加权线性回归是我们看到的非参数算法的第一个例子。我们之前看到的(未加权)线性回归算法被称为参数学习算法,因为它具有固定的,有限数量的参数(θi)。一旦我们拟合了θi并将它们存储起来,我们进行未来的预测就需要保留训练数据。相反,为了使用局部加权线性回归进行预测,我们需要保持整个训练集。术语“非参数”(粗略地)指的是我们为了表示假设函数而需要保留的data量随着训练集的大小线性增长。

第二部分:分类和对数几率回归

现在我们来讨论分类问题。这与回归问题类似,只是我们现在要预测的值y仅具有少量的离散值。现在,我们将重点讨论二分类问题,其中y只能取两个值,0和1。例如,如果我们试图为电子邮件构建垃圾邮件分类器,那么x(i)可能是一封电子邮件的一些特征,如果它是一封垃圾邮件,y可以是1,否则为0。0也被称为负类,1为正类。给定x(i),相应的y(i)也被称为样本的标签。

对数几率回归

我们可以忽略y是离散值的事实来处理分类问题,并使用我们旧的线性回归算法来尝试预测给定x的y。然而,很容易构造此方法性能非常差的样本。直观地,当我们知道h(x)取大于1或小于0的值时,它也没有意义。
为了解决这个问题,让我们改变我们的假设函数h(x)的形式。我们会选择:



函数g(z):



这就是对数几率函数,或者称为(Sigmoid函数)。函数图形如下:

当自变量z趋向于正无穷,函数值趋向于1;自变量z趋向于负无穷,函数值趋向于0。因此,假设函数的值域也在(0,1)之间。为了使下面变换依然成立,和前面类似,令x_0==1:

在继续之前,介绍下关于sigmoid函数导数的一个有用性质:



那么,在对数几率回归模型下,我们该如何确定参数θ?我们给分类模型赋予一组概率假设,然后通过最大似然来拟合参数。让我们假设:

简化上面公式:

假设m个样本是独立的,那么我们可以将参数的可能性写为:

如前所述,更容易最大化对数似然性:

我们如何最大化上面公式呢?和之前线性回归推导类似,可以使用梯度上升。向量化表示的更新公式如下:

注意更新公式中的正号而不是负号,因为我们现在正在最大化,而不是最小化函数。

让我们从一个训练样本(x,y)开始,并利用导数推导随机梯度上升规则:


因此,随机的梯度上升公式如下:


如果我们把这个与LMS更新规则进行比较,就会发现它看起来是相同的;但是这不是相同的算法,因为h(x(i))现在被定义为θ'x(i)的非线性函数。尽管如此,对于完全不同的算法和学习问题,我们最终会得到相同的更新规则,这有点令人惊讶。这是巧合,还是背后有更深层次的原因?当我们到达GLM模型时,我们会回答这个问题。

感知机学习算法

现在我们岔开话题来简要地讨论一些具有历史意义的算法,稍后我们再讨论学习理论。考虑修改对数几率回归方法,“强制”它输出0或1或准确的值。为此,很自然的将g的定义改变为阈值函数:


如果我们和前面一样让h(x)=g(θ'x),但是g使用这个新的定义,并且如果我们使用更新规则:


然后就得到感知器学习算法。

在20世纪60年代,这种“感知器”被认为是大脑中单个神经元如何工作的一个粗略模型。鉴于该算法很简单,当我们在本课后面讨论学习理论时,它也将为我们的分析提供一个起点。然而,请注意,尽管感知器可能与我们讨论的其他算法看起来相似,但它实际上是一种与对数几率回归和最小二乘线性回归非常不同的算法;特别地,很难给感知器的预测赋予有意义的概率解释,或者导出感知器作为最大似然估计算法。

求ℓ(θ)极大值的另一种算法

回到以sigmoid函数为g(z)的对数几率回归,现在让我们讨论最大化(θ)的另一种算法。

首先,让我们考虑一下用牛顿迭代法求函数零点的方法。特别地,假设我们有一个函数f:R->R,我们希望找到一个θ的值,使得f(θ)=0。这里,θ是一个实数。牛顿的方法执行以下迭代:


牛顿法具有很明显的几何意义。迭代格式就是用在θ处切线与x轴的交点代替f的零点。下面牛顿的迭代方法的参考过程图:

在最左边的图中,我们看到函数f和y=0线一起绘制。
我们试图找到θ,使得f(θ)=0;从图中可以看出零点
大约是1.3。假设我们用θ=4.5初始化算法。牛顿法求出一个在θ=4.5与f相切的直线,并求解将该切线与y=0的交点横坐标(中图)。这给了我们下一次迭代
的θ值,约为2.8。最右边的图片显示了进行完下一次迭代的结果,θ更新为1.8左右。再过几次迭代,我们将快速接近1.3附近。

牛顿方法给出了f(θ)=0的一种方法。如果我们想用它来最大化某个函数呢?最大化某个函数即是求函数倒数的零点,所以令f(θ) = ℓ′(θ),我们可以用牛顿迭代去最大化ℓ,迭代公式如下:


最后,在我们的对数几率回归中,θ是向量值,因此我们需要将牛顿方法推广成向量形式。将牛顿方法推广到这种多维设置(也称为牛顿-拉普森方法)迭代方法如下:


H是一个nn矩阵(实际上是n+1n+1,如果我们包括截距项),称为Hessian,由下面式子得出:

牛顿的方法通常比(批)梯度下降具有更快的收敛性,并且需要更少的迭代来接近最小值。然而,牛顿的一次迭代可能比一次梯度下降的迭代更昂贵,因为它需要求解并求n*n Hessian的逆矩阵;但是只要n不是太大,总体上它通常要快得多。当用牛顿法使对数几率回归对数似然函数最大化时,所得方法也称为Fisher scoring法。

第三部分:广义线性模型

到目前为止,我们已经分别看到一个回归和一个分类的例子。在回归模型中,我们有(y|x;θ)服从正态分布;在分类模型中,我们有(y|x;θ)服从伯努利分布,分布参数为x,θ的函数。在本节中,我们将展示这两个方法都是更广泛的模型族(称为广义线性模型(GLM))的特殊情况。我们还将展示如何导出GLM家族中的其他模型并将其应用于其他分类和回归问题。

指数族

为了了解广义线性模型,我们将首先定义指数族。我们可以说,如果它可以写成下面的形式,即是指数族:


这儿,η称为分布的自然参数 natural parameter (又叫典范参数 canonical parameter);T(y)为充分统计量 sufficient statistic(对于我们考虑的分布,常常是T(y)=y的情况。);a(η)是对数划分函数 log partition function。exp(-a(η)) 起着归一化常数的作用,确保分布p(y;η)在y到1之间求和/积分。

如果固定T,a,b就会定义一个以η为参数的分布族;当改变η时,将会得到这一族内的不同分布。

下面我们证明伯努利分布和高斯分布是指数族的特例。期望为φ的伯努利分布表示为Bernoulli(φ),即0-1分布,所以:


随着我们改变φ,可以得到不同期望的伯努利分布。我们现在要证明这一系列通过改变φ的伯努利分布属于指数分布,因此肯定会存在相应的T,a,b使得等式(6)是伯努利分布。下面重写伯努利分布:


因而,自然参数natural parameter:



如果你变换上面式,你会惊奇的发现正好是sigmod函数g(z)。当我们将对数几率回归作为广义线性模型特例时,这将再次出现。为了说明伯努利分布是指数族分布的特例,我们令:


这就说明伯努利分布是可以表示成等式(6)的形式,这就证明了伯努利分布即是指数族分布的特例。
下面我们接着证明高斯分布。回忆一下,在讨论线性模型的概率解释时,高斯分布的方差对参数θ和假设函数的选择没有影响。因此,我们可以选择一个任意的方差,为了简化,我们令方差为1:


那么,我们看到高斯分布也属于指数族:


其实还有许多别的分布也是属于指数族:多项式分布,泊松分布等等。下一部分,我们将描述用于构造模型的一般“配方”,其中y(给定x和θ)来自这些分布中的任何一个。

构建广义线性模型

假设你想要构建一个模型,以基于某些特征x(如商店促销、最近的广告、天气、星期几等)来估计在任何给定小时内到达你的商店的客户数量(或网站上的页面浏览数量)。我们知道泊松分布通常为访问者的数量提供了一个很好的模型。知道这一点,我们怎么能想出一个模型来解决我们的问题?幸运的是,泊松是一个指数族分布,所以我们可以应用一个广义线性模型。在本节中,我们将描述针对诸如此类问题构造广义线性模型(GLM)的方法。
更一般地,考虑分类或回归问题,其中我们希望预测一些作为x的函数随机变量y的值。为了推导这个问题的GLM,我们将对给定x的y条件分布和我们的模型作出以下三个假设:

  1. y|x;θ ~ 指数族,给定x和θ,y的分布服从参数为η的指数族分布。
  2. 给定x,我们的目标是预测给定x的T(y)的期望值。在我们的大多数示例中,我们有T(y)=y,因此这意味着我们希望由我们学习的假设函数输出的预测h(x)满足h(x)=E(y|x)。(注意,对于对数几率回归和线性回归,h(x)的选择都满足这个假设。比如,对数几率回归中,h(x)=p(y=1|x;θ)=0p(y=0|x;θ)+1p(y=1|x;θ)=E(y|x))
  3. 自然参数η和输入x是线性相关的:η = θ'x.

这些假设中的第三个似乎对上述假设最没有道理,并且在我们设计GLM的配方中,它可能被更好地视为“设计选择”,而不是作为假设本身。这三个假设/设计选择将允许我们导出非常优雅的一类学习算法,即GLM,其具有许多好的特性,例如易于学习。此外,所得到的模型通常对于模拟y上的不同类型的分布非常有效;例如,我们很快将表明逻辑回归和普通最小二乘都可以导出为GLM。

普通最小二乘法

为了证明普通最小二乘法是广义线性模型GLM族的一个特例,考虑目标变量y(GLM术语中也称为响应变量)是连续的设置,我们将给定x的y条件分布建模为高斯分布N(μ,σ^2)(这儿μ可能依赖x)。所以,我们将上面说的指数族作为高斯分布。如前所述,在高斯作为指数族分布的公式中,我们有μ=η。所以,

第一个等式源自上面的第二个假设;第二个等式很显然成立,μ是高斯分布的期望值;第三个等式满足上面第一个假设;最后一个等式满足上面的假设3。

对数几率回归

我们现在考虑对数几率回归。这里我们感兴趣的是二元分类,所以y属于{0,1}。由于y是二元值,因此很自然地选择伯努利Bernoulli分布族对y的条件分布建模。在伯努利分布作为指数族分布的公式中,我们有:


因此,如果p(y|x;θ)~Bernoulli(φ),所以E(y|x;θ)=φ。所以和普通最小二乘类似,可以得到:


最后我们得到假设函数的公式。如果你先前想知道我们是如何提出sigmoid函数的形式的,这儿给出了一个答案:一旦你假设y的条件分布满足伯努利分布,它是由于广义线性模型GLM和指数族分布的定义而产生的。

SoftMax回归

我们再来讨论广义线性模型GLM更复杂一点的例子。考虑一个分类问题,其中响应变量y可以取k个值中的任何一个,所以y属于{1,2,...,k}。例如,我们可能希望将电子邮件分类为垃圾邮件,个人邮件和工作相关邮件等三类,而不是将电子邮件分类为垃圾邮件或垃圾垃圾邮件这两类垃圾邮件。响应变量仍然是离散的,但现在可以取得两个以上的值。 因此,我们将根据多项分布对其进行建模。

让我们派生一个广义线性模型GLM来对这种类型的多项数据建模。 为此,我们将首先将多项式表示为指数族分布。为了在k个可能的结果上参数化多项式,可以使用k参数φ1,...,φk来指定每个结果的概率。但是,这些参数是多余的,或者更正式地说,它们不是独立的。所以,我们将仅使用k-1个参数φ1,...,φk-1来参数化多项式,其中φk = 1-∑φi(i=1,...,k-1)。
为了将多项式表示为指数族分布,我们定义T(y)为k-1维:


与我们之前的例子不同,这里我们没有T(y)= y; 此外,T(y)现在是k-1维向量,而不是实数。我们将用(T(y))i来表示向量T(y)的第i个元素。
我们介绍一个非常有用的符号。 如果参数为真,则指示符函数1 {·}的值为1,否则为0(1{True} = 1,1{False} = 0)。比如,1{2=3}=0,1{3=5-2}=1。所以我们也可以将T(y)和y之间的关系写成:


更进一步,可以得到:


我们现在准备证明多项式是指数族的成员。我们有:

这完成了我们将多项式作为指数族分布的公式。链接函数(对于i = 1,...,k)如下:


为方便起见,我们还定义了ηk= log(φk/φk)= 0。为了反转链接函数并导出响应函数,我们因此得到:


可以将其代入等式(7)去获得响应函数:


从η到φ的映射函数称为softmax函数。为了完成我们的模型,我们使用前面给出的假设3,即ηi与x的线性相关。所以,有ηi = θi'x(i = 1,...,k-1),这儿θi是n+1维向量,我们模型的参数。为了符号方便,我们还可以定义θk= 0,以便ηk=θ'x = 0,如前所述。因此,我们的模型假设给定x的y的条件分布由下式给出:


该模型适用于分类问题,其中y∈{1,...,k},是称为softmax回归。它是对数几率回归的推广。我们的假设函数将输出:

换句话说,对于i = 1,...,k的每个值,我们的假设将输出p(y = i | x;θ)的估计概率。

最后,让我们讨论参数拟合。类似于我们对普通最小二乘和逻辑回归的原始推导,如果我们有一个m个样本的训练集{(x(i),y(i));i= 1,...,m}并想学习这个模型的参数θi,我们首先写下对数似然:

为了获得上面的第二行,我们使用等式(8)中给出的p(y | x;θ)的定义。 我们现在可以通过使用诸如梯度上升或牛顿方法之类的方法,来最大化ℓ(θ)来获得参数θ的最大似然估计。

笔记

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

推荐阅读更多精彩内容