支持向量機原理(Support Vector Machine)

原博客:https://daya-jin.github.io/2018/10/17/SupportVectorMachine/

模型概述

首先回顧一下Logistic Regression,對于一組數據X與標簽Y,Logistic Regression的任務是要找到一組參數使得X\theta^{T}=threshold,對于x\theta^{T}\lt{threshold}的樣本判定為負樣本,而對于x\theta^{T}\gt{threshold}的樣本判定為正樣本,其是一個線性分類器。問題在于,如果有一個理想數據集線性可分,那么模型會因為參數的不同而具有不同的決策邊界,那么在這些決策邊界中如何判定孰優孰劣?

(不支持矢量圖,請移步原博客查看)

對于Logistic Regression這種概率模型而言,在給定一個確定的threshold之后,就可以畫出其決策邊界,空間中的樣本點離決策邊界越遠,說明模型對該樣本的判定可信度越高。那么,在若干決策邊界中,只需要找到一個決策邊界,使得模型對兩個類別的判定可信度均最高即可獲得一個最優分類器。由此引出支持向量機(Support Vector Machine):

數據集X=[x^{(1)},x^{(2)},...,x^{(m)}]^{T},標簽Y=[y^{(1)},y^{(2)},...,y^{(m)}]\in\{+1,-1\},為了實現分類的目的,需要找到一組參數滿足x\theta^{T}+\theta_{0}=0,同時還需要滿足X中的各樣本點離決策邊界x\theta^{T}=0的距離最遠。

SVM模型對未知樣本的預測計算如下:

