數(shù)量生態(tài)學:R語言的應(yīng)用 第四章 聚類分析3—非層次聚類

數(shù)量生態(tài)學:R語言的應(yīng)用 第四章 聚類分析3—非層次聚類

在聚類分析中層次聚類被經(jīng)常使用溪王,層次聚類通過某種相似性測度計算節(jié)點之間的相似性,并按相似度由高到低排序值骇,逐步重新連接個節(jié)點。而另一類非層次聚類是對一組對象進行簡單分組的方法移国,盡量使組內(nèi)對象之間比組間對象之間的相似度更高吱瘩。但是需要我們自己來決定分組的組數(shù)k。

通常是設(shè)定不同的初始結(jié)構(gòu)迹缀,然后通過大量的迭代以找到最佳的解決方法使碾。本次介紹兩種非層次聚類算法:k-均值劃分和圍繞中心點劃分(PAM)。這些都是歐氏距離空間屬性的算法祝懂。

注意:不同綱量的變量在進行非層次聚類之前應(yīng)該進行標準化票摇,因為方差的綱量等于變量綱量的平方,如果不標準化砚蓬,不同量綱的方差相加無意義矢门。

1. k-均值劃分

k-均值劃分使用數(shù)據(jù)局部結(jié)構(gòu)構(gòu)建聚類簇:通過確認數(shù)據(jù)高密度區(qū)構(gòu)建分類組。

其步驟是:預(yù)估將數(shù)據(jù)分為K組,則隨機選取K個對象作為初始的聚類中心,然后計算每個對象與各個種子聚類中心之間的距離,把每個對象分配給距離它最近的聚類中心 ,聚類中心以及分配給它們的對象就代表一個聚類 ,每分配一個樣本,聚類的聚類中心會根據(jù)聚類中現(xiàn)有的對象被重新計算,這個過程將不斷重復直到滿足某個終止條件 ,終止條件可以是沒有(或最小數(shù)目)對象被重新分配給不同的聚類,沒有(或最小數(shù)目)聚類中心再發(fā)生變化,誤差平方和局部最小。

k-均值劃分算法以歐式距離作為相似度測度祟剔,采用誤差平方和準則函數(shù)作為聚類準則函數(shù)隔躲。

加載所需的包和數(shù)據(jù)

#加載包和數(shù)據(jù)
library(ade4)
library(adespatial)
library(vegan)
library(gclus)
library(cluster)
library(pvclust)
library(RColorBrewer)
library(labdsv)
library(rioja)
library(indicspecies)
library(mvpart)
library(MVPARTwrap)
library(dendextend)
library(vegclust)
library(colorspace)
library(agricolae)
library(picante)

#加載函數(shù)
source("drawmap.R")
source("drawmap3.R")
source("hcoplot.R")
source("test.a.R")
source("coldiss.R")
source("bartlett.perm.R")
source("boxplerk.R")
source("boxplert.R")

#從聚類結(jié)果獲得二元差異矩陣的函數(shù)
grpdist <- function(X)
{
  require(cluster)
  gr <- as.data.frame(as.factor(X))
  distgr <- daisy(gr,"gower")
  distgr
}

#導入Doubs數(shù)據(jù)
load("Doubs.RData")
#剔除無物種數(shù)據(jù)的樣方8
spe <- spe[-8,]
env <- env[-8,]
spa <- spa[-8,]
latlong <- latlong[-8,] #經(jīng)緯度

#先計算樣方之間的弦距離矩陣
spe.norm <- decostand(spe,"normalize")

1.1 隨機開始的K-均值劃分

在已經(jīng)想好設(shè)定的組數(shù)后,使用stats包的 kmeans()函數(shù)運行k-均值劃分物延。kmeans()函數(shù)會以隨機設(shè)定的初始結(jié)構(gòu)為基礎(chǔ)宣旱,不斷的自動重復迭代到設(shè)定次數(shù)(參數(shù)nstart)為止,并獲得當前次數(shù)下最佳的分類方案(即最小SSE值)叛薯。

k-均值劃分是一種線性模型的方法浑吟,因此不適合含很多零值的原始數(shù)據(jù)。遇到這樣的數(shù)據(jù)耗溜,有兩種方法進行處理组力。

  • 使用非歐氏相異矩陣,如百分數(shù)差異(又名Bray-Curtis)强霎;這樣的非歐氏相異矩陣應(yīng)進行平方根變換并提交主坐標分析(PCoA)以獲得歐氏屬性的主坐標用于k-均值劃分侮措。
  • 對數(shù)據(jù)進行預(yù)轉(zhuǎn)化。為了與前面聚類分析的對象保持一致瞳别,可以使用之前已經(jīng)范數(shù)標準化后(弦轉(zhuǎn)化)的物種數(shù)據(jù)作為案例忙灼。為了與之前的Ward聚類結(jié)果比較,設(shè)定k=4組進行k-均值劃分家夺,并將結(jié)果與Ward層次聚類4組樣方的結(jié)果進行比較脱柱。

