Linear Regression模型簡介

一贿堰、概述

1、背景
  • 最近幾十年啡彬,人工智能經(jīng)歷了一輪又一輪的高潮和低谷羹与;今天,機(jī)器學(xué)習(xí)庶灿、深度學(xué)習(xí)再一次被賦予強(qiáng)人工智能的歷史使命纵搁;

  • 機(jī)器學(xué)習(xí)作為人工智能中最重要的一環(huán),天生就帶有數(shù)學(xué)家和工程師的基因往踢,了解機(jī)器學(xué)習(xí)的常見模型和算法還是很有意義的腾誉。

  • 本文結(jié)合自己的學(xué)習(xí)情況介紹對線性回歸模型的認(rèn)識(如文章有不妥之處,望不吝賜教)

2峻呕、介紹
  • 機(jī)器學(xué)習(xí)根據(jù)訓(xùn)練數(shù)據(jù)方法的不同妄辩,可以分為監(jiān)督學(xué)習(xí)半監(jiān)督學(xué)習(xí)山上、無監(jiān)督學(xué)習(xí)強(qiáng)化學(xué)習(xí)。其中監(jiān)督學(xué)習(xí)的主要任務(wù)是分類回歸

  • 分類回歸問題都需要根據(jù)訓(xùn)練樣本找到一個實(shí)數(shù)值函數(shù)g(x)英支;然后回歸根據(jù)g(x)佩憾,可以推導(dǎo)出給定新樣本的輸出值,而分類是根據(jù)g(x)干花,推導(dǎo)出新樣本的類別(如0或1)妄帘。

  • 在現(xiàn)實(shí)世界中普遍存在變量之間的關(guān)系,關(guān)系大概分兩種:確定的函數(shù)關(guān)系統(tǒng)計相關(guān)關(guān)系(非確定但又相互依賴的關(guān)系)池凄;回歸分析就是研究變量之間統(tǒng)計相關(guān)關(guān)系的方法抡驼。

  • 唯物辯證法中認(rèn)為:事物之間的聯(lián)系是普遍存在的、相互影響肿仑、相互作用和相互制約的致盟;佛家認(rèn)為:前世因,今世果尤慰;數(shù)學(xué)家認(rèn)為: y = a_1x_1 + a_2x_2 + a_3x_3 + {\cdots}+ b

  • 回歸問題中馏锡,按照自變量和變量之間的關(guān)系類型,分為線性回歸分析和非線性回歸分析(如對數(shù)模型:f(x) = \frac{1}{1+ e^{-x}})伟端,本文介紹對象是線性回歸(Linear Regression)模型杯道。

3、線性回歸模型

主要介紹:回歸方程责蝠、損失函數(shù)党巾、損失函數(shù)求解方法萎庭、過擬合和欠擬合、多項(xiàng)式

二齿拂、回歸方程

1驳规、概述

在回歸分析中,只包括一個自變量和一個因變量创肥,且兩種的關(guān)系可以使用一條直線近似表示达舒,稱為一元線性回歸分析。如果有兩個及以上的自變量叹侄,且自變量和因變量是線性關(guān)系巩搏,稱為多元線性回歸分析

  • 一元線性回歸方程y = ax + b

  • 多元線性回歸方程y = a_1x_1 + a_2x_2 + a_3x_3 + {\cdots} + b

2趾代、建立回歸方程

h_θ(x) = θ_0 + θ_1x_1+θ_2x_2+{\cdots}+θ_nx_n = \vec{θ}^T\vec{X}

其中贯底,\vec{θ} = \begin{bmatrix} θ_0 \\ θ_1 \\ θ_2 \\ {\cdots} \\ θ_n \end{bmatrix} \,\,\,\,\,\,\vec{X} = \begin{bmatrix} 1 \\ x_1 \\ x_2 \\ {\cdots} \\ x_n \end{bmatrix}

說明θ_0 , θ_1,θ_2,{\cdots}θ_n 是回歸系數(shù),我們的目標(biāo)是求解出它們撒强,然后代入回歸方程禽捆,來預(yù)測新數(shù)據(jù)的輸出值。

二飘哨、損失函數(shù) (Loss Function)

1胚想、公式

確立了回歸方程后,我們使用均方誤差(Mean Square Error,MSE)來評估真實(shí)值 與預(yù)測值之間的差異芽隆,公式如下:

J(θ) = \frac {1}{2n} \sum_{i=1}^n(h_θ(x^i) - y^i)^2,\,\,\text{n為樣本數(shù)}

其矩陣表達(dá)式為

