線性回歸+回歸算法的評(píng)價(jià)指標(biāo)

線性回歸+回歸算法的評(píng)價(jià)指標(biāo)

  • 回歸問題的判定
    • 目標(biāo)值是連續(xù)性的值疹鳄,而分類問題的目標(biāo)值是離散型的值。
  • 回歸處理的問題為預(yù)測(cè):
    • 預(yù)測(cè)房?jī)r(jià)
    • 銷售額的預(yù)測(cè)
    • 設(shè)定貸款額度
    • 總結(jié):上述案例中牵舱,可以根據(jù)事物的相關(guān)特征預(yù)測(cè)出對(duì)應(yīng)的結(jié)果值
  • 線性回歸在生活中的映射(現(xiàn)實(shí)生活中就有線性回歸):生活案例【預(yù)測(cè)學(xué)生的期末成績(jī)】:
    • 期末成績(jī)的制定:0.7*考試成績(jī)+0.3平時(shí)成績(jī)干像,則該例子中图贸,特征值為考試成績(jī)和平時(shí)成績(jī),目標(biāo)值為總成績(jī)乾闰。
      • 回歸算法預(yù)測(cè)出來的結(jié)果其實(shí)就是經(jīng)過相關(guān)的算法計(jì)算出來的結(jié)果值落追!
      • 每一個(gè)特征需要有一個(gè)權(quán)重的占比,這個(gè)權(quán)重的占比明確后涯肩,則就可以得到最終的計(jì)算結(jié)果轿钠,也就是獲取了最終預(yù)測(cè)的結(jié)果了巢钓。
        • 那么這個(gè)特征對(duì)應(yīng)的權(quán)重如何獲取或者如何制定呢?
#現(xiàn)在有一組售房的數(shù)據(jù)
import numpy as np
import pandas
from pandas import DataFrame
import matplotlib.pylab as plt
dic = {
    '面積':[55,76,80,100,120,150],
    '售價(jià)':[110,152,160,200,240,300]
}
df = DataFrame(data=dic)
df
#輸出結(jié)果:
面積  售價(jià)
0   55  110
1   76  152
2   80  160
3   100 200
4   120 240
5   150 300

對(duì)售房數(shù)據(jù)的分布情況進(jìn)行展示

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認(rèn)字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問題

plt.scatter(df['面積'],df['售價(jià)'])
plt.xlabel('面積')
plt.ylabel('售價(jià)')
plt.title('面積和價(jià)錢的分布圖')

散點(diǎn)圖:

散點(diǎn)圖.png
plt.scatter(df['面積'],df['售價(jià)'])
plt.xlabel('面積')
plt.ylabel('售價(jià)')
plt.title('面積和價(jià)錢的分布圖')
plt.scatter(np.linspace(0,180,num=100),np.linspace(0,180,num=100)*2,alpha=0.3)

情況1:散點(diǎn)在所有直線上

線性方程圖:y=2*x

直線圖.png

線性回歸的作用:找出特征和目標(biāo)之間存在的某種趨勢(shì)

該趨勢(shì)表示形式:線性方程

? 線性方程y = wx就可以表示一條唯一的直線

? 標(biāo)準(zhǔn)的線性方程式為:y = wx + b,w為斜率疗垛,b為截距

? 何時(shí)帶b: 加b的目的是為了使得趨勢(shì)對(duì)應(yīng)的直線更加具有通用性

? 分情況: 目標(biāo)值有可能為0(直線過原點(diǎn))症汹,帶b,否則不帶b

  • 房?jī)r(jià)受影響的因素除了面積了贷腕,加入了采光率和樓層了背镇,特征變成3種。在原始的線性方程y=wx+b中只可以有一個(gè)特征泽裳,則該方程不具備通用性瞒斩。

    • 標(biāo)準(zhǔn)線性關(guān)系模型為:

    • 售價(jià) = (w1面積+w2采光率+w3樓層)+ b==》y = (w1x1w2x2+wn*xn)+b

    • w叫做權(quán)重。

    • b可以變換成w0*x0,x0=1

      • y = w0x0+w1x1+w2x2+wnxn
    • 權(quán)重向量(行向量):w0,w1,...wn

      • 行向量的轉(zhuǎn)置就是列向量诡壁。行向量是一個(gè) n×1 的矩陣济瓢,即矩陣由一個(gè)含有n個(gè)元素的行所組成。
    • 行向量乘以行向量的轉(zhuǎn)置為一個(gè)常數(shù)