為了與之前的Ward聚類結(jié)果比較,設(shè)定k=4組進行k-均值劃分拉馋,并將其結(jié)果與ward結(jié)果進行比較榨为。

#預(yù)轉(zhuǎn)化后物種數(shù)據(jù)k-均值劃分
spe.kmeans <- kmeans(spe.norm, centers = 4, nstart = 100)
spe.kmeans
預(yù)轉(zhuǎn)化后物種數(shù)據(jù)k-均值劃分

注意:即使給定的nstart相同,每次運行上述命令煌茴,所產(chǎn)生的結(jié)果也不一定完全相同随闺,因為每次運算設(shè)定的初始結(jié)構(gòu)是隨機的。

# 比較當前分4組的分類結(jié)果與之前Ward聚類的結(jié)果蔓腐。
table(spe.kmeans$cluster, spech.ward.g)

#這兩個聚類結(jié)果是否非常相似矩乐?哪個(或哪些)對象有差別?
spe.kmeans$cluster
spech.ward.g
比較當前分4組的分類結(jié)果與之前Ward聚類的結(jié)果
比較當前分4組的分類結(jié)果與之前Ward聚類的結(jié)果

對于那些無法從原始數(shù)據(jù)轉(zhuǎn)化后進行歐氏距離計算的距離指數(shù)(例如百分數(shù)差異指數(shù)回论,又名Bray-Curtis相異指數(shù))散罕,必須先將原始的距離矩陣通過主坐標分析(PCoA)獲得一個n行的矩形數(shù)據(jù)表格,然后再進行k-均值劃分傀蓉。

對于百分數(shù)差異相異指數(shù)欧漱,必須先取平方根進行PCoA分析,或使用校對負特征根的PCoA函數(shù)葬燎,才能獲得完全的歐氏屬性數(shù)據(jù)表格误甚。

kmeans()函數(shù)每次分析只能產(chǎn)生一個簡單的預(yù)先設(shè)定組數(shù)的分組結(jié)果缚甩。如果需要嘗試不同組數(shù)的結(jié)果,需要重新運行命令靶草。但到底多少組是最好的分類方案呢蹄胰?

最好方案的標準有很多,cclust程序包clustIndex()函數(shù)內(nèi)有一部分標準奕翔。推薦使用最大化Calinski-Harabasz指數(shù)(比較分類結(jié)果組間與組內(nèi)平方和的F統(tǒng)計量)裕寨,盡管在分類組所含對象數(shù)量差異比較大情況下Calinski-Harabasz指數(shù)的值可能比較低∨杉蹋“ssi”(簡單結(jié)構(gòu)指數(shù))也是衡量分類結(jié)果的另一個不錯的指標宾袜。

我們不必手動多次運行kmeans()函數(shù)來獲得不同組數(shù)的分類結(jié)果,可以使用vegan包里的函數(shù)cascadeKM()驾窟。cascadeKM()函數(shù)可以一次運行生成組數(shù)k從少(參數(shù)Inf.gr)到多(參數(shù)sup.gr)的聚類結(jié)果庆猫。

以下使用cascadeKM()函數(shù),組數(shù)設(shè)定從2組到10組绅络,并使用ssi評估聚類的質(zhì)量月培,同時繪制聚類的結(jié)果。

#k-均值劃分恩急,2組到10組
spe.KM.cascade <-
  cascadeKM(
    spe.norm,
    inf.gr = 2,
    sup.gr = 10,
    iter = 100,
    criterion = "ssi"
  )
summary(spe.KM.cascade)
spe.KM.cascade$results
spe.KM.cascade$partition
dev.new(
  title = "CascadeKM",
  width = 10,
  height = 6,
  noRStudioGD = TRUE
)
#在plot函數(shù)中杉畜,sortg=TRUE代表在每個聚類簇內(nèi)按照對象之間的緊密程度重新排列對象。
plot(spe.KM.cascade, sortg = TRUE)
顯示不同組數(shù)條件下每個對象歸屬的k-均值劃分

該圖顯示每個對象在每種分類組數(shù)下的歸屬(圖上每行代表一種組數(shù))衷恭。圖內(nèi)的表格有不同的顏色此叠,每行兩種顏色,代表分兩組k=2随珠,三種顏色代表k=3灭袁,依此類推。右圖代表不同k值條件下的中止標準的統(tǒng)計量窗看。