\hat{y}= \left\{ \begin{aligned} &+1, &\hat{x}\theta^{T}+\theta_{0}\ge+1\\ &-1, &\hat{x}\theta^{T}+\theta_{0}\le-1 \\ \end{aligned} \right.

換句話說,SVM模型的決策邊界實際上是由兩條直線決定的:

x\theta^{T}+\theta_{1}=+1 \\ x\theta^{T}+\theta_{2}=-1

在訓練數據集中,滿足以上直線方程的樣本點就被稱為支持向量(support vector)。根據平行直線距離公式
\frac{|C_{1}-C_{2}|}{\sqrt{A^{2}+B^{2}}}
得這兩條直線之間的距離為:
d=\frac{2}{||\theta||_{2}}

[圖片上傳失敗...(image-4d76c8-1558875604764)]

對分類任務而言,還需要滿足分類的準確性,假設數據是線性可分的,則有:

y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1

所以SVM可以用如下表達式來描述:

\theta^{*}=\arg\max\limits_{\theta} \ \frac{2}{||\theta||_{2}}, \qquad s.t. \ y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1,i=1,...m

上式等價于:

\theta^{*}=\arg\min\limits_{\theta} \ \frac{1}{2}||\theta||_{2}, \qquad s.t. \ y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1,i=1,...m

容易看出SVM自帶參數正則化。

接下來看一下SVM的損失函數,SVM只關心那些被誤分的點,而對于正確分類的點是不計入loss的,由幾何知識易得,模型對被正確分類的點的輸出總是滿足:y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1,所以SVM的損失函數可以寫成:
Loss_{SVM}=\frac{1}{2}||\theta||_{2}+max(0,1-y(x\theta+\theta_{0}))
以上是數據可分的情況,那么如果數據不可分呢?那么允許某些預測樣本不一定要嚴格在直線外側,允許某些樣本處于直線的內側,那么這些被“容忍”的樣本就不滿足y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1了,為了量化這些被“容忍”的樣本偏離正軌的程度,為每一個樣本引入一個松弛變量(slack variables)\xi_{i},這些樣本需要滿足的條件就變為下式:

y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1-\xi_{i}

很顯然\xi_{i}\ge0,并且該變量體現了模型允許樣本越界的程度。那么自然而然地會想到這個越界程度不能是無限制的,所以還要對該變量進行限制,因此SVM問題就變成:

\begin{aligned} \theta^{*}=\arg\min\limits_{\theta} \ \frac{1}{2}||\theta||_{2}+C\sum_{i=1}^{m}\xi_{i}, \qquad s.t.& \ y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1-\xi_{i},i=1,...m \\ & \ \xi_{i}\ge0,i=1,...m \\ \end{aligned}

其中C為樣本越界的代價系數,其值越大,對越界的懲罰就越大。

最優解

如果我們有如下優化問題:

x^{*}=\arg\min\limits_{x}f(x) \qquad s.t. \ g(x)\le0 \\

那么可以使用拉格朗日數乘法來得到一個拉格朗日函數:

L(x,\lambda)=f(x)+{\lambda}g(x)

其中\lambda>0。現考慮針對參數\lambda最大化該函數:

\lambda^{*}=\max\limits_{\lambda}L(x,\lambda)=f(x)+\max\limits_{\lambda}{\lambda}g(x)

注意到\lambda>0g(x)\le0,所以在滿足原問題約束條件的情況下,有:

L(x,\lambda^{*})=f(x)

所以原優化問題可以寫成:

x^{*},\lambda^{*}=\arg\min\limits_{x}\max\limits_{\lambda}L(x,\lambda)

在解優化問題時,如果目標函數是凸函數,那么就可以很容易得到一個全局最優解。拉格朗日問題還有一個對偶問題:

\lambda^{*},x^{*}=\arg\max\limits_{\lambda}\min\limits_{x}L(x,\lambda)

原問題與對偶問題同解的充要條件為KKT條件:

\begin{aligned} \frac{\partial L(x^{*},\lambda^{*})}{\partial x}&=0 \\ {\lambda}^{*}g(x^{*})&=0 \\ g(x^{*})&\le0 \\ \lambda^{*}&\ge0 \\ \end{aligned}

SVM問題是一個帶線性不等式約束的最優化問題,可以使用拉格朗日數乘法的對偶問題來解:

\begin{aligned} \lambda^{*},\theta^{*}&=\arg\max\limits_{\lambda}\min\limits_{\theta}L(\theta,\lambda) \\&=\arg\max\limits_{\lambda}\min\limits_{\theta}\frac{1}{2}||\theta||_{2}^{2}-\sum_{i=1}^{m}\lambda_{i}[y^{i}\cdot{}(x^{i}\theta^{T}+\theta_{0})-1], \qquad s.t. \ \lambda_{i}\ge0 \end{aligned}

\frac{\partial{L}}{\partial{\theta}}=\frac{\partial L}{\partial \theta_{0}}=0得:

\begin{aligned} \frac{\partial{L}}{\partial{\theta}}&=\theta-\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i}=0 \\ \frac{\partial{L}}{\partial{\theta_{0}}}&=-\sum_{i=1}^{m}\lambda_{i}y^{i}=0 \\ \theta^{*}&=\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i} \end{aligned}

將拉格朗日函數展開并代入最優\theta^{*}

\begin{aligned} L(\theta^{*},\lambda)&=\frac{1}{2}||\theta^{*}||_{2}-\sum_{i=1}^{m}\lambda_{i}[y^{i}\cdot{}(x^{i}{\theta^{*}}^{T}+\theta_{0})-1] \\ &=\frac{1}{2}||\theta^{*}||_{2}-(\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i})\cdot{\theta^{*}}^{T}-(\sum_{i=1}^{m}\lambda_{i}y^{i})\cdot\theta_{0}+\sum_{i=1}^{m}\lambda_{i} \\ &=\frac{1}{2}\theta^{*}{\theta^{*}}^{T}-\theta^{*}{\theta^{*}}^{T}+\sum_{i=1}^{m}\lambda_{i} \\ &=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\theta^{*}{\theta^{*}}^{T} \\ &=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}y^{i}y^{j}x^{i}{x^{j}}^{T} \end{aligned}

最大化上式即可求出最優化參數\lambda^{*}