J(θ) = \frac {1}{2n}(Xθ - Y)^T(Xθ - Y) ,\,\,\text{n為樣本數(shù)}

說明:以上就是線性回歸的損失函數(shù)浊服。下面介紹公式的推導(dǎo)。

2胚吁、解釋
  • 假設(shè)特征的預(yù)測值和真實(shí)值的誤差是\xi^{(i)} ,那么預(yù)測值θ^T x^{(i)}和真實(shí)值y^{(i)}滿足如下公式:

y^{(i)} = θ^T x^{(i)} + \xi^{(i)}\,\,\,\,\,\,\,(1)

  • 假設(shè)誤差是獨(dú)立的牙躺,隨機(jī)的,無窮大的腕扶,根據(jù)中心極限定理孽拷,誤差服從均值為\mu,方差為\sigma^2的正態(tài)分布半抱,其概率分布如下:

p(\xi^{(i)}) = \frac {1}{\sqrt{2\pi\sigma}} exp(-\frac{{\xi^{(i)}}^2}{2\sigma^2})\,\,\,\,\,\,\,(2)

  • 由公式(1)可知:\xi^{(i)} = y^{(i)} - θ^T x^{(i)}脓恕,代入公式(2),得到一個y^{(i)}的概率公式如下:

p(y^{(i)} |x^{(i)};θ) = \frac {1}{\sqrt{2\pi} \sigma} exp(- \frac{(y^{(i)} - θ^T x^{(i)})^2}{2\sigma^2})\,\,\,\,\,\,\,(3)

  • 對應(yīng)的極大似然函數(shù)是:

L(θ) = \prod_{i=1}^np(y^{(i)} |x^{(i)};θ) = \prod_{i=1}^n\frac {1}{\sqrt{2\pi} \sigma} exp(- \frac{(y^{(i)} - θ^T x^{(i)})^2}{2\sigma^2})|x^{(i)};θ) \,\,\,\,\,\,\,(4)

  • 極大似然函數(shù)取對數(shù)窿侈,求導(dǎo)后得到θ的極大似然估計如下

\hat{θ} = \frac {1}{2} \sum_{i=1}^n(h_θ(x^i) - y^i)^2 \,\,\,\,\,\,\,(5)

說明:極大似然函數(shù)估計知道进肯,在\hat{θ} = \frac {1}{2} \sum_{i=1}^n(h_θ(x^i) - y^i)^2時,誤差最忻弈ァ江掩;為了后面計算推導(dǎo),引入歸一化的系數(shù)n, 最終得到的損失函數(shù)為:

J(θ) = \frac {1}{2n} \sum_{i=1}^n(h_θ(x^i) - y^i)^2,\,\,\text{n為樣本數(shù)}

三、損失函數(shù)求解法1:普通最小二乘法(OLS)

1环形、求解
  • 當(dāng)矩陣X可逆時策泣,可以用普通最小二乘法(OLS) ,求解出回歸系數(shù)抬吟,公式如下(使用矩陣形式):

\hat{θ} = (X^TX)^{-1}X^TY

  • 對應(yīng)的代碼實(shí)現(xiàn)如下:
 def standRegre(xMat, yMat):
  '''
  :param xMat: X矩陣
  :param yMat: y矩陣
  :return: 回歸系數(shù)矩陣
  '''

  xTx = xMat.T * xMat
  # linalg.det(xTx)計算行列式,行列式值為0.矩陣不可逆
  if linalg.det(xTx) == 0.0:
      print("This matrix is singular,cannot do inverse")
      return

  # .I用作求矩陣的逆矩陣
  ws = xTx.I * dot(xMat.T,yMat)
  return ws
  • 回歸方程對數(shù)據(jù)點(diǎn)的擬合情況如下:
效果圖.png

說明:要求矩陣X必須滿足可逆條件萨咕,否則是不可以解的。

2火本、解釋

我們知道危队,損失函數(shù)的矩陣表達(dá)式為

J(θ) = \frac {1}{2n}(Xθ - Y)^T(Xθ - Y)
擴(kuò)展后得到:
J(θ) = \frac {1}{2n}(θ^TX^TXθ - 2θ^TX^TY + YY )
對θ求偏導(dǎo),令導(dǎo)數(shù)為0钙畔,得:
\frac{\partial J(θ)}{\partial θ} = \frac {1}{2n}(2θ^TX^TX - 2X^TY) = 0
最后求解得到:
θ^T = (X^TX)^{-1}(X^TY)

四茫陆、損失函數(shù)求解法2:梯度下降(Gradient Descent)算法