到底多少組數(shù)是最佳方案茸歧?如果傾向于較大的組數(shù),哪個是最佳方案呢显沈?

函數(shù)casecadeKM()也提供數(shù)據(jù)結(jié)果举娩。其中“result”給出每種組數(shù)k條件下的TESS統(tǒng)計量和準則(calinski或ssi)的值,其中partition包含每個聚類簇所含對象的信息构罗。如果對象的地理信息可用,就可以繪制對象空間分布地圖智玻,同時以不同的顏色帶標識對象的歸屬遂唧。

summary(spe.KM.cascade)
spe.KM.cascade$results
image-20210508172756428

這里,最小SSE值用于確定在給定組數(shù)k下的最佳方案吊奢,而calinski和ssi指標用于確定最佳k值盖彭,兩個指標解決不同的問題纹烹。

記住不同的組數(shù)k={2,3,…,10}召边,每次都是獨立運行铺呵。因此上圖從下到上結(jié)構(gòu)互相獨立,與層次聚類樹的嵌套結(jié)構(gòu)不同隧熙。

確定樣方聚類簇后片挂,可以查看聚類簇的內(nèi)容。最簡單的方法是基于分組圖形定義樣方的亞組合計算基本統(tǒng)計量贞盯。以下對4組k-均值劃分結(jié)果進行分析音念。

# 按照k-均值劃分結(jié)果重新排列樣方
spe.kmeans.g <- spe.kmeans$cluster
spe[order(spe.kmeans.g), ]

# 使用函數(shù)vegemite()重新排列樣方-物種矩陣
ord.KM <- vegemite(spe, spe.kmeans.g)
spe[ord.KM$sites, ord.KM$species]

1.2 使用k-均值劃分優(yōu)化一個獨立獲得的分類

k-均值劃分的出發(fā)點可以以k x p的平均值矩陣(k為聚類獲得的組數(shù),p為變量數(shù)量躏敢,矩陣里面的值為該變量在該組中的平均值)闷愤,或是以k個對象(每個對象視為每個組的典型代表)作為列表,這個典型的代表即下一節(jié)要討論的分組方法所稱的“形心(medeids)”件余。

讓我們應(yīng)用這個想法來驗證由魚類數(shù)據(jù)Ward聚類獲得的4個組讥脐,然后被k-均值修改分組。

以Ward 聚類獲得4組中各個物種的平均多度矩陣作為初始結(jié)構(gòu)進行k-均值劃分

# 計算Ward聚類獲得4組中各個物種的平均多度矩陣
groups <- as.factor(spech.ward.g)
spe.means <- matrix(0, ncol(spe), length(levels(groups)))
row.names(spe.means) <- colnames(spe)
for (i in 1:ncol(spe)) {
  spe.means[i, ] <- tapply(spe.norm[, i], spech.ward.g, mean)
}
# 平均物種多度矩陣作為初始點
startpoints <- t(spe.means)
# 基于初始點的k-均值劃分
spe.kmeans2 <- kmeans(spe.norm, centers = startpoints)
image-20210509110909213

與前面的方法有點不同啼器,這里需要返回看一下聚類(層次結(jié)構(gòu)聚類)的結(jié)果旬渠,確認每組最典型的對象(輪廓寬度值最大),將這些對象作為k-均值劃分的初始結(jié)構(gòu)(參數(shù)centers)

startobjects <- spe.norm[c(2, 17, 21, 23), ]
spe.kmeans3 <- kmeans(spe.norm, centers = startobjects)
image-20210509112421431
#將k-均值劃分結(jié)果與Ward聚類分析結(jié)果進行比對
table(spe.kmeans2$cluster, spech.ward.g)

# 兩個k-均值劃分優(yōu)化后的4組進行比較
table(spe.kmeans2$cluster, spe.kmeans3$cluster)

聚類分析結(jié)果進行比對
# 最終分組的輪廓寬度值圖
spech.ward.gk <- spe.kmeans2$cluster
dev.new(
  title = "輪廓-優(yōu)化分區(qū)",
  noRStudioGD = TRUE
)
par(mfrow = c(1, 1))
k <- 4
sil <- silhouette(spech.ward.gk, spe.ch)
rownames(sil) <- row.names(spe)
plot(sil,
     main = "輪廓寬度值 - Ward & k均值",
     cex.names = 0.8,
     col = 2:(k + 1))
最終分組的輪廓寬度值圖