線性回歸

  • 找出特征和特征權(quán)重之間的一種組合妹卿,預(yù)測(cè)對(duì)應(yīng)的結(jié)果
    • 線性方程式:
線性回歸方程式.png
  • 真實(shí)結(jié)果和預(yù)測(cè)結(jié)果是否會(huì)存在誤差

若在房?jī)r(jià)預(yù)測(cè)案例中旺矾,特征與目標(biāo)之間的分布規(guī)律不是線性的,也可以使用一條直線表示特征和目標(biāo)之間的趨勢(shì)夺克,但是要保證直線距離所有的散點(diǎn)距離最近箕宙,該直線還是可以在一定程度上表示非線性分布散點(diǎn)之間的分布規(guī)律。但是該規(guī)律會(huì)存在誤差

  • 處理誤差:

    • 回歸算法

      回歸算法是一個(gè)迭代算法铺纽。迭代就好比是系統(tǒng)版本的迭代柬帕,迭代后的系統(tǒng)要比迭代前的系統(tǒng)更好。

      • 回歸算法就是在不斷的自身迭代的減少誤差來使得回歸算法的預(yù)測(cè)結(jié)果可以越發(fā)的逼近真實(shí)結(jié)果
      • 官方解釋:迭代是重復(fù)反饋過程的活動(dòng)狡门,其目的通常是為了逼近所需目標(biāo)或結(jié)果陷寝。每一次對(duì)過程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會(huì)作為下一次迭代的初始值其馏。
    • 誤差的處理方法

    • 回歸算法就是在不斷的自身迭代的減少誤差來使得回歸算法的預(yù)測(cè)結(jié)果可以越發(fā)的逼近真實(shí)結(jié)果

    • 損失函數(shù) 來表示誤差

    總損失.png
    - yi:為第i個(gè)訓(xùn)練樣本的真實(shí)值

    - hw(xi):預(yù)測(cè)值

       損失函數(shù):

    ![損失函數(shù).png](https://upload-images.jianshu.io/upload_images/20605284-d2d60973738b85a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


    又稱為SSE(Sum of Sqaured Error凤跑,誤差平方和)或者RSS(Residual Sum of Squares 殘差平方和) 

    由上式知,誤差的大小線性回歸方程中的系數(shù)w是有直系關(guān)聯(lián)的:w(權(quán)重)的不同會(huì)導(dǎo)致誤差大小的不同

    - L0叛复,L1和L2范式:

      - L0是指向量中非0的元素的個(gè)數(shù)仔引。

      - L1是指向量中各個(gè)元素絕對(duì)值之和。

      - L2是指向量各元素的平方和然后求平方根

        -   本質(zhì)是就是歐式距離褐奥,即是兩個(gè)向量上的每個(gè)點(diǎn)對(duì)應(yīng)相減后的平方和再開平方

        - 損失函數(shù):歐式距離的平方 

          損失函數(shù)是在計(jì)算真實(shí)標(biāo)簽和預(yù)測(cè)值之間的距離咖耘,差異越小越好 ,故求:

         ![L2范式.png](https://upload-images.jianshu.io/upload_images/20605284-750eacb89f941ac7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



          最小二乘法 :通過最小化真實(shí)值和預(yù)測(cè)值之間的RSS來求解參數(shù)的方法 撬码。 求解極值(最小值)就是求解一階導(dǎo)數(shù)并讓一階導(dǎo)數(shù)等于0 

L2范式求導(dǎo)

w.gif

參考點(diǎn):

1.兩個(gè)向量(y&Xw)的平方就等于兩個(gè)向量的轉(zhuǎn)置乘以兩個(gè)向量本身

2.處理轉(zhuǎn)置乘法和減法

處理轉(zhuǎn)置乘法和減法.png
  1. 在矩陣求導(dǎo)中如果小a為常數(shù)項(xiàng)儿倒,A為矩陣則
矩陣求導(dǎo).png
  • API

    最小二乘(正規(guī)方程):from sklearn.linear_model import LinearRegression

    最小二乘法 : 參數(shù)中并沒有一個(gè)是必填的

    最小二乘法.png

sklearn中的線性回歸可以處理多標(biāo)簽問題,只需要在fit的時(shí)候輸入多維度標(biāo)簽就可以了

normalize參數(shù):如果為True呜笑,則會(huì)對(duì)特征數(shù)據(jù)進(jìn)行歸一化處理义桂,如果想對(duì)特征數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理則需要在訓(xùn)練模型前調(diào)用相關(guān)工具類對(duì)其進(jìn)行標(biāo)準(zhǔn)化處理找筝。

  • 使用最小二乘對(duì)加利福尼亞房屋進(jìn)行預(yù)測(cè)
  • 特征介紹:
    • AveBedrms:該街區(qū)平均的臥室數(shù)目
    • Population:街區(qū)人口
    • AveOccup:平均入住率
    • Latitude:街區(qū)的緯度
    • Longitude:街區(qū)的經(jīng)度
    • MedInc:街區(qū)住戶收入的中位數(shù)
    • HouseAge:房屋使用年數(shù)中位數(shù)
    • AveRooms:街區(qū)平均房屋的數(shù)量
from sklearn.linear_model import LinearRegression
import sklearn.datasets as datasets
from sklearn.model_selection import train_test_split
#獲取數(shù)據(jù)
house = datasets.fetch_california_housing(data_home='./datasets')
#樣本數(shù)據(jù)提取
feature = house.data
target = house.target
feature.shape #(20640, 8)
#回歸模型一般情況下不需要做特征的預(yù)處理,如果最終模型預(yù)測(cè)效果不好慷吊,可以適當(dāng)考慮加上預(yù)處理
#數(shù)據(jù)集的切分
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2020)
#最小二乘
linner = LinearRegression(normalize=True,copy_X=False)
linner.fit(x_train,y_train)
#查看特征的權(quán)重系數(shù)
linner.coef_ 
#輸出結(jié)果:
array([ 4.40832770e-01,  9.61642244e-03, -1.14781227e-01,  6.75973842e-01,
       -5.10337874e-06, -3.47558983e-03, -4.19478386e-01, -4.32477249e-01])
#截距
linner.intercept_  #-36.77944310594463

#獲取特征名稱
feature_names = house.feature_names
#將系數(shù)和特征名稱結(jié)合在一起查看
[*zip(feature_names,linner.coef_)]
#輸出結(jié)果:
[('MedInc', 0.4408327703951707),
 ('HouseAge', 0.009616422444042731),
 ('AveRooms', -0.11478122746959658),
 ('AveBedrms', 0.6759738423151275),
 ('Population', -5.1033787395895275e-06),
 ('AveOccup', -0.003475589832443694),
 ('Latitude', -0.41947838567694423),
 ('Longitude', -0.4324772490416935)]

#預(yù)測(cè)
linner.score(x_test,y_test) #0.6077878946185034

回歸模型的評(píng)價(jià)指標(biāo)

  • 回歸類與分類型算法的模型評(píng)估都有相似的法則— —找真實(shí)標(biāo)簽和預(yù)測(cè)值的差異袖裕。只不過在分類型算法中,這個(gè)差異只有一種角度來評(píng)判溉瓶,那就是是否預(yù)測(cè)到了正確的分類急鳄,而在回歸類算法中,有兩種不同的角度來看待回歸的效果:
    • 第一堰酿,是否預(yù)測(cè)到了正確或者接近正確的數(shù)值(因?yàn)檎`差的存在)疾宏。
    • 第二,是否擬合到了足夠的信息触创。(是否模型預(yù)測(cè)的結(jié)果線性和樣本真實(shí)的結(jié)果的線性更加吻合)
      • 這兩種角度坎藐,分別對(duì)應(yīng)著不同的模型評(píng)估指標(biāo)。

1.是否預(yù)測(cè)到了正確的數(shù)值

  • RSS殘差平方和 哼绑,本質(zhì)是預(yù)測(cè)值與真實(shí)值之間的差異

致命缺點(diǎn): 它是一個(gè)無界的和岩馍,可以無限地大或者無限的小

  • MSE 均方誤差

    MSE.png

本質(zhì)是在RSS的基礎(chǔ)上除以樣本總量,得到每個(gè)樣本量上的平均誤差

查看這個(gè)錯(cuò)誤有多嚴(yán)重 :比較平均誤差和標(biāo)簽的取值范圍(最大值和最小值) ( 最大值和最小值可以表示標(biāo)簽的一個(gè)分部情況 )

  • 在sklearn當(dāng)中抖韩,有兩種方式調(diào)用這個(gè)評(píng)估指標(biāo):
    • 一種是使用sklearn專用的模型評(píng)估模塊metrics里的類mean_squared_error
    • 另一種是調(diào)用交叉驗(yàn)證的類cross_val_score并使用里面的scoring參數(shù)來設(shè)置為:neg_mean_squared_error使用均方誤差蛀恩。

方式1:

from sklearn.metrics import mean_squared_error as MSE
#y_true:測(cè)試數(shù)據(jù)的真實(shí)標(biāo)簽
#y_pred:使用模型對(duì)測(cè)試集的預(yù)測(cè)結(jié)果
y_pred = linner.predict(x_test)
MSE(y_test,y_pred) #0.5313973307052253
y_test.min(),y_test.max() #(0.14999, 5.00001)

方式2:

from sklearn.model_selection import cross_val_score
cross_val_score(linner,x_train,y_train,cv=5,scoring='neg_mean_squared_error').mean() #-0.5309250456411233

交叉驗(yàn)證求得的均方誤差為負(fù)值

  • 均方誤差的計(jì)算公式中求得的均方誤差的值不可能為負(fù)。但是sklearn中的參數(shù)scoring下茂浮,均方誤差作為評(píng)判標(biāo)準(zhǔn)時(shí)双谆,卻是計(jì)算”負(fù)均方誤差“(neg_mean_squared_error)。這是因?yàn)閟klearn在計(jì)算模型評(píng)估指標(biāo)的時(shí)候席揽,會(huì)考慮指標(biāo)本身的性質(zhì)顽馋,均方誤差本身是一種誤差,所以被sklearn劃分為模型的一種損失(loss)幌羞。在sklearn當(dāng)中寸谜,所有的損失都使用負(fù)數(shù)表示,因此均方誤差也被顯示為負(fù)數(shù)了新翎。真正的均方誤差MSE的數(shù)值,其實(shí)就是neg_mean_squared_error去掉負(fù)號(hào)的數(shù)字住练。

  • 絕對(duì)值誤差(了解)

    • 除了MSE地啰,我們還有與MSE類似的MAE(Mean absolute error,絕對(duì)均值誤差):
MAE.png
  • 其表達(dá)的概念與均方誤差完全一致讲逛,不過在真實(shí)標(biāo)簽和預(yù)測(cè)值之間的差異外我們使用的是L1范式(絕對(duì)值)】髁撸現(xiàn)實(shí)使用中,MSE和MAE選一個(gè)來使用就好了盏混。

    • 在sklearn當(dāng)中蔚鸥,我們使用命令:from sklearn.metrics import mean_absolute_error來調(diào)用MAE
    • 同時(shí)惜论,我們也可以使用交叉驗(yàn)證中的scoring = "neg_mean_absolute_error", 以此在交叉驗(yàn)證時(shí)調(diào)用MAE止喷。

2.是否擬合到了足夠的信息

擬合.png

紅色線是真實(shí)標(biāo)簽馆类,藍(lán)色線是模型預(yù)測(cè)的值

前半部分的擬合非常成功 , 但后半部分的擬合卻非常糟糕

方差來衡量數(shù)據(jù)上的信息量 , 如果方差越大,代表數(shù)據(jù)上的信息量越多弹谁,而這個(gè)信息量(數(shù)據(jù)潛在的規(guī)律)不僅包括了數(shù)值的大小乾巧,還包括了我們希望模型捕捉的那些規(guī)律。R2:衡量模型對(duì)數(shù)據(jù)上的信息量的捕捉

R.png

1-我們的模型沒有捕捉到的信息量占真實(shí)標(biāo)簽中所帶的信息量的比例

  • 分母是不變的预愤,則誤差越小則分子分母表達(dá)式返回的結(jié)果越小沟于,則r2越接近1.

  • 可以使用三種方式來調(diào)用

    • 一種是直接從metrics中導(dǎo)入r2_score,輸入預(yù)測(cè)值和真實(shí)值后打分植康。
    • 第二種是直接從 線性回歸LinearRegression的接口score來進(jìn)行調(diào)用旷太。
    • 第三種是在交叉驗(yàn)證中,輸入"r2"來調(diào)用销睁。
from sklearn.metrics import r2_score
r2_score(y_test,y_pred) #0.6077878946185034
  • 繪制擬合圖
%matplotlib inline
import matplotlib.pyplot as plt
y_pred = linner.predict(x_test)
plt.plot(range(len(y_test)),sorted(y_test),c="black",label= "y_true")
plt.plot(range(len(y_pred)),sorted(y_pred),c="red",label = "y_predict")
plt.legend()
plt.show()
擬合圖.png

可見供璧,雖然我們的大部分?jǐn)?shù)據(jù)被擬合得比較好,但是圖像的開頭和結(jié)尾處卻又著較大的擬合誤差榄攀。如果我們?cè)趫D像右側(cè)分布著更多的數(shù)據(jù)嗜傅,我們的模型就會(huì)越來越偏離我們真正的標(biāo)簽。這種結(jié)果類似于我們前面提到的檩赢,雖然在有限的數(shù)據(jù)集上將數(shù)值預(yù)測(cè)正確了吕嘀,但卻沒有正確擬合數(shù)據(jù)的分布,如果有更多的數(shù)據(jù)進(jìn)入我們的模型贞瞒,那數(shù)據(jù)標(biāo)簽被預(yù)測(cè)錯(cuò)誤的可能性是非常大的偶房。

實(shí)戰(zhàn)

  • 房地產(chǎn)估價(jià)數(shù)據(jù)集數(shù)據(jù)集(house.xlsx)
    • 數(shù)據(jù)集信息:
      • 房地產(chǎn)估值的市場(chǎng)歷史數(shù)據(jù)集來自臺(tái)灣新北市新店區(qū)【“房地產(chǎn)估價(jià)” 是一個(gè)回歸問題棕洋。
    • 屬性信息:
      • 輸入如下:
        • X1 =交易日期(例如,2013.250 = 2013年3月乒融,2013.500 = 2013年6月掰盘,等等)
        • X2 =房屋年齡(單位:年)
        • X3 =到最近的捷運(yùn)站的距離(單位:米) )
        • X4 =步行生活圈中的便利店的數(shù)量(整數(shù))
        • X5 =地理坐標(biāo),緯度赞季。(單位:度)
        • X6 =地理坐標(biāo)愧捕,經(jīng)度。(單位:度)
      • 輸出結(jié)果如下:
        • Y =單位面積的房?jī)r(jià)(10000新臺(tái)幣/ Ping申钩,其中Ping是本地單位次绘,1 Ping = 3.3米平方)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子邮偎,更是在濱河造成了極大的恐慌管跺,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禾进,死亡現(xiàn)場(chǎng)離奇詭異豁跑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)命迈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門贩绕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人壶愤,你說我怎么就攤上這事淑倾。” “怎么了征椒?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵娇哆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我勃救,道長(zhǎng)碍讨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任蒙秒,我火速辦了婚禮勃黍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晕讲。我一直安慰自己覆获,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布瓢省。 她就那樣靜靜地躺著弄息,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勤婚。 梳的紋絲不亂的頭發(fā)上摹量,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音馒胆,去河邊找鬼缨称。 笑死,一個(gè)胖子當(dāng)著我的面吹牛祝迂,可吹牛的內(nèi)容都是我干的睦尽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼液兽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼骂删!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起四啰,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤宁玫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柑晒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欧瘪,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年匙赞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佛掖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涌庭,死狀恐怖芥被,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坐榆,我是刑警寧澤拴魄,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站席镀,受9級(jí)特大地震影響匹中,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豪诲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一顶捷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屎篱,春花似錦服赎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堪侯,卻和暖如春嚎尤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伍宦。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工芽死, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人次洼。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓关贵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卖毁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揖曾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355