基本Kmeans算法介紹及其實(shí)現(xiàn)

原文:http://blog.csdn.net/liuheng0111/article/details/52149040

1.基本Kmeans算法[1]

  1. 選擇K個點(diǎn)作為初始質(zhì)心??
  2. repeat??
  3. ????將每個點(diǎn)指派到最近的質(zhì)心,形成K個簇??
  4. ????重新計算每個簇的質(zhì)心??
  5. until?簇不發(fā)生變化或達(dá)到最大迭代次數(shù)??

時間復(fù)雜度:O(tKmn)瞳收,其中照藻,t為迭代次數(shù)耘沼,K為簇的數(shù)目拿愧,m為記錄數(shù)蓄诽,n為維數(shù)

空間復(fù)雜度:O((m+K)n)就漾,其中粱坤,K為簇的數(shù)目,m為記錄數(shù)冈在,n為維數(shù)

2.注意問題

(1)K如何確定

? ? ? ? kmenas算法首先選擇K個初始質(zhì)心倒慧,其中K是用戶指定的參數(shù),即所期望的簇的個數(shù)包券。這樣做的前提是我們已經(jīng)知道數(shù)據(jù)集中包含多少個簇蠢熄,但很多情況下邦尊,我們并不知道數(shù)據(jù)的分布情況滨巴,實(shí)際上聚類就是我們發(fā)現(xiàn)數(shù)據(jù)分布的一種手段灾常,這就陷入了雞和蛋的矛盾。如何有效的確定K值发魄,這里大致提供幾種方法盹牧,若各位有更好的方法,歡迎探討励幼。

1.與層次聚類結(jié)合[2]

? ? ? ? ?經(jīng)常會產(chǎn)生較好的聚類結(jié)果的一個有趣策略是汰寓,首先采用層次凝聚算法決定結(jié)果粗的數(shù)目,并找到一個初始聚類苹粟,然后用迭代重定位來改進(jìn)該聚類有滑。

2.穩(wěn)定性方法[3]

? ? ? ? 穩(wěn)定性方法對一個數(shù)據(jù)集進(jìn)行2次重采樣產(chǎn)生2個數(shù)據(jù)子集,再用相同的聚類算法對2個數(shù)據(jù)子集進(jìn)行聚類嵌削,產(chǎn)生2個具有k個聚類的聚類結(jié)果毛好,計算2個聚類結(jié)果的相似度的分布情況望艺。2個聚類結(jié)果具有高的相似度說明k個聚類反映了穩(wěn)定的聚類結(jié)構(gòu),其相似度可以用來估計聚類個數(shù)肌访。采用次方法試探多個k找默,找到合適的k值。

3.系統(tǒng)演化方法[3]

? ? ? ? ?系統(tǒng)演化方法將一個數(shù)據(jù)集視為偽熱力學(xué)系統(tǒng)吼驶,當(dāng)數(shù)據(jù)集被劃分為K個聚類時稱系統(tǒng)處于狀態(tài)K惩激。系統(tǒng)由初始狀態(tài)K=1出發(fā),經(jīng)過分裂過程和合并過程蟹演,系統(tǒng)將演化到它的穩(wěn)定平衡狀態(tài)Ki风钻,其所對應(yīng)的聚類結(jié)構(gòu)決定了最優(yōu)類數(shù)Ki。系統(tǒng)演化方法能提供關(guān)于所有聚類之間的相對邊界距離或可分程度酒请,它適用于明顯分離的聚類結(jié)構(gòu)和輕微重疊的聚類結(jié)構(gòu)魄咕。

4.使用canopy算法進(jìn)行初始劃分[4]