從代碼中可以看出镀首,可以通過列聯(lián)表法進行原始分組和優(yōu)化分組之間或兩個優(yōu)化分組之間的比較坟漱。兩種優(yōu)化(基于物種的平均值和典型的初始對象)為我們選擇的4個“典型”對象產(chǎn)生相同的結(jié)果。注意這個選擇至關(guān)重要更哄。與原來的Ward聚類4組結(jié)果比較顯示芋齿,只有一個對象第15樣方已從組2移動到組1。這樣移動可以改進輪廓圖并略微改變了沿著河流分布的地圖成翩。請注意觅捆,樣方19的成員歸屬仍不清楚:它的輪廓寬度值仍為負值。

# 沿DOUBS河流優(yōu)化后Ward聚類4組分布圖
dev.new(title = "河流優(yōu)化后Ward聚類4組分布圖",
        width = 9,
        noRStudioGD = TRUE)
drawmap(xy = spa,
       clusters = spech.ward.gk,
       main = "沿DOUBS河流優(yōu)化后Ward聚類4組分布圖")
沿DOUBS河流優(yōu)化后Ward聚類4組分布圖

2. 圍繞中心點劃分(PAM)

圍繞中心點劃分:“從所有的數(shù)據(jù)觀測點尋找k個代表性的對象或形心點麻敌,這些代表性的對象應(yīng)該反映數(shù)據(jù)的主體結(jié)構(gòu)栅炒。k個形心點選定后,將每個觀測點分配給某個形心點構(gòu)建k個聚類簇术羔,不斷尋找最佳的k個代表性對象赢赊,使對象之間的相異性總和最小”。k-均值法是最小化組內(nèi)歐氏距離平方和级历。因此释移,k-均值法是傳統(tǒng)的最小二乘法,但PAM不是寥殖。

在R里玩讳,pam()函數(shù)(cluster程序包)的輸入可以是原始數(shù)據(jù)涩蜘,也可以是相異矩陣(與kmean()相比,pam()的優(yōu)勢是可以輸入更多類型的關(guān)聯(lián)測度)熏纯,并且允許通過輪廓寬度值確定最佳的分組數(shù)量同诫。

以下代碼兩的最后部分利用雙輪廓圖比較k-均值法和PAM法的分組結(jié)果。

基于弦距離的圍繞中心點劃分(PAM)

#聚類簇數(shù)量的選擇
#循環(huán)計算2至28組分類數(shù)下平均輪廓寬度
asw <- numeric(nrow(spe))
for (k in 2:(nrow(spe) - 1))
  asw[k] <- pam(spe.ch, k, diss = TRUE)$silinfo$avg.width
k.best <- which.max(asw)
dev.new(title = "PAM", noRStudioGD = TRUE)
plot(
  1:nrow(spe),
  asw,
  type = "h",
  main = "聚類簇數(shù)量的選擇",
  xlab = "k (群集數(shù))",
  ylab = "平均輪廓寬度"
)
axis(
  1,
  k.best,
  paste("optimum", k.best, sep = "\n"),
  col = "red",
  font = 2,
  col.axis = "red"
)
points(k.best,
       max(asw),
       pch = 16,
       col = "red",
       cex = 1.5)
聚類簇數(shù)量的選擇

當k=2時樟澜,PAM具有最佳的方案(asw=0.3841)误窖,這并不是我們期望的結(jié)果。如果選擇常用的4組分法往扔,從輪廓寬度角度分析結(jié)果并不好(asw=0.2736)贩猎。盡管如此,我們還是需要分析PAM分4組的情況萍膛。

# PAM分4組情況
spe.ch.pam <- pam(spe.ch, k = 4, diss = TRUE)
summary(spe.ch.pam)
spe.ch.pam.g <- spe.ch.pam$clustering
spe.ch.pam$silinfo$widths

# 將當前的分類結(jié)果與之前Ward聚類和k-均值劃分進行比較
table(spe.ch.pam.g, spech.ward.g)
table(spe.ch.pam.g, spe.kmeans.g)
當前的分類結(jié)果與之前Ward聚類和k-均值劃分進行比較

PAM結(jié)果與Ward聚類和k-均值劃分結(jié)果顯著不同

#k=4組下與Ward聚類和k-均值劃分進行比較
dev.new(
  title = "輪廓寬度值 - k-均值 and PAM",
  width = 12,
  height = 8,
  noRStudioGD = TRUE
)
par(mfrow = c(1, 2))
k <- 4
sil <- silhouette(spe.kmeans.g, spe.ch)
rownames(sil) <- row.names(spe)
plot(sil,
     main = "輪廓寬度值 - k-均值",
     cex.names = 0.8,
     col = 2:(k + 1))