1、 簡介

梯度下降算法是一種求局部最優(yōu)解的方法擎析;在數(shù)學(xué)上簿盅,函數(shù)的梯度(導(dǎo)數(shù))方向是函數(shù)值增長最快的方向,其相反方向就是下降最快的方向揍魂。

  • 首先對\vec{θ}賦值桨醋,這個值可以是隨機(jī)的,也可以是一個全零的向量现斋。

  • 改變\vec{θ}的值喜最,使得J(θ)按梯度下降的方向進(jìn)行減少。

θ = θ - \alpha \frac{\partial J(θ)}{\partial θ}, \,\,\, \alpha\text{是學(xué)習(xí)率庄蹋,步長}

???具體對θ的每個分量的求導(dǎo)公式如下:

\frac{\partial J(θ)}{\partial θ_j} = \frac{1}{n}\sum_{i=1}^n(h_θ(x^i) - y^i)x^i_j

說明:梯度下降(GD)是最小化損失函數(shù)的一種常用方法返顺,主要有批量梯度下降隨機(jī)梯度下降兩種迭代求解思路。

2蔓肯、 批量梯度下降 (Batch Gradient Descent)

repeat until convergence {
\,\,\,\,\,\,\,\,\,θ_j:= θ_j - \alpha \frac{1}{n}\sum_{i=1}^n(h_θ(x^i) - y^i)x^i_j
}

說明:每更新一個θ_j ,都要遍歷一次樣本集振乏;如果樣本的數(shù)量n很大蔗包,開銷比較大;BGD可以得到一個全局最優(yōu)解慧邮,使得損失函數(shù)的風(fēng)險最小

代碼實(shí)現(xiàn):

def bgd(rate, maxLoop, epsilon, X, Y):
    '''
    批量梯度下降法
    :param rate:  學(xué)習(xí)率
    :param maxLoop:
    :param epsilon: 收斂精度
    :param X: 樣本特征矩陣
    :param Y: 標(biāo)簽矩陣
    :return: (theta, errors, thetas), timeConsumed
    '''

    # m是樣本數(shù)调限,n是特征個數(shù)
    m, n = X.shape
    # 初始化theta,n*1維的零向量
    theta = np.zeros((n, 1))
    count = 0
    # 是否收斂
    converged = False
    error = float('inf')
    errors = []
    thetas = {}

    for j in range(n):
        thetas[j] = [theta[j, 0]]

    while count <= maxLoop:
        if (converged):
            break
        count = count + 1
        # sum = 0
        for j in range(n):
            # deriv = (X * theta - y).T * X[:, j] / m
            # print(deriv)
            deriv = np.float128(0)
            for i in range(m):
                deriv += ((X[i] * theta - Y[i]) * X[i,j])[0,0]/ m
            theta[j, 0] = theta[j, 0] - rate * deriv
            thetas[j].append(theta[j, 0])

        #誤差
        error = loss_function(theta, X, y)
        errors.append(error[0, 0])
        # 如果已經(jīng)收斂
        if (error < epsilon):
            converged = True
    return theta, errors, thetas
批量梯度下降.png
3、隨機(jī)梯度下降 (Stochastic Gradient Descent)

repeat until convergence {
?? for i=1 to n {
\,\,\,\,\,\,\,\,θ_j:= θ_j - \alpha (h_θ(x^i) - y^i)x^i_j
???}
}

說明1:在隨機(jī)梯度下降法中误澳,每更新θ_j 只需要一個樣本 (x^i,y^i)耻矮;在樣本數(shù)量巨大時,SGD的性能比較好忆谓,但是最終結(jié)果未必是全局最優(yōu)解裆装。

代碼實(shí)現(xiàn)

def sgd(rate, maxLoop, epsilon, dataMat, labelMat):
  '''
  隨機(jī)梯度下降法
  :param rate:  學(xué)習(xí)率
  :param maxLoop:
  :param epsilon: 收斂精度
  :param dataMat: 樣本特征矩陣
  :param labelMat: 標(biāo)簽矩陣
  '''
  sampleCount, featureCount = dataMat.shape
  #初始化theta,featureCount * 1維的0向量
  theta = np.zeros((featureCount,1))
  count = 0
  converged = False
  error = float('inf')
  errors = []
  thetas = {}  #字典

  for j in range(featureCount):
      thetas[j] = [theta[j,0]]

  # 迭代到最大次數(shù)結(jié)束
  while count <= maxLoop:
      if (converged):
          break
      count = count + 1
      errors.append(float('inf'))
      # 獲取樣本
      for i in range(sampleCount):
          if (converged):
              break
          #計算實(shí)際和預(yù)測的誤差
          diff = labelMat[i,0] - regression_function(theta,dataMat[i].T)
          # 通過第i個樣本來優(yōu)化theta
          for j in range(featureCount):
              theta[j, 0] = theta[j, 0] + rate * diff * dataMat[i,j]
              thetas[j].append(theta[j, 0])
          error = loss_function(theta, dataMat, labelMat)
          errors[-1] = error[0, 0]
          # 如果已經(jīng)收斂
          if (error < epsilon):
              converged = True
   return theta, errors, thetas