? ? ? ? ? 基于Canopy Method的聚類算法將聚類過程分為兩個階段
? ? ? ? ?Stage1、聚類最耗費(fèi)計算的地方是計算對象相似性的時候蚌父,Canopy Method在第一階段選擇簡單、計算代價較低的方法計算對象相似性毛萌,將相似的對象放在一個子集中苟弛,這個子集被叫做Canopy ,通過一系列計算得到若干Canopy阁将,Canopy之間可以是重疊的膏秫,但不會存在某個對象不屬于任何Canopy的情況,可以把這一階段看做數(shù)據(jù)預(yù)處理做盅;
? ? ? ? ? Stage2缤削、在各個Canopy 內(nèi)使用傳統(tǒng)的聚類方法(如K-means),不屬于同一Canopy 的對象之間不進(jìn)行相似性計算吹榴。
從這個方法起碼可以看出兩點(diǎn)好處:首先亭敢,Canopy 不要太大且Canopy 之間重疊的不要太多的話會大大減少后續(xù)需要計算相似性的對象的個數(shù);其次图筹,類似于K-means這樣的聚類方法是需要人為指出K的值的帅刀,通過Stage1得到的Canopy 個數(shù)完全可以作為這個K值,一定程度上減少了選擇K的盲目性远剩。

? ? ? ? ?其他方法如貝葉斯信息準(zhǔn)則方法(BIC)可參看文獻(xiàn)[5]扣溺。

(2)初始質(zhì)心的選取

? ? ? ? ? 選擇適當(dāng)?shù)某跏假|(zhì)心是基本kmeans算法的關(guān)鍵步驟。常見的方法是隨機(jī)的選取初始質(zhì)心瓜晤,但是這樣簇的質(zhì)量常常很差锥余。處理選取初始質(zhì)心問題的一種常用技術(shù)是:多次運(yùn)行,每次使用一組不同的隨機(jī)初始質(zhì)心痢掠,然后選取具有最小SSE(誤差的平方和)的簇集驱犹。這種策略簡單嘲恍,但是效果可能不好,這取決于數(shù)據(jù)集和尋找的簇的個數(shù)着绷。

? ? ? ? ? 第二種有效的方法是蛔钙,取一個樣本,并使用層次聚類技術(shù)對它聚類荠医。從層次聚類中提取K個簇吁脱,并用這些簇的質(zhì)心作為初始質(zhì)心。該方法通常很有效彬向,但僅對下列情況有效:(1)樣本相對較小兼贡,例如數(shù)百到數(shù)千(層次聚類開銷較大);(2)K相對于樣本大小較小

? ? ? ? ? ?第三種選擇初始質(zhì)心的方法娃胆,隨機(jī)地選擇第一個點(diǎn)遍希,或取所有點(diǎn)的質(zhì)心作為第一個點(diǎn)。然后里烦,對于每個后繼初始質(zhì)心凿蒜,選擇離已經(jīng)選取過的初始質(zhì)心最遠(yuǎn)的點(diǎn)。使用這種方法胁黑,確保了選擇的初始質(zhì)心不僅是隨機(jī)的废封,而且是散開的。但是丧蘸,這種方法可能選中離群點(diǎn)漂洋。此外,求離當(dāng)前初始質(zhì)心集最遠(yuǎn)的點(diǎn)開銷也非常大力喷。為了克服這個問題刽漂,通常該方法用于點(diǎn)樣本。由于離群點(diǎn)很少(多了就不是離群點(diǎn)了)弟孟,它們多半不會在隨機(jī)樣本中出現(xiàn)贝咙。計算量也大幅減少。

? ? ? ? ? 第四種方法就是上面提到的canopy算法拂募。

(3)距離的度量

? ? ? ? ? 常用的距離度量方法包括:歐幾里得距離和余弦相似度颈畸。兩者都是評定個體間差異的大小的。歐幾里得距離度量會受指標(biāo)不同單位刻度的影響没讲,所以一般需要先進(jìn)行標(biāo)準(zhǔn)化眯娱,同時距離越大,個體間差異越大爬凑;空間向量余弦夾角的相似度度量不會受指標(biāo)刻度的影響徙缴,余弦值落于區(qū)間[-1,1],值越大,差異越小于样。但是針對具體應(yīng)用疏叨,什么情況下使用歐氏距離,什么情況下使用余弦相似度穿剖?

