吳恩達機器學習——異常檢測

本章內(nèi)容:
· 15.1 問題的動機
· 15.2 高斯分布
· 15.3 算法
· 15.4 開發(fā)和評價一個異常檢測系統(tǒng)
· 15.5 異常檢測與監(jiān)督學習對比
· 15.6 選擇特征
· 15.7 多元高斯分布(選修)
· 15.8 使用多元高斯分布進行異常檢測(選修)

內(nèi)容簡介:

異常檢測(Anomaly detection)問題是機器學習算法的一個常見應用措近,它雖然主要用于非監(jiān)督學習問題,但從某些角度看女淑,它又類似于一些監(jiān)督學習問題————主要由positive examples(陽性樣本 or y=1)的數(shù)量來決定的(這點在本次分享中會細說)瞭郑;通過這次學習,我感覺異常檢測更像是“雞蛋外挑骨頭”————即通過對原有的大量雞蛋進行學習來預測或判斷新進的雞蛋中是否出現(xiàn)了異常的“骨頭”鸭你。

15.1 問題的動機

異常檢測定義:

給定數(shù)據(jù)集x^1,x^2,…x^m,假定數(shù)據(jù)集是正常的屈张,通過高斯分布建立一個模型 p(x),通過所構建的模型场绿,根據(jù)新數(shù)據(jù)x_test的位置告訴我們其屬于該組數(shù)據(jù)的可能性 p(x)爷光。

上圖中,在藍色圈內(nèi)的數(shù)據(jù)屬于該組數(shù)據(jù)的可能性較高,而越是偏遠的數(shù)據(jù)秉犹,其屬于該組數(shù)據(jù)的可能性就越低也搓。

這種方法稱為密度估計驱负,表達如下:
if p(x)\begin{cases} <\epsilon\Longrightarrow anomaly \\ >=\epsilon\Longrightarrow normal\\ \end{cases}

異常檢測實例:

異常檢測主要用來識別欺騙拼缝。例如在線采集而來的有關用戶的數(shù)據(jù)废酷,一個特征向量中可能會包含如:用戶多久登錄一次,訪問過的頁面凿渊,在論壇發(fā)布的帖子數(shù)量,甚至是打字速度等桐猬。嘗試根據(jù)這些特征構建一個模型躺涝,可以用這個模型來識別那些不符合該模式的用戶。

還有就是應用在工業(yè)制造領域。比如某個制造飛機引擎的公司癌佩,從飛機引擎提取出一系列的特征值,并且訓練出一個模型。當新制造出來的引擎符合這個模型時沐兰,就可認為是良品,如果偏離這個模型較遠時朗涩,就可以認為可能有缺陷,需要進一步的檢測旨枯。

異常檢測還可以應用在檢測一個數(shù)據(jù)中心狸膏,特征可能包含:內(nèi)存使用情況,被訪問的磁盤數(shù)量贤旷,CPU的負載广料,網(wǎng)絡的通信量等。根據(jù)這些特征可以構建一個模型幼驶,用來判斷某些計算機是不是有可能出錯了艾杏。

15.2 高斯分布

通常如果我們認為變量x
符合高斯分布 x\sim N(\mu,\sigma^2)

則其概率密度函數(shù)為:
p(x,\mu,\sigma^2) = \frac{1} { \sqrt{2\pi}\sigma} * exp(- \frac{(x-\mu)^2}{2\sigma^2})

我們可以利用已有的數(shù)據(jù)來預測總體中的\mu和\sigma^2

的計算方法如下:
\mu = \frac{1} { m} \sum_{i=1}^{m}x^i

\sigma^2 = \frac{1} { m} \sum_{i=1}^{m}(x^i-\mu^2)

高斯分布樣例:

注:機器學習中對于方差我們通常只除以m而非統(tǒng)計學中的(m-1)。這里順便提一下盅藻,在實際使用中购桑,到底是選擇使用1/m
還是1/(m-1)其實區(qū)別很小,只要你有一個還算大的訓練集氏淑,在機器學習領域大部分人更習慣使用1/m這個版本的公式勃蜘。這兩個版本的公式在理論特性和數(shù)學特性上稍有不同,但是在實際使用中假残,他們的區(qū)別甚小缭贡,幾乎可以忽略不計。

15.3 算法

前面在講異常檢測時有提到用高斯分布來構建模型p(x)辉懒,這里我們簡單說一下算法:

異常檢測算法:

