Linear和logistic regression

Linear regression

模型推导

假设我们的数据是二维数据, 即用两个特征预测target
\left. \begin{array} { l } { h _ { \theta } ( x ) = \theta _ { 0 } + \theta _ { 1 } x _ { 1 } + \theta _ { 2 } x _ { 2 } } \\ { h _ { \theta } ( x ) = \sum _ { i = 0 } ^ { n } \theta _ { i } x _ { i } = \theta ^ { T } x } \end{array} \right.
将数据代入到模型中, 能得到:
y ^ { ( i ) } = \theta ^ { T } x ^ { ( i ) } + \varepsilon ^ { ( i ) }
其中y^i是训练样本的真实值, \theta ^ { T } x ^ { ( i ) }是训练模型的预测值, \varepsilon ^ { ( i ) }为真实值与预测值的差值

首先此处回顾一下中心极限定理的知识, 中心极限定理的意思是: 无论原始数据服从什么分布, 从该原始数据中抽取出的样本的均值是围绕原数据均值周围的正态分布, 也就是说, 假如从原始数据中每次抽3个样本, 对这三个样本求一个均值, 然后这么每次抽三个抽一万次, 那么我们能得到一万个均值, 这一万个均值是服从正态分布的, 当然这里的每次抽3个太过于极端, 有一个经验是,样本大小必须达到30,中心极限定理才能保证成立。

我们假设在用\theta^Tx预测y的时候会多少产生一些系统性误差, 这些误差大体上来说应该是相互独立的并且是随机的, 那么我们希望这些误差是近似正态分布的, 但是需要注意的是, 虽然我们假设误差是服从正态分布, 但我们不确定对于每个x值, 其\theta^Tx与y的误差是同分布的, 即相同参数的正态分布, 譬如heteroscedasticity异方差效应, 譬如有的特征是按月为单位, 有的是按日为单位, 此时我们就需要对特征做预处理, 使得其能应用在linear regression中, 或者是用log函数等方法将其转变为make sense的特征, 而且对于有的以时间为单位的特征, 其很可能有自相关性, 也需要注意。

对于一些在linear regression无法相加的特征, 譬如这个特征描述的是百分比, 那个特征表示的是总和等等数据, 直接用线性回归加权求和不make sense, 此时可以用local first-order-approximation

在使用模型前, 首先将variable的图plot出来, 看看其适不适合预测, 而且在预测完后, 最好将误差\epsilon画出来, 看看是否有一些难以预测的non-linear部分。

回归模型的最终目标是建立自变量x和y之间的关系,我们希望通过x可以较为准确的表示结果y。而在实际应用场景中,很难甚至不可能把导致y结果的所有变量(特征)都找到,放到回归模型里面。我们只存放那些认为比较重要的特征。根据中心极限定理,把那些对结果影响比较小的(假设独立分布)之和认为是符合正态分布是合理的。所以此处的误差\epsilon即可认定为满足N(0,\sigma)