? ? ? ? ? 從幾何意義上來說蚤蔓,n維向量空間的一條線段作為底邊和原點(diǎn)組成的三角形,其頂角大小是不確定的糊余。也就是說對于兩條空間向量秀又,即使兩點(diǎn)距離一定,他們的夾角余弦值也可以隨意變化贬芥。感性的認(rèn)識吐辙,當(dāng)兩用戶評分趨勢一致時,但是評分值差距很大蘸劈,余弦相似度傾向給出更優(yōu)解昏苏。舉個極端的例子威沫,兩用戶只對兩件商品評分贤惯,向量分別為(3,3)和(5,5),這兩位用戶的認(rèn)知其實(shí)是一樣的溯职,但是歐式距離給出的解顯然沒有余弦值合理妻枕。[6]

(4)質(zhì)心的計算

? ? ? ? ?對于距離度量不管是采用歐式距離還是采用余弦相似度愕掏,簇的質(zhì)心都是其均值垢乙,即向量各維取平均即可油猫。對于距離對量采用其它方式時,這個還沒研究過居扒。

(5)算法停止條件

? ? ? ? ?一般是目標(biāo)函數(shù)達(dá)到最優(yōu)或者達(dá)到最大的迭代次數(shù)即可終止。對于不同的距離度量曾沈,目標(biāo)函數(shù)往往不同这嚣。當(dāng)采用歐式距離時,目標(biāo)函數(shù)一般為最小化對象到其簇質(zhì)心的距離的平方和塞俱,如下:


? ? ? ? ?當(dāng)采用余弦相似度時姐帚,目標(biāo)函數(shù)一般為最大化對象到其簇質(zhì)心的余弦相似度和,如下:


(6)空聚類的處理

? ? ? ? ? ?如果所有的點(diǎn)在指派步驟都未分配到某個簇障涯,就會得到空簇罐旗。如果這種情況發(fā)生,則需要某種策略來選擇一個替補(bǔ)質(zhì)心唯蝶,否則的話九秀,平方誤差將會偏大。一種方法是選擇一個距離當(dāng)前任何質(zhì)心最遠(yuǎn)的點(diǎn)粘我。這將消除當(dāng)前對總平方誤差影響最大的點(diǎn)鼓蜒。另一種方法是從具有最大SSE的簇中選擇一個替補(bǔ)的質(zhì)心。這將分裂簇并降低聚類的總SSE征字。如果有多個空簇都弹,則該過程重復(fù)多次。另外匙姜,編程實(shí)現(xiàn)時畅厢,要注意空簇可能導(dǎo)致的程序bug。

3.適用范圍及缺陷

? ? ? ? ? ?Kmenas算法試圖找到使平凡誤差準(zhǔn)則函數(shù)最小的簇氮昧。當(dāng)潛在的簇形狀是凸面的框杜,簇與簇之間區(qū)別較明顯,且簇大小相近時袖肥,其聚類結(jié)果較理想咪辱。前面提到,該算法時間復(fù)雜度為O(tKmn)昭伸,與樣本數(shù)量線性相關(guān)梧乘,所以澎迎,對于處理大數(shù)據(jù)集合庐杨,該算法非常高效,且伸縮性較好夹供。但該算法除了要事先確定簇數(shù)K和對初始聚類中心敏感外灵份,經(jīng)常以局部最優(yōu)結(jié)束,同時對“噪聲”和孤立點(diǎn)敏感哮洽,并且該方法不適于發(fā)現(xiàn)非凸面形狀的簇或大小差別很大的簇填渠。