在異常檢測問題中阳惹,比如用戶反常問題、飛機引擎檢測問題眶俩,我們一般會先選擇一些x^i特征莹汤,當出現(xiàn)異常樣本時,它們的值會異常的非常大或者非常械哂 (在圖像上表示就是在高斯分布的最左側或最右側)体啰,但是一般來說,還是選擇那些能夠用來描述我們所收集的數(shù)據(jù)集一般特性的特征嗽仪。

然后對于給定的數(shù)據(jù)集x^1,x^2,…x^m(注意這里都是無標簽的數(shù)據(jù)),我們要針對每一個特征計算\mu和\sigma^2$d的估計值荒勇。

\mu _j= \frac{1} { m} \sum_{i=1}^{m}x^i_j
(這一步我們可以將\mu _j看成\begin{bmatrix} {\mu _{1}}\\ {\mu _{2}}\\ {\vdots}\\ {\mu_{n}}\\ \end{bmatrix},通過向量的思想我們更容易理解。)

\sigma^2_j = \frac{1} { m} \sum_{i=1}^{m}(x^i_j-\mu^2_j)

一旦我們獲得了平均值和方差的估計值闻坚,給定新的一個訓練實例沽翔,根據(jù)模型計算p(x):

p(x) = \prod_{j=1}^n p(x_j;\mu_j,\sigma^2_j)= \prod_{j=1}^n \frac{1} { \sqrt{2\pi}\sigma_j} * exp(- \frac{(x_j-\mu_j)^2}{2\sigma^2_j})

然后我們選擇一個\epsilon,將p(x)=\epsilon作為我們的判定邊界窿凤,當p(x)>\epsilon時預測數(shù)據(jù)為正常數(shù)據(jù)仅偎,否則為異常。

15.4 開發(fā)和評價一個異常檢測系統(tǒng)

在這一部分我們會簡單了解如何開發(fā)一個異常檢測的應用來解決實際的問題雳殊,不過我們會將重點放到如何評估一個異常檢測算法橘沥。

在之前的學習中,我們已經(jīng)看到了實數(shù)評估的重要性夯秃,它的主要思想時當我們?yōu)槟硞€應用開發(fā)一個學習算法時座咆,我們需要進行一系列的選擇痢艺,比如選擇使用什么特征等等————如果我們由某種方法,通過放回一個實數(shù)來評估我們的算法介陶,那么就會更容易對這些選擇做出決定堤舒。

比如現(xiàn)在有一個新的特征,我們正在決定該不該納入這個特征哺呜,如果我們分別在納入該特征和不納入該特征情況下運行算法舌缤,然后算法返回一個數(shù)字來告訴我們這個特征對算法的影響是好是壞,這樣的話某残,我們就能更簡單地決定要不要納入這個特征国撵。

為了能夠更迅速地開發(fā)出像上面所說的一個算法評估系統(tǒng)來評估一個異常檢測系統(tǒng),我們可以假設有一些帶標簽的數(shù)據(jù)(y = 0 if normal , y = 1 if anomalous)玻墅,到目前為止我們把異常檢測看成一個無監(jiān)督學習問題是因為用的是無標簽數(shù)據(jù)介牙,但是如果我們有一些帶標簽的數(shù)據(jù)來指明哪些是異常樣本哪些是正常樣本,這就是我們認為能過評估異常檢測的標準方法椭豫。
那么異常檢測算法的開發(fā)過程和評估方法如下:

1、我們先假設有一些訓練集:
Training set: $x1,x2,…,x^m (assume normal examples/not anomalous)
我們把訓練集看作是無標簽的旨指,即這是一個很大的正常樣本(無異常樣本)的集合赏酥。(通常我們把它看作是無異常樣本,當然如果不小心溜進了一些異常樣本也是沒關系的)

2谆构、接下來我們會定義一個交叉驗證集和測試集:
Cross validation set :(x^1_{cv}, y^1_{cv}),……,(x^m_{cv},y^m_{cv})
Test set :(x^1_{test}, y^1_{test}),……,(x^m_{test},y^m_{test})
具體來說裸扶,對于交叉驗證集和測試集,我們假設在交叉驗證集和測試集中包含一些已知的異常樣本(即一些標簽為 y = 1 的樣本)搬素。

現(xiàn)在我們還是拿飛機引擎的例子來做說明:

1呵晨、假設我們現(xiàn)在有:
10000 good (normal) engines
20 flawed engines (anomalous)
對于典型的異常檢測應用來說,異常樣本的數(shù)量熬尺,即 y = 1的樣本大概20~50個摸屠,而且正常樣本的數(shù)量正常來說還會比我們這個例子要大得多。