隨機(jī)梯度下降.png
4、其他
  • 隨機(jī)梯度下降法在還能夠應(yīng)用到一些更加復(fù)雜的算法中,如邏輯回歸(Logic Regression)算法(雖有回歸兩字哨免,但實(shí)際上是分類算法)等茎活;

  • 在回歸模型的損失函數(shù)求解中,還有正規(guī)方程的方式琢唾,它不需要調(diào)節(jié)學(xué)習(xí)率\alpha载荔,但是要求矩陣可逆,數(shù)據(jù)維度不能太大采桃。

五懒熙、特征縮放

當(dāng)樣本的特征的數(shù)值之間差異比較大時,梯度下降的過程不僅曲折普办,而且耗時工扎;這時候需要將各個特征歸一化到統(tǒng)一的區(qū)間。常見的做法如下:

1泌豆、0均值標(biāo)準(zhǔn)化(Z-score normalization)
  • 將原始數(shù)據(jù)集歸一化為均值為0定庵、方差為1的數(shù)據(jù)集,歸一化后的特征將分布在 [?1,1] 區(qū)間踪危,轉(zhuǎn)化函數(shù)如下:

z=\frac {x - μ}{δ}

????其中蔬浙,μσ分別為原始數(shù)據(jù)集均值標(biāo)準(zhǔn)差贞远。

????說明:該種歸一化方式要求原始數(shù)據(jù)的分布可以近似為高斯分布畴博,否則歸一化的效果會變得很糟糕。

  • 代碼實(shí)現(xiàn)如下
def standardize(xArr):
    '''
    特征標(biāo)準(zhǔn)化處理
    :param xArr: 樣本特征集
    :return: 標(biāo)準(zhǔn)化后的樣本特征集
    '''
    m, n = xArr.shape
    # 歸一化每一個特征
    for j in range(n):
        meanVal = xArr[:, j].mean(axis=0)
        std = xArr[:, j].std(axis=0)
        if std != 0:
            xArr[:, j] = (xArr[:, j] - meanVal) / pow(std,2)
        else:
            xArr[:, j] = 0
    return xArr
2蓝仲、線性函數(shù)歸一化(Min-Max Scaling)
  • 實(shí)現(xiàn)對原始數(shù)據(jù)的等比例縮放俱病,將原始數(shù)據(jù)線性化的方法轉(zhuǎn)換到[0,1]的范圍,公式如下:

X_{normal} = \frac {X - X_{min}}{ X_{max} - X_{min}}

????其中X_{norm}為歸一化后的數(shù)據(jù)袱结,X為原始數(shù)據(jù)亮隙,X_{max}X_{min}分別為原始數(shù)據(jù)集的最大值和最小值垢夹。

  • 代碼實(shí)現(xiàn)如下
def normalize(xArr):
  """特征歸一化處理
  Args:
      X: 樣本特征集
  Returns:
      歸一化后的樣本特征集矩陣
  """
  m, n = xArr.shape
  # 歸一化每一個特征
  for j in range(n):
      minVal = xArr[:, j].min(axis=0)
      maxVal = xArr[:, j].max(axis=0)
      diff = maxVal - minVal
      if diff != 0:
        xArr[:, j] = (xArr[:, j] - minVal) / diff
      else:
        xArr[:, j] = 0
   return xArr
3溢吻、總結(jié)
  • 在分類、聚類算法中果元,需要使用距離來度量相似性的時候促王、或者使用PCA技術(shù)進(jìn)行降維的時候,Z-score standardization表現(xiàn)更好而晒。

  • 在不涉及距離度量蝇狼、協(xié)方差計算、數(shù)據(jù)不符合正太分布的時候倡怎,可以使用Min-Max Scaling或其他歸一化方法迅耘。比如圖像處理中贱枣,將RGB圖像轉(zhuǎn)換為灰度圖像后將其值限定在[0 255]的范圍。