假设训练的数据量很大, 根据 中心极限定理 可以得到\sum\epsilon满足高斯分布N(\mu,\sigma^2), 由于有截距项\theta_0, 故此处\mu可以为0, 故满足N(0,\sigma^2), 故其概率表达式可表示为:
p \left( \epsilon ^ { ( i ) } \right)=\frac { 1 } { \sqrt { 2 \pi } \sigma } \exp \left( - \frac { \left( \epsilon ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)
\varepsilon ^ { ( i ) }=y ^ { ( i ) }-\theta ^ { T } x ^ { ( i ) }代入可得
p \left( y ^ { ( i ) } | x ^ { ( i ) } ; \theta \right)=\frac { 1 } { \sqrt { 2 \pi } \sigma } \exp \left( - \frac { \left( y ^ { ( i ) } - \theta ^ { T } x ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)
如上面可知, 对于每一个样本 x, 代入到 p (y |x ;θ) 都会得到一个y 的概率; 又因为设定样本是独立同分布的; 对其求最大似然函数:
\left.\begin{aligned} L ( \theta ) & = \prod _ { i = 1 } ^ { m } p \left( y ^ { ( i ) } | x ^ { ( i ) } ; \theta \right) \\ & = \prod _ { i = 1 } ^ { m } \frac { 1 } { \sqrt { 2 \pi } \sigma } \exp \left( - \frac { \left( y ^ { ( i ) } - \theta ^ { T } x ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right) \end{aligned} \right.
对其化简如下:
\left.\begin{aligned} \ell ( \theta ) & = \log L ( \theta ) \\ & = \log \prod _ { i = 1 } ^ { m } \frac { 1 } { \sqrt { 2 \pi } \sigma } \exp \left( - \frac { \left( y ^ { ( i ) } - \boldsymbol { \theta } ^ { T } x ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right) \\ & = \sum _ { i = 1 } ^ { m } \log \frac { 1 } { \sqrt { 2 \pi } \sigma } \exp \left( - \frac { \left( y ^ { ( i ) } - \theta ^ { T } x ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)\\ & =m \log \frac { 1 } { \sqrt { 2 \pi } \sigma } - \frac { 1 } { \sigma ^ { 2 } } \cdot \frac { 1 } { 2 } \sum _ { i = 1 }^m \left( y ^ { ( i ) } - \theta ^ { T } x ^ { ( i ) } \right) ^ { 2 } \end{aligned} \right.
去掉一些与最大似然无关的项后, 就变成
\ell ( \theta )=-\frac { 1 } { 2 } \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) ^ { 2 }
要求这个似然函数的最大值, 那么就相当于最小化如下损失函数:
J(\theta)=\frac { 1 } { 2 } \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) ^ { 2 }
对每个梯度\theta求导可得:
\left.\begin{aligned} \frac { \partial } { \partial \theta _ { j } } J ( \theta ) & = \frac { \partial } { \partial \theta _ { j } } \frac { 1 } { 2 } \left( h _ { \theta } ( x ) - y \right) ^ { 2 } \\ & = 2 \cdot \frac { 1 } { 2 } \left( h _ { \theta } ( x ) - y \right) \cdot \frac { \partial } { \partial \theta _ { j } } \left( h _ { \theta } ( x ) - y \right) \\ & = \left( h _ { \theta } ( x ) - y \right) \cdot \frac { \partial } { \partial \theta _ { j } } \left( \sum _ { i = 0 } ^ { n } \theta _ { i } x _ { i } - y \right) \\ & = \left( h _ { \theta } ( x ) - y \right) x _ { j } \end{aligned} \right.
如下的式子是批量梯度下降, 注意是批量, 求和代表把这一批样本的梯度加在一起统一更新, 而随机梯度下降SGD中的式子是没有求和号的
\left. \begin{array} { c } { \text { Repeat until convergence } \{ } \\ { \theta _ { j } : = \theta _ { j } + \alpha \sum _ { i = 1 } ^ { m } \left( y ^ { ( i ) } - h _ { \theta } \left( x ^ { ( i ) } \right) \right) x _ { j } ^ { ( i ) } }\\ {\} } \end{array} \right.
如下是随机梯度下降:
\left. \begin{array} { c }{Loop\ \{}\\ { \text { for } \mathrm { i } = 1 \text { to } \mathrm { m } , \{ } \\ { \theta _ { j } : = \theta _ { j } + \alpha \left( y ^ { ( i ) } - h _ { \theta } \left( x ^ { ( i ) } \right) \right) x _ { j } ^ { ( i ) } }\\{\}}\\{\}} \end{array} \right.
如下是矩阵形式的最小二乘法的推导过程:
\left. \begin{array} { l } { L ( W ) = \frac { 1 } { 2 } ( X W - y ) ^ { T } ( X W - y ) } \\ { = \frac { 1 } { 2 } \left[ W ^ { T } X ^ { T } X W - W ^ { T } X ^ { T } y - y ^ { T } X W + y ^ { T } y \right] } \\ { = \frac { 1 } { 2 } \left[ W ^ { T } X ^ { T } X W - 2 W ^ { T } X ^ { T } y + y ^ { T } y \right] } \end{array} \right.
然后对其求导:
\left. \begin{array} { l } { \frac { \partial L ( W ) } { W } = 0 } \\ { \frac { \partial L ( W ) } { W } = \frac { 1 } { 2 } \left[ W ^ { T } X ^ { T } X - 2 X ^ { T } y \right] = 0 } \\ { X ^ { T } X W = X ^ { T } y } \\ { W = \left( X ^ { T } X \right) ^ { - 1 } X ^ { T } y } \end{array} \right.
注意, 上述形式的矩阵的最小二乘法是矩阵满秩的情况下, 对于不满秩的情况, 回归方法为:
假设有数据集D:
X = \left[ \begin{array} { c c } { 1 , x ^ { 1 } _ { 1 } , x _ { 2 } ^ { 1 } , \ldots x _ { n } ^ { 1 } } \\ { 1 , x _ { 1 } ^ { 2 } , x _ { 2 } ^ { 2 } , \ldots x _ { n } ^ { 2 } } \\ { \dots \ldots } \\ { 1 , x _ { 1 } ^ { n } , x _ { 2 } ^ { n } , \ldots x _ { n } ^ { n } } \end{array} \right] \quad W = \left[ \begin{array} { c } { w _ { 0 } } \\ { w _ { 1 } } \\ { \dots } \\ { w _ { n } } \end{array} \right] \quad y = \left[ \begin{array} { c } { y _ { 1 } } \\ { y _ { 2 } } \\ { \dots } \\ { y _ { n } } \end{array} \right]

h = X W
那么对损失函数求偏导如下:
\left. \begin{array} { l } { \frac { \partial } { \partial W _ { j } } J ( W ) = \frac { 1 } { M } \sum _ { i = 1 } ^ { m } \left( h _ { w } ^ { x ( i ) } - y ^ { ( i ) } \right) x _ { j } ^ { i } } \\ { W _ { j } : W _ { j } - \alpha \frac { \partial } { \partial W _ { j } } J ( W ) } \end{array} \right.
使用矩阵表示为(设一个新变量E):
E=X-y
其中E的值为:
E = \left[ \begin{array} { l } { h _ { 1 } - y _ { 1 } } \\ { h _ { 2 } - y _ { 2 } } \\ { \dots } \\ { h _ { n } - y _ { n } } \end{array} \right]
W = W - \frac { 1 } { M } \alpha X ^ { T } E
最后补充一下L1, L2以及Elastic Net回归
J ( \vec { \theta } ) = \frac { 1 } { 2 } \sum _ { i = 1 } ^ { m } \left( h _ { \vec { \theta } } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) ^ { 2 } + \lambda \sum _ { j = 1 } ^ { n } \theta _ { j } ^ { 2 }
J ( \vec { \theta } ) = \frac { 1 } { 2 } \sum _ { i = 1 } ^ { m } \left( h _ { \vec{\theta }} \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) ^ { 2 } + \lambda \sum _ { j = 1 } ^ { n } \left| \vec{\theta} _ { j } \right|
J ( \vec { \theta } ) = \frac { 1 } { 2 } \sum _ { i = 1 } ^ { m } \left( h _ { \vec { \theta } } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) ^ { 2 } + \lambda \left( \rho \cdot \sum _ { j = 1 } ^ { n } \left| \theta _ { j } \right| + ( 1 - \rho ) \cdot \sum _ { j = 1 } ^ { n } \theta _ { j } ^ { 2 } \right)

求解linear regression矩阵形式

现在的目标是, 如何在计算机中实现如下公式

\boldsymbol { x } = \left( \boldsymbol { A } ^ { \top } \boldsymbol { A } \right) ^ { - 1 } \boldsymbol { A } ^ { \top } \boldsymbol { b }

对任意一个矩阵A,我们可以对它进行SVD分解\boldsymbol { A } = \boldsymbol { U } \boldsymbol { \Sigma } \boldsymbol { V } ^ { \top } ,其中奇异值 \sigma _ { 1 } , \sigma _ { 2 } , \dots\Sigma 矩阵的对角线上的元素。定义矩阵A的条件数(condition number)为
\operatorname { cond } \boldsymbol { A } : = \frac { \max _ { i } \sigma _ { i } } { \min _ { i } \sigma _ { i } }
考虑两种极端情况,如果矩阵A是单位矩阵I ,那么那么矩阵A 的所有奇异值都是1,\operatorname { cond } \boldsymbol { A } = 1 ;如果矩阵 A 是奇异矩阵,那么矩阵 A 有等于0的奇异值, \operatorname { cond } \boldsymbol { A } = \infty 。对一般的矩阵,其条件数介于1和 \infty 之间。篇幅有限,不介绍条件数的更多信息了,只需要记住一点,通常情况下,矩阵的条件数越低越好。由于计算机的计算不是精确的,条件数越高,计算精度的误差对解的影响也越大。

回过头来看这个例子,

\operatorname { cond } \boldsymbol { A } ^ { \top } \boldsymbol { A } = \operatorname { cond } \boldsymbol { V } \boldsymbol { \Sigma } ^ { 2 } \boldsymbol { V } ^ { \top } = ( \operatorname { cond } \boldsymbol { A } ) ^ { 2 }

也就是说,矩阵 \boldsymbol { A } ^ { \top } \boldsymbol { A } 的条件数是矩阵 A 的平方。这和我们尽量想要条件数低的愿望相违背。解决的办法是利用矩阵 A 的QR分解\boldsymbol { A } = \boldsymbol { Q } \boldsymbol { R }

x = (A ^ { \top } A)^{-1}A ^ { \top } b \Rightarrow A ^ { \top } A x = A ^ { \top } b \Rightarrow R ^ { \top } R x = R ^ { \top } Q ^ { \top } b \Rightarrow R x = Q ^ { \top } b

通过解等价的方程\boldsymbol { R } \boldsymbol { x } = \boldsymbol { Q } ^ { \top } \boldsymbol { b }我们绕过了条件数被平方这样的操作。

如果是在matlab中, 我们就可以用

[Q, R] = qr(A);
x = R \ (Q' * b);

来解得x的值, 其中反斜杠 \ 操作对矩阵进行了LU分解,实际上就是我们大学线性代数天天干的高斯消去法。虽然它和直接求逆再相乘的计算复杂度都是立方复杂度,但是它们前面的系数不一样,使用LU分解的系数是求逆的三分之一。实际在计算机中实验的话,通常使用 \ 会比使用inv快一个数量级。

如果是在python中的话, 就是np.linalg.solve()函数

Logistics regression

一般来说, 一些分类情况如果用linear regression的话就涉及到边界问题, 譬如下图

边界问题

如果我们想尝试用linear regression解决分类问题, 如果我们单纯用p(x)作为线性回归的拟合式的话不合适, 因为其的取值在0~1之间, 而此时我们需要有一个不设边界的函数, 首先想到log函数, 其在某一个方向上是无边界的, 但我们希望在两个方向上都是, 此时就联想到了
9FF388EEFA6166F3259C9FA3CD67D058.jpg

, 因此我们得到了
E9365FDC4C3800DA763810A42DEEFE74.png

, 假设b+wx是分开两类的分界线, 此时我们想求属于某一类的概率, 所以就反向推导出p(x)

在业界,Logistics Regression模型之所以很受欢迎,主要是因为LR模型本质是对数线性模型,实现简单,易于并行,大规模扩展方便,迭代速度快,同时使用的特征比较好解释,预测输出在0与1之间契合概率模型。(模型的可解释性举例,比如A-B的权重比较大,A代表用户,B代表物品,那么可以认为A是对B比较感兴趣的)但是,线性模型对于非线性关系缺乏准确刻画,特征组合正好可以加入非线性表达,增强模型的表达能力。另外,广告LR中,基本特征可以认为是用于全局建模,组合特征更加精细,是个性化建模,因为在这种大规模离散LR中,单对全局建模会对部分用户有偏,对每一用户建模又数据不足易过拟合同时带来模型数量爆炸,所以基本特征+组合特征兼顾了全局和个性化。比如特征向量中,有用户A,B,C,物品E,F,G。基本的特征A,B.C.E.F.G对应的权重,对应的是每个对象的偏置权重,但如果A偏好E,B偏好F,那么组合特征A-E,B-F就是对用户的个性进行建模,组合特征A-E,B-F的权重就是代表A对E的喜好,和B-F的喜好。

logistic图像

首先logistic函数如图,其函数式是:
g ( z ) = \frac { 1 } { 1 + e ^ { - z } }
对于二分类问题,首先给两个类别分别用0和1指代其类别,设当类别属于1时,其概率为:
P ( y = 1 | z ) = \frac { 1 } { 1 + e ^ { - z } }
而当类别属于0时,其概率为:
P ( y = 0 | z ) = 1 - P ( y = 1 | z ) = 1 - \frac { 1 } { 1 + e ^ { - z } } = \frac { 1 } { 1 + e ^ { z } }
其中用来拟合目标结果的多项式曲线可以表示为\theta x\theta _ { 1 } x _ { 1 } + \theta _ { 2 } x _ { 2 } + \ldots \theta _ { n } x _ { n }
而要对这个拟合结果做一个logistics判别, 即将\theta x代入g(z)中, 即h _ { \theta } ( x ) = g \left( \theta ^ { T } x \right)
如最上面的图所示,当x为0的时候,logistics函数y=0.5

决策边界

举个例子,图中绿线是判别边界,在这个边界上的点其\theta x = 0, 而在右侧的点, 其\theta ^ { T } x > 0, 左侧小于0, 故将这些点 与权重的乘积\theta ^ { T } x带入到logistics公式g(z)中,即当g ( z ) \geq 0.5时就判定其属于标签为1的类。
假如现在有30个点属于A类,15个点属于B类,因为各个观测样本之间相互独立,那么它们的联合分布为各边缘分 布的乘积。
那么根据logistics的最大似然估计
L ( \theta ) = \left( \frac { 1 } { 1 + e ^ { - z } } \right) ^ { 30 } \left( \frac { 1 } { 1 + e ^ { z } } \right) ^ { 15 }

为了使这个最大似然最大, 就需要让\frac { 1 } { 1 + e ^ { - z } }中的z也就是\theta x\geq0对应的部分(标签为1的类)中z=\theta x尽可能的大, 这样一来\frac { 1 } { 1 + e ^ { - z } }就会变大, 同理让\frac { 1 } { 1 + e ^ { z } }中对应着\theta x\leq0z=\theta x尽可能的小, 这样就使得\frac { 1 } { 1 + e ^ { z } }变大。

接着求其对数似然即可
若写为公式即
\ln ( L ( w ) ) = \sum _ { i = 1 } ^ { m } y _ { i } \ln \left[ h _ { \theta } ( x ) \right] + \left( 1 - y _ { i } \right) \ln \left[ 1 - h _ { \theta } ( x ) \right]
该公式是通过最大似然函数求对数所得出的,即对每一个点而言,若其标签为1,则1 - y _ { i } = 0,若标签为0, 则1 - y _ { i } = 1而其正规的代价函数为 (因为之前似然函数是求极大值, 而损失函数是求极小值, 故要加负号)
J ( \theta ) = - \frac { 1 } { m } \left( \sum _ { i = 1 } ^ { m } y _ { i } \ln \left[ h _ { \theta } \left( x _ { i } \right) \right] + \left( 1 - y _ { i } \right) \ln \left[ 1 - h _ { \theta } \left( x _ { i } \right) \right] \right)
注意, 当预测类与实际类一致的时候, 也就是对于那些预测正确的样本点, 其标签y_i1-y_i与预测结果的乘积是正数, 而预测的结果越肯定, 也就是z=\theta x在对的情况下尽可能小或者大, 其对应的与标签的乘积得到的正数也就越大。同时注意到代价函数最前面有一个负号, 这样一来这个正数就变为负数了, 即负的代价值, 那么在\Sigma的过程中, 这些准确预测而得到的负代价值能使得总的求和后的代价减少, 也就相当于提供一个正向反馈。
而预测错误的那些样本点经过前面的那个负号以后其代价值是正的, 也可以看做还需要调整的距离。

得到最大对数似然函数后,对其求偏导,即对每一个\theta _ { i }求偏导
重复
\theta _ { i } = \theta _ { i } - \alpha \frac { \partial J ( \theta ) } { \partial \theta _ { i } }
其中\alpha是学习速率,不断迭代上式子直到J(\theta)结果收敛
若要分为三类而不是两类,首先将第一类看做一类,第二第三类合并在一起看做一类,求权重,接着将第二类看做一类,第一和第三合在一起看做一类,以此类推,最终能求出对于每一类的概率

Logistic和SVM的比较

  • 1、样本点对模型的作用不同。SVM中,只有关键的样本点(支持向量)对模型结果有影响,而LR中,每一个样本点都对模型有影响。
  • 2、损失函数不同。SVM是hinge损失函数,LR是log损失函数
  • 3、理论基础不同。SVM基于严格的数学推导,LR基于统计。
  • 4、输出不同。LR可以对每个样本点给出类别判断的概率值,SVM无法做到。
  • 5、可处理的特征空间维度不同。LR在特征空间维度很高时,表现较差。SVM则可以通过对偶求解高效应对这一挑战。
  • 6、防过拟合能力不同。SVM模型中内含了L2正则,可有效防止过拟合。LR要自己添加正则项。
  • 7、处理非线性分类问题能力不同。SVM可通过核函数灵活地将非线性问题转化为线性分类问题。LR如果要做到这一点,需要自己手动地进行特征转换。
  • 8、处理分类问题能力不同。SVM只能处理二类分类问题,如果要处理多类别分类,需要进行 one VS one 或one VS all建模。LR可以直接进行多类别分类。
  • 9、计算复杂度不同。对于海量数据,SVM的效率较低,LR效率比较高。
  • 10、对数据要求不同。SVM依赖于数据表达出的距离测度,所以需要对数据进行标准化处理,而LR不需要。
  • 11、能力范围不同。 SVM拓展后,可解决回归问题,LR不能。
  • 12、可解释性不同。LR基于统计,可解释性比SVM好。
  • 13、抗噪声数据能力不同。SVM的损失函数基于距离测度,抗噪声能力要强于LR。

Logistic回归的正则化

如果你不用正则,那么,标准化并不是必须的,如果你用正则,那么标准化是必须的。

因为不用正则时,我们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,我们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小。而参数值的大小程度或者说大小的级别是与特征的数值范围相关的。举例来说,我们用体重预测身高,体重用kg衡量时,训练出的模型是:
身高 = 体重*x
x就是我们训练出来的参数。
当我们的体重用吨来衡量时,x的值就会扩大为原来的1000倍。
在上面两种情况下,都用L1正则的话,显然对模型的训练影响是不同的。

假如不同的特征的数值范围不一样,有的是0到0.1,有的是100到10000,那么,每个特征对应的参数大小级别也会不一样,在L1正则时,我们是简单将参数的绝对值相加,因为它们的大小级别不一样,就会导致L1最后只会对那些级别比较大的参数有作用,那些小的参数都被忽略了。

如果不用正则,那么标准化对逻辑回归有什么好处吗?

答案是有好处,进行标准化后,我们得出的参数值的大小可以反应出不同特征对样本label的贡献度,方便我们进行特征筛选。如果不做标准化,是不能这样来筛选特征的。

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