4.實(shí)現(xiàn)

  1. #include?<iostream>??
  2. #include?<sstream>??
  3. #include?<fstream>??
  4. #include?<vector>??
  5. #include?<math.h>??
  6. #include?<stdlib.h>??
  7. #define?k?3//簇的數(shù)目??
  8. using?namespace?std;??
  9. //存放元組的屬性信息??
  10. typedef?vector<double>?Tuple;//存儲每條數(shù)據(jù)記錄??
  11. ??
  12. int?dataNum;//數(shù)據(jù)集中數(shù)據(jù)記錄數(shù)目??
  13. int?dimNum;//每條記錄的維數(shù)??
  14. ??
  15. //計算兩個元組間的歐幾里距離??
  16. double?getDistXY(const?Tuple&?t1,?const?Tuple&?t2)???
  17. {??
  18. ????double?sum?=?0;??
  19. ????for(int?i=1;?i<=dimNum;?++i)??
  20. ????{??
  21. ????????sum?+=?(t1[i]-t2[i])?*?(t1[i]-t2[i]);??
  22. ????}??
  23. ????return?sqrt(sum);??
  24. }??
  25. ??
  26. //根據(jù)質(zhì)心,決定當(dāng)前元組屬于哪個簇??
  27. int?clusterOfTuple(Tuple?means[],const?Tuple&?tuple){??
  28. ????double?dist=getDistXY(means[0],tuple);??
  29. ????double?tmp;??
  30. ????int?label=0;//標(biāo)示屬于哪一個簇??
  31. ????for(int?i=1;i<k;i++){??
  32. ????????tmp=getDistXY(means[i],tuple);??
  33. ????????if(tmp<dist)?{dist=tmp;label=i;}??
  34. ????}??
  35. ????return?label;?????
  36. }??
  37. //獲得給定簇集的平方誤差??
  38. double?getVar(vector<Tuple>?clusters[],Tuple?means[]){??
  39. ????double?var?=?0;??
  40. ????for?(int?i?=?0;?i?<?k;?i++)??
  41. ????{??
  42. ????????vector<Tuple>?t?=?clusters[i];??
  43. ????????for?(int?j?=?0;?j<?t.size();?j++)??
  44. ????????{??
  45. ????????????var?+=?getDistXY(t[j],means[i]);??
  46. ????????}??
  47. ????}??
  48. ????//cout<<"sum:"<<sum<<endl;??
  49. ????return?var;??
  50. ??
  51. }??
  52. //獲得當(dāng)前簇的均值(質(zhì)心)??
  53. Tuple?getMeans(const?vector<Tuple>&?cluster){??
  54. ??????
  55. ????int?num?=?cluster.size();??
  56. ????Tuple?t(dimNum+1,?0);??
  57. ????for?(int?i?=?0;?i?<?num;?i++)??
  58. ????{??
  59. ????????for(int?j=1;?j<=dimNum;?++j)??
  60. ????????{??
  61. ????????????t[j]?+=?cluster[i][j];??
  62. ????????}??
  63. ????}??
  64. ????for(int?j=1;?j<=dimNum;?++j)??
  65. ????????t[j]?/=?num;??
  66. ????return?t;??
  67. ????//cout<<"sum:"<<sum<<endl;??
  68. }??
  69. ??
  70. void?print(const?vector<Tuple>?clusters[])??
  71. {??
  72. ????for(int?lable=0;?lable<k;?lable++)??
  73. ????{??
  74. ????????cout<<"第"<<lable+1<<"個簇:"<<endl;??
  75. ????????vector<Tuple>?t?=?clusters[lable];??
  76. ????????for(int?i=0;?i<t.size();?i++)??
  77. ????????{??
  78. ????????????cout<<i+1<<".(";??
  79. ????????????for(int?j=0;?j<=dimNum;?++j)??
  80. ????????????{??
  81. ????????????????cout<<t[i][j]<<",?";??
  82. ????????????}??
  83. ????????????cout<<")\n";??
  84. ????????}??
  85. ????}??
  86. }??
  87. ??
  88. void?KMeans(vector<Tuple>&?tuples){??
  89. ????vector<Tuple>?clusters[k];//k個簇??
  90. ????Tuple?means[k];//k個中心點(diǎn)??
  91. ????int?i=0;??
  92. ????//一開始隨機(jī)選取k條記錄的值作為k個簇的質(zhì)心(均值)??
  93. ????srand((unsigned?int)time(NULL));??
  94. ????for(i=0;i<k;){??
  95. ????????int?iToSelect?=?rand()%tuples.size();??
  96. ????????if(means[iToSelect].size()?==?0)??
  97. ????????{??
  98. ????????????for(int?j=0;?j<=dimNum;?++j)??
  99. ????????????{??
  100. ????????????????means[i].push_back(tuples[iToSelect][j]);??
  101. ????????????}??
  102. ????????????++i;??
  103. ????????}??
  104. ????}??
  105. ????int?lable=0;??
  106. ????//根據(jù)默認(rèn)的質(zhì)心給簇賦值??
  107. ????for(i=0;i!=tuples.size();++i){??
  108. ????????lable=clusterOfTuple(means,tuples[i]);??
  109. ????????clusters[lable].push_back(tuples[i]);??
  110. ????}??
  111. ????double?oldVar=-1;??
  112. ????double?newVar=getVar(clusters,means);??
  113. ????cout<<"初始的的整體誤差平方和為:"<<newVar<<endl;???
  114. ????int?t?=?0;??
  115. ????while(abs(newVar?-?oldVar)?>=?1)?//當(dāng)新舊函數(shù)值相差不到1即準(zhǔn)則函數(shù)值不發(fā)生明顯變化時,算法終止??
  116. ????{??
  117. ????????cout<<"第?"<<++t<<"?次迭代開始:"<<endl;??
  118. ????????for?(i?=?0;?i?<?k;?i++)?//更新每個簇的中心點(diǎn)??
  119. ????????{??
  120. ????????????means[i]?=?getMeans(clusters[i]);??
  121. ????????}??
  122. ????????oldVar?=?newVar;??
  123. ????????newVar?=?getVar(clusters,means);?//計算新的準(zhǔn)則函數(shù)值??
  124. ????????for?(i?=?0;?i?<?k;?i++)?//清空每個簇??
  125. ????????{??
  126. ????????????clusters[i].clear();??
  127. ????????}??
  128. ????????//根據(jù)新的質(zhì)心獲得新的簇??
  129. ????????for(i=0;?i!=tuples.size();?++i){??
  130. ????????????lable=clusterOfTuple(means,tuples[i]);??
  131. ????????????clusters[lable].push_back(tuples[i]);??
  132. ????????}??
  133. ????????cout<<"此次迭代之后的整體誤差平方和為:"<<newVar<<endl;???
  134. ????}??
  135. ??
  136. ????cout<<"The?result?is:\n";??
  137. ????print(clusters);??
  138. }??
  139. int?main(){??
  140. ??
  141. ????char?fname[256];??
  142. ????cout<<"請輸入存放數(shù)據(jù)的文件名:?";??
  143. ????cin>>fname;??
  144. ????cout<<endl<<"?請依次輸入:?維數(shù)?樣本數(shù)目"<<endl;??
  145. ????cout<<endl<<"?維數(shù)dimNum:?";??
  146. ????cin>>dimNum;??
  147. ????cout<<endl<<"?樣本數(shù)目dataNum:?";??
  148. ????cin>>dataNum;??
  149. ????ifstream?infile(fname);??
  150. ????if(!infile){??
  151. ????????cout<<"不能打開輸入的文件"<<fname<<endl;??
  152. ????????return?0;??
  153. ????}??
  154. ????vector<Tuple>?tuples;??
  155. ????//從文件流中讀入數(shù)據(jù)??
  156. ????for(int?i=0;?i<dataNum?&&?!infile.eof();?++i)??
  157. ????{??
  158. ????????string?str;??
  159. ????????getline(infile,?str);??
  160. ????????istringstream?istr(str);??
  161. ????????Tuple?tuple(dimNum+1,?0);//第一個位置存放記錄編號氛什,第2到dimNum+1個位置存放實(shí)際元素??
  162. ????????tuple[0]?=?i+1;??
  163. ????????for(int?j=1;?j<=dimNum;?++j)??
  164. ????????{??
  165. ????????????istr>>tuple[j];??
  166. ????????}??
  167. ????????tuples.push_back(tuple);??
  168. ????}??
  169. ??
  170. ????cout<<endl<<"開始聚類"<<endl;??
  171. ????KMeans(tuples);??
  172. ????return?0;??
  173. }??