2粱哼、在有了這些數(shù)據(jù)集后季二,我們把這些數(shù)據(jù)分離到訓練集、交叉驗證集和測試集中:
Training set: 6000 good engines
Cross validation set : 2000 good engines(y=0),10 an0malous(y=1)
Test set : 2000 good engines(y=0),10 an0malous(y=1)

一般我們都會按照60%揭措,20%胯舷,20%的比例來分離數(shù)據(jù),認為CV绊含、TEST dataset是兩個完全不同的數(shù)據(jù)集————把同樣的數(shù)據(jù)同時應用到CV桑嘶、TEST dataset里面在機器學習中是不好的!

3躬充、在給出上面的三個數(shù)據(jù)集后逃顶,我們就可以推導和評估算法了:
Firstly讨便,F(xiàn)it model p(x) on training set {x^1,…,x^m}(這些雖然是無標簽數(shù)據(jù),但實際上我們會把他們看成已知的正常樣本)

Then 口蝠,On a cross validation/test example x ,predict(所以我們也可以將異常檢測算法看成是對交叉驗證集 or 測試集中的 y 標簽進行預測)


然后器钟,使用交叉驗證數(shù)據(jù)集來計算查準率,找回率以及F_1-score來做出評估:

上面我們提到測試集是帶標簽的妙蔗,這一點和監(jiān)督學習很像傲霸,即算法是對這些標簽做出預測,通過預測成功次數(shù)來評估眉反,但是和監(jiān)督學習不一樣的時候昙啄,監(jiān)督學習的標簽會很傾斜(即y = 0更多),那么分類正確率就不是一個很好的評價指標寸五。

有一點要提的是梳凛,我們會通過使用交叉驗證數(shù)據(jù)集來選擇合適的\epsilon(用于決定什么時候將一個樣本當作使異常樣本的閾值),來使F_1-Score 的值盡可能的大(或者選擇在其它方面表現(xiàn)比較好的)

補充指標解釋:
TruePosition: 真陽性梳杏,即真實結果是真韧拒,算法的預測結果是真
FalsePositive: 假陽性,即真實結果是假十性,算法的預測結果是真
FalseNegative: 假陰性叛溢,即真實結果是真,算法的預測結果是假

15.5 異常檢測與監(jiān)督學習對比

之前我們構建的異常檢測系統(tǒng)也使用了帶標記的數(shù)據(jù)劲适,與監(jiān)督學習有些相似楷掉,下面的對比有助于選擇采用監(jiān)督學習還是異常檢測:
兩者比較:

異常檢測:
1、非常少量的正向類(異常數(shù)據(jù) y = 1),大量的負向類(y = 0)
2霞势、許多不同種類的異常烹植,非常難。根據(jù)非常少量的正向類數(shù)據(jù)來訓練算法
3愕贡、未來遇到的異巢莸瘢可能與已掌握的異常、非常的不同
4固以、例如: 欺詐行為檢測 生產(chǎn)(例如飛機引擎)檢測數(shù)據(jù)中心的計算機運行狀況

在異常檢測中擬合所有高斯參數(shù)時促绵,通常只需要陰性樣本就足夠了。而且對于“2嘴纺、”這種情況來說败晴,更有可能的是,會對陰性數(shù)據(jù)用高斯模型P(X)來構建模型栽渴,而不是去對y = 1(陽性樣本)建模尖坤,因為明天的異常可能與今天我們所見的都不一樣闲擦。

監(jiān)督學習:
1慢味、同時有大量的正向類和負向類
2场梆、有足夠多的正向類實例,足夠用于訓練 算法纯路,未來遇到的正向類實例可能與訓練集中的非常近似
3或油、無
4、例如:郵件過濾器 天氣預報 腫瘤分類

總結:一般來說驰唬,異常檢測與監(jiān)督學習的區(qū)別是顶岸,當positive examples的數(shù)量足夠大時,達到監(jiān)督學習能夠自己學習出所需要的各種特征叫编,會去用監(jiān)督學習辖佣。

15.6 選擇特征

對于異常檢測算法,我們使用的特征是至關重要的搓逾,下面談談如何選擇特征:
異常檢測假設特征符合高斯分布卷谈,如果數(shù)據(jù)的分布不是高斯分布,異常檢測算法也能夠工作霞篡,但是最好還是將數(shù)據(jù)轉換成高斯分布世蔗,例如使用對數(shù)函數(shù):x = log(x+c),其中c為非負常數(shù);或者x=x^c,c為0-1之間的一個分數(shù)等方法朗兵。