六豹障、多項(xiàng)式回歸

1冯事、多項(xiàng)式

多項(xiàng)式由稱為不定元的變量和常數(shù)系數(shù)通過有限次加減法、乘法以及自然數(shù)冪次的乘方運(yùn)算得到的代數(shù)表達(dá)式血公,可以分為一次一元多項(xiàng)式和多元多項(xiàng)式昵仅。我們主要討論一元多項(xiàng)式,其形式如下:

y = a_0 + a_1 * x + a_2 * (x^2) + ... + a_n * (x^n) + e

2累魔、多項(xiàng)式回歸
  • 當(dāng)回歸函數(shù)不能用直線來描述時摔笤,要考慮用非線性回歸函數(shù)。 多項(xiàng)式回歸屬于非線性回歸的一種垦写。這里主要介紹一元多項(xiàng)式回歸吕世。

  • 一般非線性回歸函數(shù)是未知的,或即使已知也未必可以用一個簡單的函數(shù)變換轉(zhuǎn)化為線性模型梯投。常用的做法是用因子的多項(xiàng)式命辖。

  • 從散點(diǎn)圖觀察到回歸函數(shù)有一個“彎”,則可考慮用二次多項(xiàng)式分蓖;有兩個彎則考慮用三次多項(xiàng)式尔艇;有三個彎則考慮用四次多項(xiàng)式,等等么鹤。

  • 真實(shí)的回歸函數(shù)未必就是某個次數(shù)的多項(xiàng)式终娃,但只要擬合得好,用適當(dāng)?shù)亩囗?xiàng)式來近似真實(shí)的回歸函數(shù)是可行的蒸甜。

七棠耕、擬合的問題

1、概念
  • 擬合:把平面上一系列的點(diǎn)柠新,用一條光滑的曲線連接起來窍荧,擬合的曲線一般可以用函數(shù)表示,擬合曲線不是唯一的恨憎;在實(shí)踐中蕊退,常常會出現(xiàn)過擬合欠擬合問題;
欠擬合框咙、擬合和過擬合.png
  • 最左邊的直線沒有很好擬合數(shù)據(jù),這類情況是欠擬合(underfitting)痢甘;最右邊的曲線似乎對數(shù)據(jù)點(diǎn)做了很好的擬合(曲線通過了所有的點(diǎn))喇嘱,但是它無法泛化到新的數(shù)據(jù)樣本中,是一個差的模型塞栅,這種情況是過擬合的者铜,只有中間的曲線才是理想的擬合曲線。

  • 泛化指的是一個假設(shè)模型能夠應(yīng)用到新樣本的能力。新樣本數(shù)據(jù)是指沒有出現(xiàn)在訓(xùn)練集中的數(shù)據(jù)作烟。

  • 特征過多 或者 樣本量少的情況都容易發(fā)生過擬合的情況愉粤。解決的方法有兩種:1)減少特征個數(shù),選擇最重要的特征拿撩,拋棄一部分特征衣厘;2)正則化,保留所有的特征压恒,但是會減小特征變量的數(shù)量級影暴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市探赫,隨后出現(xiàn)的幾起案子型宙,更是在濱河造成了極大的恐慌伦吠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毛仪,死亡現(xiàn)場離奇詭異,居然都是意外死亡潭千,警方通過查閱死者的電腦和手機(jī)谱姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門刨晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狈癞,你說我怎么就攤上這事茄靠。” “怎么了蝶桶?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長真竖。 經(jīng)常有香客問我,道長恢共,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任脂信,我火速辦了婚禮,結(jié)果婚禮上狰闪,老公的妹妹穿的比我還像新娘埋泵。我一直安慰自己,他們只是感情好秋泄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘦麸,像睡著了一般歧胁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喊巍,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天崭参,我揣著相機(jī)與錄音,去河邊找鬼何暮。 笑死奄喂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的海洼。 我是一名探鬼主播坏逢,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼是整!你這毒婦竟也來了浮入?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤陋率,失蹤者是張志新(化名)和其女友劉穎秽晚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赴蝇,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡句伶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了先嬉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楚堤。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衅胀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滚躯,我是刑警寧澤嘿歌,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站阅束,受9級特大地震影響茄唐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呼盆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一蚁廓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧相嵌,春花似錦况脆、人聲如沸批糟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽否淤。三九已至,卻和暖如春檐嚣,著一層夾襖步出監(jiān)牢的瞬間啰扛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工挖藏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厢漩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓宵膨,卻偏偏與公主長得像炸宵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子土全,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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