這里是隨機(jī)選取的初始質(zhì)心莺葫,以鳶尾花的數(shù)據(jù)集為例,原數(shù)據(jù)集中1-50為一個簇枪眉,51-100為第二個簇捺檬,101到150為第三個簇:


第一次運(yùn)行結(jié)果 SSE=97.5905


第二次運(yùn)行結(jié)果 SSE=98.1404

。贸铜。堡纬。

第五次運(yùn)行結(jié)果 SSE=123.397

? ? ? ? ?由于初始質(zhì)心是隨機(jī)選取的,前兩次還算正常蒿秦,運(yùn)行到第五次時烤镐,第一個簇基本包括了后51-150個記錄,第二個簇和第三個簇包含了第1-50個記錄棍鳖,可能的原因就是隨機(jī)選擇初始點(diǎn)時炮叶,有兩個初始點(diǎn)都選在了1-50個記錄中。



參考:

[1]Pang-Ning Tan等著鹊杖,《數(shù)據(jù)挖掘?qū)д摗罚?011

[2]Jiawei Han等著悴灵,《數(shù)據(jù)挖掘概念與技術(shù)》,2008

[3]聚類分析中類數(shù)估計方法的實(shí)驗(yàn)比較

[4]http://www.cnblogs.com/vivounicorn/archive/2011/09/23/2186483.html