plot(
  silhouette(spe.ch.pam),
  main = "輪廓寬度值 - PAM",
  cex.names = 0.8,
  col = 2:(k + 1)
)
輪廓寬度值 - k-均值 and PAM

基于此圖吭服,可以分辨PAM和k-均值法哪個有更好的平均輪廓值。我們可以將當前結(jié)果與Ward聚類比較輪廓寬度圖比較蝗罗。除了聚類簇成員不同外艇棕,在k-均值和最優(yōu)化的Ward聚類之間還有哪些不同?我們可以通過檢查兩個聚類比較的列聯(lián)表進行分析

#比較k-均值劃分和最優(yōu)化后的Ward聚類
table(spe.kmeans.g, spech.ward.gk)

比較k-均值劃分和最優(yōu)化后的Ward聚類

PAM法表現(xiàn)更穩(wěn)定,一方面因為它是最小化相異系數(shù)總和串塑,代替了最小化歐氏距離的平方和沼琉;另一方面在給定分組數(shù)k的條件下,PAM相異系數(shù)總和更容易收斂桩匪。但對于特定的研究目的打瘪,并不能保證PAM一定是最合適的聚類方法。

從前面的例子傻昙,可以看出即使是兩種目標相同且屬于同一大類(k-均值法和PAM同屬于非層次聚類)的聚類方法也可能產(chǎn)生完全不同的結(jié)果闺骚。我們需要根據(jù)哪種方法的結(jié)果能夠提供更多有用的信息,或能更好地被環(huán)境變量解釋來選擇合適的方法妆档。

好了僻爽,第四章聚類分析的非層次聚類就這么多內(nèi)容,主要就是k-均值法和PAM這兩種方法贾惦,如果還不能好好理解胸梆,可以多回顧幾次,下次內(nèi)容是聚類分析中的使用環(huán)境變量來解釋來比較须板,敬請期待碰镜。

謝謝你的閱讀。

如有不足或錯誤之處习瑰,請批評指正绪颖。
有什么不明白的也歡迎留言討論。

歡迎關(guān)注微信公眾號:fafu 生信 小蘑菇

往期內(nèi)容:

《數(shù)量生態(tài)學:R語言的應(yīng)用》第三章-R模式

《數(shù)量生態(tài)學:R語言的應(yīng)用》第二版第三章-關(guān)聯(lián)測度與矩陣------Q模式

《數(shù)量生態(tài)學:R語言的應(yīng)用》第二版筆記2

《數(shù)量生態(tài)學——R語言的應(yīng)用》第二版閱讀筆記--緒論和第二章(一部分)

R語言 pheatmap 包繪制熱圖(基礎(chǔ)部分)

R語言pheatmap包繪制熱圖進階教程

使用PicGo和gitee搭建圖床

組間分析—T檢驗杰刽、R語言繪圖

Rmarkdown的xaringan包來制作PPT

htlm文件部署到個人網(wǎng)站

感謝你的閱讀2しⅰ!贺嫂!你的點贊關(guān)注轉(zhuǎn)發(fā)是對我最大的鼓勵滓鸠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市第喳,隨后出現(xiàn)的幾起案子糜俗,更是在濱河造成了極大的恐慌,老刑警劉巖曲饱,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠抹,死亡現(xiàn)場離奇詭異,居然都是意外死亡扩淀,警方通過查閱死者的電腦和手機楔敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驻谆,“玉大人卵凑,你說我怎么就攤上這事∈る” “怎么了勺卢?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長象对。 經(jīng)常有香客問我黑忱,道長,這世上最難降的妖魔是什么勒魔? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任甫煞,我火速辦了婚禮,結(jié)果婚禮上沥邻,老公的妹妹穿的比我還像新娘危虱。我一直安慰自己,他們只是感情好唐全,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布埃跷。 她就那樣靜靜地躺著邮利,像睡著了一般弥雹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上延届,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天剪勿,我揣著相機與錄音,去河邊找鬼方庭。 笑死厕吉,一個胖子當著我的面吹牛酱固,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播头朱,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼运悲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了项钮?” 一聲冷哼從身側(cè)響起班眯,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烁巫,沒想到半個月后署隘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡亚隙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年磁餐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恃鞋。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡崖媚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恤浪,到底是詐尸還是另有隱情畅哑,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布水由,位于F島的核電站荠呐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏砂客。R本人自食惡果不足惜泥张,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞠值。 院中可真熱鬧媚创,春花似錦、人聲如沸彤恶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽声离。三九已至芒炼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間术徊,已是汗流浹背本刽。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人子寓。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓暗挑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斜友。 傳聞我的和親對象是個殘疾皇子窿祥,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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