\lambda^{*}=\arg\max\limits_{\lambda}L(\theta^{*},\lambda), \qquad s.t. \ \sum\limits_{i=1}^{m}\lambda_{i}y^{i}=0

最優的SVM模型輸出為:

\begin{aligned} \hat{y}&= \left\{ \begin{aligned} &+1, &\hat{x}(\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}x^{i})^{T}\ge+1\\ &-1, &\hat{x}(\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}x^{i})^{T}\le-1 \\ \end{aligned} \right. \\ &= \left\{ \begin{aligned} &+1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\ge+1\\ &-1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\le+1\\ \end{aligned} \right. \end{aligned}

其中\hat{x}表示待預測的樣本,\hat{y}表示模型對該樣本的預測值。回顧一下拉格朗日函數:

max \ L(\lambda)=\frac{1}{2}||\theta^{*}||_{2}^{2}-\sum_{i=1}^{m}\lambda_{i}(y^{i}\cdot{}x^{i}{\theta^{*}}^{T}-1), \qquad s.t. \ \lambda_{i}\ge0

注意到,如果某樣本x^{i}不是支持向量,那么有y^{i}\cdot{}x^{i}\theta^{T}-1\gt0,為了最大化拉格朗日函數,必定有\lambda_{i}^{*}=0,即非支持向量對應的\lambda^{*}均為0,從理論上說明了SVM的決策邊界只跟支持向量有關。

核函數

以上討論都是基于數據集線性可分的假設下,如果數據集在原始維度下線性不可分怎么辦?最簡單的辦法就是為數據集增加高維度特征。假設現在有一個二維數據集:

X= \left[ \begin{matrix} x_{1}^{(1)}&x_{2}^{(1)} \\ x_{1}^{(2)}&x_{2}^{(2)} \\ \vdots \\ x_{1}^{(m)}&x_{2}^{(m)} \\ \end{matrix} \right]

此數據集二維平面上線性不可分,但是在經一個變換函數\phi(x)作用下生成的新數據集是線性可分的:

\phi(x_{1},x_{2})=(x_{1}^2,\sqrt{2}x_{1}x_{2},x_{2}^2)

對于升維后的新數據集\phi(X)?,SVM所做的計算變成了:

\begin{aligned} pred&=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle\phi(\hat{x}),\phi(x^{(i)})\rangle \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle(\hat{x}_{1}^2,\sqrt{2}\hat{x}_{1}\hat{x}_{2},\hat{x}_{2}^2),({x_{1}^{(i)}}^2,\sqrt{2}x_{1}^{(i)}x_{2}^{(i)},{x_{2}^{(i)}}^2)\rangle \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}(\hat{x}_{1}^{2}{x_{1}^{(i)}}^{2}+2\hat{x}_{1}x_{1}^{(i)}\hat{x}_{2}x_{2}^{(i)}+\hat{x}_{2}^{2}{x_{2}^{(i)}}^{2}) \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}(\hat{x}_{1}x_{1}^{(i)}+\hat{x}_{2}x_{2}^{(i)})^{2} \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle(\hat{x}_{1},\hat{x}_{2}),(x_{1}^{(1)},x_{2}^{(2)})\rangle^{2} \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle\hat{x},x^{(i)}\rangle^{2} \end{aligned}

通過上面的變換,不難看出,在將數據集升維之后,SVM訓練、預測時的計算其實就可以轉化為原始特征的計算,那么何必要對數據集進行升維操作呢?

以上述數據集為例,選取一個函數\kappa(x_{1},x_{2})=\langle{x_{1}},{x_{2}}\rangle^{2},用它來代替SVM的內積計算:

\hat{y}=\left\{ \begin{aligned} &+1, &\sum_{i=1}^{m}\lambda_{i}y^{i}\kappa(\hat{x},x^{i})\ge+1\\ &-1, &\sum_{i=1}^{m}\lambda_{i}y^{i}\kappa(\hat{x},x^{i})\ge+1\\ \end{aligned} \right.

這樣一來,這個SVM模型的訓練、預測過程就等同于在高維空間進行,即達到了線性劃分數據集的目的,也沒有增加復雜的運算,其中\kappa(x_{1},x_{2})被稱為核函數(kernel function),這種方法被稱為核技巧(kernel trick)。

現實任務中,一般是不知道要對數據應用怎樣的升維函數\phi(x)才能使得數據集線性可分,那么自然就難以求得計算高維空間的核函數\kappa(\cdot,\cdot),甚至不知道某函數是否能被用作核函數。

簡單來說,一個函數要能被當做核函數,需要滿足Mercer's condition,即對稱函數\kappa(\cdot,\cdot)的核矩陣必須滿足恒為半正定矩陣。

常用的核函數有如下幾種:

核函數 表達式 說明
linear \kappa(x,y)={\langle}x,y{\rangle} 計算原始空間的內積
polynomial \kappa(x,y)=(\gamma{\langle}x,y{\rangle}+c)^7t5xgn9 計算d維空間的內積
Radial Basis Function \kappa(x,y)=exp(-\gamma||x-y||^{2}) -
sigmoid tanh(\gamma{\langle}x,y{\rangle}+c) -

軟間隔SVM

注意:軟間隔相當于SVM的正則化

到目前為止,以上討論都是假設SVM在原始空間或者高維空間將數據集完全線性分割開來,但是將數據完美的線性分開是否會產生或擬合?由此引出軟間隔SVM。先前討論的SVM約束條件為:

y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1

這表示的是所有樣本都在該類對應的支持向量的外側,那么,現在允許一定數量的樣本不在外側,而在內側,需要滿足的條件變為:

y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1-\xi_{i}

其中\xi為松弛變量。顯然,這個變量不能過大,否則約束就無意義了,需要對它進行限制,將其加入到最小化目標函數中,原SVM的優化問題就變成了:

\begin{aligned} min \ \frac{1}{2}||\theta||_{2}+C\sum_{i=1}^{m}\xi_{i}, \qquad s.t.& \ y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1-\xi_{i},i=1,...m \\ & \ \xi_{i}\ge0,i=1,...m \\ \end{aligned}

其中C為權衡系數,其值越大對松弛變量的約束越大。此時的拉格朗日函數變為:

\begin{aligned} \max\limits_{\lambda,\gamma}\ \min\limits_{\theta,\xi} L(\theta,\xi,\lambda,\gamma)&=\frac{1}{2}||\theta||_{2}^{2}+C\sum\limits_{i=1}^{m}\xi_{i}-\sum_{i=1}^{m}\lambda_{i}(y^{i}\cdot{}x^{i}\theta^{T}+y^{i}\theta_{0}-1+\xi_{i})-\sum_{i=1}^{m}\gamma_{i}\xi_{i} \end{aligned}

\frac{\partial{L}}{\partial{\theta}}=\frac{\partial{L}}{\partial{\theta_{0}}}=\frac{\partial{L}}{\partial{\xi_{i}}}=0得:

\begin{aligned} \theta^{*}&=\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i} \\ -\sum\limits_{i=1}^{m}\lambda_{i}y^{i}&=0 \\ C&=\lambda_{i}+\gamma_{i} \\ \end{aligned}

將最優\theta^{*}帶入得:

\begin{aligned} L(\lambda,\xi)&=\frac{1}{2}||\theta^{*}||_{2}^{2}+\lambda_{i}\sum_{i=1}^{m}\xi_{i}+\gamma_{i}\sum_{i=1}^{m}\xi_{i}-\sum_{i=1}^{m}\lambda_{i}y^{i}x^{x}{\theta^{*}}^{T}+\sum_{i=1}^{m}\lambda_{i}-\sum_{i=1}^{m}\lambda_{i}\xi_{i}-\sum_{i=1}^{m}\gamma_{i}\xi_{i} \\ &=\frac{1}{2}\theta^{*}{\theta^{*}}^{T}-(\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i})\cdot{\theta^{*}}^{T}+\sum_{i=1}^{m}\lambda_{i} \\ &=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}y^{i}y^{j}x^{i}{x^{j}}^{T} \end{aligned}