[5]一種基于貝葉斯信息準(zhǔn)則的k均值聚類方法

[6]http://www.zhihu.com/question/19640394?nr=1&noti_id=8736954

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骂蓖,一起剝皮案震驚了整個濱河市积瞒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌登下,老刑警劉巖茫孔,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異被芳,居然都是意外死亡缰贝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門畔濒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剩晴,“玉大人,你說我怎么就攤上這事侵状≡廾郑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵趣兄,是天一觀的道長绽左。 經(jīng)常有香客問我,道長艇潭,這世上最難降的妖魔是什么拼窥? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任戏蔑,我火速辦了婚禮,結(jié)果婚禮上鲁纠,老公的妹妹穿的比我還像新娘总棵。我一直安慰自己,他們只是感情好改含,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布彻舰。 她就那樣靜靜地躺著,像睡著了一般候味。 火紅的嫁衣襯著肌膚如雪刃唤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天白群,我揣著相機(jī)與錄音尚胞,去河邊找鬼。 笑死帜慢,一個胖子當(dāng)著我的面吹牛笼裳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粱玲,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼躬柬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抽减?” 一聲冷哼從身側(cè)響起允青,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卵沉,沒想到半個月后颠锉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡史汗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年琼掠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片停撞。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓷蛙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戈毒,到底是詐尸還是另有隱情艰猬,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布副硅,位于F島的核電站姥宝,受9級特大地震影響翅萤,放射性物質(zhì)發(fā)生泄漏恐疲。R本人自食惡果不足惜腊满,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望培己。 院中可真熱鬧碳蛋,春花似錦、人聲如沸省咨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽零蓉。三九已至笤受,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敌蜂,已是汗流浹背箩兽。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留章喉,地道東北人汗贫。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像秸脱,于是被迫代替她去往敵國和親落包。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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