誤差分析:
一個常見的問題是一些異常的數(shù)據(jù)可能也會有較高的p(x)值污淋,因而被算法認為是正常的。這種情況下誤差分析能夠幫助我們矛市,我們可以分析那些被算法錯誤預測為正常的數(shù)據(jù)芙沥,觀察能否找出一些問題诲祸。我們可能能從問題中發(fā)現(xiàn)我們需要增加一些新的特征浊吏,增加這些新特征后獲得的新算法能夠幫助我們更好地進行異常檢測。

異常檢測誤差分析:


我們通尘嚷龋可以通過將一些相關的特征進行組合找田,來獲得一些新的更好的特征(異常數(shù)據(jù)的該特征值異常地大或小)着憨,例如墩衙,在檢測數(shù)據(jù)中心的計算機狀況的例子中,我們可以用CPU負載與網(wǎng)絡通信量的比例作為一個新的特征甲抖,如果該值異常地大漆改,便有可能意味著該服務器是陷入了一些問題中。

15.7多元高斯分布(選修)

假使我們有兩個相關的特征准谚,而且這兩個特征的值域范圍比較寬挫剑,這種情況下,一般的高斯分布模型可能不能很好地識別異常數(shù)據(jù)柱衔。其原因在于樊破,一般的高斯分布模型嘗試的是去同時抓住兩個特征的偏差愉棱,因此創(chuàng)造出一個比較大的判定邊界。
下圖中是兩個相關特征哲戚,洋紅色的線(根據(jù)ε的不同其范圍可大可斜蓟)是一般的高斯分布模型獲得的判定邊界,很明顯綠色的X所代表的數(shù)據(jù)點很可能是異常值顺少,但是其p(x)值卻仍然在正常范圍內(nèi)朋其。多元高斯分布將創(chuàng)建像圖中藍色曲線所示的判定邊界。


在一般的高斯分布模型中祈纯,我們計算p(x)的方法是: 通過分別計算每個特征對應的幾率然后將其累乘起來令宿,在多元高斯分布模型中,我們將構建特征的協(xié)方差矩陣腕窥,用所有的特征一起來計算p(x)粒没。

我們首先計算所有特征的平均值,然后再計算協(xié)方差矩陣:
p(x) = \prod_{j=1}^n p(x_j;\mu_j,\sigma^2_j)= \prod_{j=1}^n \frac{1} { \sqrt{2\pi}\sigma_j} * exp(- \frac{(x_j-\mu_j)^2}{2\sigma^2_j})

\mu = \frac{1} { m} \sum_{i=1}^{m}x^i

\Sigma= \frac{1} { m} \sum_{i=1}^{m}(x^i-\mu)(x^i-\mu)^T=\frac{1} { m}(X^i-\mu)(X^i-\mu)^T

其中\mu是一個向量簇爆,其每一個單元都是原特征矩陣中一行數(shù)據(jù)的均值癞松。最后我們計算多元高斯分布的:p(x)= \frac{1} { \sqrt{2\pi}^{n/2}|\Sigma|^{1/2}} * exp(- 1/2{(x_j-\mu)^T}{(x-\mu)}{\Sigma^{-1}})

其中:|\Sigma是定矩陣,在Octave中用det(sigma)計算
\Sigma1是逆矩陣入蛆,下面我們來看看協(xié)方差矩陣是如何影響模型的:


上圖是5個不同的模型响蓉,從左往右依次分析:

  1. 是一個一般的高斯分布模型
  2. 通過協(xié)方差矩陣,令特征1擁有較小的偏差哨毁,同時保持特征2的偏差
  3. 通過協(xié)方差矩陣枫甲,令特征2擁有較大的偏差,同時保持特征1的偏差
  4. 通過協(xié)方差矩陣扼褪,在不改變兩個特征的原有偏差的基礎上想幻,增加兩者之間的正相關性
  5. 通過協(xié)方差矩陣,在不改變兩個特征的原有偏差的基礎上话浇,增加兩者之間的負相關性

多元高斯分布模型與原高斯分布模型的關系:
可以證明的是脏毯,原本的高斯分布模型是多元高斯分布模型的一個子集,即像上圖中前3個例子所示幔崖,如果協(xié)方差矩陣只在對角線的單位上有非零的值時食店,即為原本的高斯分布模型了。

原高斯分布模型和多元高斯分布模型的比較:

原高斯分布模型

1赏寇、不能捕捉特征之間的相關性
但可以通過將特征進行組合的方法來解決

2吉嫩、計算代價低,能適應大規(guī)模的特征