可以看到需要最大化的目標函數是一樣的,只不過多了一個約束項C=\lambda_{i}+\xi_{i},完整寫出來如下所示:

\begin{aligned} \max\limits_{\lambda}\ L(\lambda)&=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}y^{i}y^{j}x^{i}{x^{j}}^{T} \\ s.t. \ & 0\le\lambda_{i}\le{C}, \ \sum\limits\lambda_{i}y^{i}=0 \end{aligned}

SVM的具體優化算法請參閱SMO一章,實現指導也在那一章。這里只放出完整代碼:完整代碼

SVR

(待補充)

SVM V.S. LR

SVM與LR是經常被用來比較的一對模型。

首先,從數學形式上來作對比,然后再去探究背后的根源。對于機器學習模型而言,最核心的部分就是其損失函數或目標函數,該函數決定了算法的目的與優化方法。

LR的損失函數為:

\begin{aligned} Loss_{LR}&=\sum_{i}[y\ln\frac{1}{\hat{y}}+(1-y)\ln\frac{1}{1-\hat{y}}] \\ &=\sum_{i}[-y*x\theta^{T}+ln(1+e^{x\theta^{T}})] \\ \end{aligned}

SVM的損失函數為:

\begin{aligned} Loss_{SVM}&=\frac{1}{2}||\theta||_{2}+\sum\limits_{i}max(0,1-y\hat{y}) \\ &=\frac{1}{2}||\theta||_{2}+\sum\limits_{i}max(0,1-y(x\theta+\theta_{0})) \\ \end{aligned}

不難發現,SVM中的max(0,1-y\hat{y})項,在y\hat{y}{\ge}1時為0,即SVM實際上對正確分類的樣本是不計入loss的。而反觀LR,不難發現LR在數學形式上的loss是無法取得0值的,這是因為sigmoid函數的性質就不允許模型精確地輸出{0,1}值,理論上只有在無窮遠處才能取得。可以假設一個存在離群點的場景,若SVM對該離群點已能正確分類,那么在訓練時就不會再將該點考慮進去,而LR則會收該離群點的影響。所以可以看出,SVM對離群點的抗性要高于LR。而且,LR的決策邊界會受兩個類別樣本分布的影響,而SVM則不會,其決策邊界只受支持向量的影響。

同時還在損失函數中發現,SVM自帶L2正則項,LR則不帶。

然后,兩者的出發點就不同。LR是從概率的思想出發,使用一個線性回歸去擬合正反事件的對數機率;而SVM的思想是啟發性的,直接學習一個最大間隔超平面去將兩個類別分開。

然后再看兩者的輸出函數,LR的預測函數:

\begin{aligned} \hat{y}_{LR}&=\frac{1}{1+e^{-x\theta^{T}}} \\ \end{aligned}

SVM的預測函數:

\begin{aligned} \hat{y}_{SVM}&= \left\{ \begin{aligned} &+1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\ge+1\\ &-1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\le+1\\ \end{aligned} \right. \end{aligned}

由于SMV的預測函數中存在兩訓練樣本的內積項,所以核技巧能很自然而然的與SVM相結合;除了這個原因之外,SVM中的拉格朗日參數\lambda,非支持向量的該參數值是為0的,所以在計算決策邊界時的計算量并不高,這也是核技巧常用于SVM的原因之一。

最后,兩者的優化復雜度不一樣,LR由于模型本身簡單,可以使用迭代的梯度下降法進行優化;而SVM目前成熟的優化方法就是SMO算法。另外,由于SVM使用了“距離”的概念,所以對數據做歸一化處理是有好處的,還由于維度詛咒的原因,在高維空間下距離的概念會變得十分抽象,所以在高維情況下,會更傾向于實用LR。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容