多元高斯分布模型

1嗅定、自動捕捉特征之間的相關性

2自娩、計算代價較高 訓練集較小時也同樣適用

3、必須要有m>n 露戒,不然的話協(xié)方差矩陣 不可逆的椒功,通常需要m>10n ,另外特征冗余也會導致協(xié)方差矩陣不可逆

原高斯分布模型被廣泛使用著捶箱,如果特征之間在某種程度上存在相互關聯(lián)的情況,我們可以通過構造新新特征的方法來捕捉這些相關性动漾。
如果訓練集不是太大丁屎,并且沒有太多的特征,我們可以使用多元高斯分布模型旱眯。

15.8 使用多元高斯分布進行異常檢測(選修)

關于多元高斯分布晨川,看到的一些建立的各種分布模型,當你改變參數(shù)删豺,\mu\Sigma共虑。在這一節(jié)中,我們不妨用這些想法呀页,并應用它們制定一個不同的異常檢測算法妈拌。

回顧一下多元高斯分布和多元正態(tài)分布:


分布有兩個參數(shù),\mu\Sigma蓬蝶。其中\mu這一個n維向量和\Sigma的協(xié)方差矩陣尘分,是一種n*n的矩陣。而這里的公式x的概率丸氛,如按\mu和參數(shù)化\Sigma,和你的變量\mu\Sigma,我們可以得到一個范圍的不同分布一樣培愁,我們知道的,這些都是三個樣本缓窜。

因此定续,讓我們談談參數(shù)擬合或參數(shù)估計問題:
我有一組樣本x^1,x^2,…,x^m是一個n維向量,我想我的樣本來自一個多元高斯分布。我如何嘗試估計我的參數(shù)\mu和\Sigma$以及標準公式禾锤?

估計他們是你設置\mu 是你的訓練樣本的平均值私股。
\mu = \frac{1} { m} \sum_{i=1}^{m}x^i

并設置\Sigma:\Sigma= \frac{1} { m} \sum_{i=1}^{m}(x^i-\mu)(x^i-\mu)^T=\frac{1} { m}(X^i-\mu)(X^i-\mu)^T

這其實只是當我們使用PCA算法時候,有\Sigma時寫出來时肿。所以你只需插入上述兩個公式庇茫,這會給你你估計的參數(shù)\mu和你估計的參數(shù)\Sigma港粱。所以螃成,這里給出的數(shù)據(jù)集是你如何估計\mu\Sigma.讓我們以這種方法而只需將其插入到異常檢測算法。那么查坪,我們?nèi)绾伟阉羞@一切共同開發(fā)一個異常檢測算法寸宏?

首先,我們把我們的訓練集偿曙,和我們的擬合模型氮凝,我們計算p(x),要知道望忆,設定\mu和描述的一樣\Sigma罩阵。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竿秆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稿壁,更是在濱河造成了極大的恐慌幽钢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅是,死亡現(xiàn)場離奇詭異匪燕,居然都是意外死亡,警方通過查閱死者的電腦和手機喧笔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門帽驯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人书闸,你說我怎么就攤上這事尼变。” “怎么了浆劲?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵享甸,是天一觀的道長。 經(jīng)常有香客問我梳侨,道長蛉威,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任走哺,我火速辦了婚禮蚯嫌,結果婚禮上,老公的妹妹穿的比我還像新娘丙躏。我一直安慰自己择示,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布晒旅。 她就那樣靜靜地躺著栅盲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪废恋。 梳的紋絲不亂的頭發(fā)上谈秫,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音鱼鼓,去河邊找鬼拟烫。 笑死,一個胖子當著我的面吹牛迄本,可吹牛的內(nèi)容都是我干的硕淑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼置媳!你這毒婦竟也來了于樟?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拇囊,失蹤者是張志新(化名)和其女友劉穎隔披,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寂拆,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奢米,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纠永。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鬓长。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尝江,靈堂內(nèi)的尸體忽然破棺而出涉波,到底是詐尸還是另有隱情,我是刑警寧澤炭序,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布啤覆,位于F島的核電站,受9級特大地震影響惭聂,放射性物質發(fā)生泄漏窗声。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一辜纲、第九天 我趴在偏房一處隱蔽的房頂上張望笨觅。 院中可真熱鬧,春花似錦耕腾、人聲如沸见剩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苍苞。三九已至,卻和暖如春狼纬,著一層夾襖步出監(jiān)牢的瞬間羹呵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工畸颅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留担巩,地道東北人方援。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓没炒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子送火,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容