[Python從零到壹] 十三.機器學(xué)習(xí)之聚類算法四萬字總結(jié)(K-Means、BIRCH、MeanShift)丨【百變AI秀】

      網(wǎng)友投稿 1622 2025-03-31

      前一篇文章講述了回歸模型的原理知識,包括線性回歸、多項式回歸和邏輯回歸,并詳細介紹Python Sklearn機器學(xué)習(xí)庫的線性回歸和邏輯回歸算法及案例。本文介紹聚類算法的原理知識級案例,包括K-Means聚類、BIRCH算法、PCA降維聚類、均值漂移聚類、文本聚類等。基礎(chǔ)文章,希望對您有所幫助。

      文章目錄

      一.聚類

      1.算法模型

      2.常見聚類算法

      3.性能評估

      二.K-Means

      1.算法描述

      2.K-Means聚類示例

      3.Sklearn中K-Means用法介紹

      4.K-Means分析籃球數(shù)據(jù)

      5.K-Means聚類優(yōu)化

      6.設(shè)置類簇中心

      三.Birch

      1.算法描述

      2.Birch分析氧化物數(shù)據(jù)

      四.結(jié)合降維處理的聚類分析

      1.PCA降維

      2.Sklearn PCA降維

      3.PCA降維實例

      五.基于均值漂移的圖像聚類

      1.MeanShift圖像聚類

      2.K-Means圖像聚類

      六.基于文本的樹狀關(guān)鍵詞聚類

      七.總結(jié)

      -:

      https://github.com/eastmountyxz/Python-zero2one

      前文賞析:

      第一部分 基礎(chǔ)語法

      [Python從零到壹] 一.為什么我們要學(xué)Python及基礎(chǔ)語法詳解

      [Python從零到壹] 二.語法基礎(chǔ)之條件語句、循環(huán)語句和函數(shù)

      [Python從零到壹] 三.語法基礎(chǔ)之文件操作、CSV文件讀寫及面向?qū)ο?/a>

      第二部分 網(wǎng)絡(luò)爬蟲

      [Python從零到壹] 四.網(wǎng)絡(luò)爬蟲之入門基礎(chǔ)及正則表達式抓取博客案例

      [Python從零到壹] 五.網(wǎng)絡(luò)爬蟲之BeautifulSoup基礎(chǔ)語法萬字詳解

      [Python從零到壹] 六.網(wǎng)絡(luò)爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解

      [Python從零到壹] 七.網(wǎng)絡(luò)爬蟲之Requests爬取豆瓣電影TOP250及CSV存儲

      [Python從零到壹] 八.數(shù)據(jù)庫之MySQL基礎(chǔ)知識及操作萬字詳解

      [Python從零到壹] 九.網(wǎng)絡(luò)爬蟲之Selenium基礎(chǔ)技術(shù)萬字詳解

      [Python從零到壹] 十.Selenium爬取在線百科知識萬字詳解(NLP語料構(gòu)造必備技能)

      第三部分 數(shù)據(jù)分析+機器學(xué)習(xí)

      [Python從零到壹] 十一.數(shù)據(jù)分析之Numpy、Pandas、Matplotlib和Sklearn入門知識萬字詳解

      [Python從零到壹] 十二.機器學(xué)習(xí)之回歸分析萬字總結(jié)

      [Python從零到壹] 十三.機器學(xué)習(xí)之聚類分析萬字總結(jié)全網(wǎng)首發(fā)(K-Means、BIRCH、層次聚類、樹狀聚類)

      在過去,科學(xué)家會根據(jù)物種的形狀習(xí)性規(guī)律等特征將其劃分為不同類型的門類,比如將人種劃分為黃種人、白種人和黑種人,這就是簡單的人工聚類方法。聚類是將數(shù)據(jù)集中某些方面相似的數(shù)據(jù)成員劃分在一起,給定簡單的規(guī)則,對數(shù)據(jù)集進行分堆,是一種無監(jiān)督學(xué)習(xí)。聚類集合中,處于相同聚類中的數(shù)據(jù)彼此是相似的,處于不同聚類中的元素彼此是不同的。本章主要介紹聚類概念和常用聚類算法,然后詳細講述Scikit-Learn機器學(xué)習(xí)包中聚類算法的用法,并通過K-Means聚類、Birch層次聚類及PAC降維三個實例加深讀者印象。

      一.聚類

      俗話說“物以類聚,人以群分”,聚類(Clustering)就是根據(jù)“物以類聚”的原理而得。從廣義上說,聚類是將數(shù)據(jù)集中在某些方面相似的數(shù)據(jù)成員放在一起,聚類中處于相同類簇中的數(shù)據(jù)元素彼此相似,處于不同類簇中的元素彼此分離。

      由于在聚類中那些表示數(shù)據(jù)類別的分組信息或類標是沒有的,即這些數(shù)據(jù)是沒有標簽的,所有聚類又被稱為無監(jiān)督學(xué)習(xí)(Unsupervised Learning)。

      1.算法模型

      聚類是將本身沒有類別的樣本聚集成不同類型的組,每一組數(shù)據(jù)對象的集合都叫做簇。聚類的目的是讓屬于同一個類簇的樣本之間彼此相似,而不同類簇的樣本應(yīng)該分離。圖1表示聚類的算法模型圖。

      聚類模型的基本步驟包括:

      訓(xùn)練。通過歷史數(shù)據(jù)訓(xùn)練得到一個聚類模型,該模型用于后面的預(yù)測分析。需要注意的是,有的聚類算法需要預(yù)先設(shè)定類簇數(shù),如KMeans聚類算法。

      預(yù)測。輸入新的數(shù)據(jù)集,用訓(xùn)練得到的聚類模型對新數(shù)據(jù)集進行預(yù)測,即分堆處理,并給每行預(yù)測數(shù)據(jù)計算一個類標值。

      可視化操作及算法評價。得到預(yù)測結(jié)果之后,可以通過可視化分析反應(yīng)聚類算法的好壞,如果聚類結(jié)果中相同簇的樣本之間距離越近,不同簇的樣本之間距離越遠,其聚類效果越好。同時采用相關(guān)的評價標準對聚類算法進行評估。

      常用聚類模型包括:

      K-Means聚類

      層次聚類

      DBSCAN

      Affinity Propagatio

      MeanShift

      2.常見聚類算法

      聚類算法在Scikit-Learn機器學(xué)習(xí)包中,主要調(diào)用sklearn.cluster子類實現(xiàn),下面對常見的聚類算法進行簡單描述,后面主要介紹K-Means算法和Birch算法實例。

      (1) K-Means

      K-Means聚類算法最早起源于信號處理,是一種最經(jīng)典的聚類分析方法。它是一種自下而上的聚類方法,采用劃分法實現(xiàn),其優(yōu)點是簡單、速度快;缺點是必須提供聚類的數(shù)目,并且聚類結(jié)果與初始中心的選擇有關(guān),若不知道樣本集要聚成多少個類別,則無法使用K-Means算法。Sklearn包中調(diào)用方法如下:

      from sklearn.cluster import KMeans clf = KMeans(n_clusters=2) clf.fit(X,y)

      (2) Mini Batch K-Means

      Mini Batch K-means是KMeans的一種變換,目的為了減少計算時間。其實現(xiàn)類是MiniBatchKMeans。Sklearn包中調(diào)用方法如下:

      from sklearn.cluster import MiniBatchKMeans X= [[1],[2],[3],[4],[3],[2]] mbk = MiniBatchKMeans(init='k-means++', n_clusters=3, n_init=10) clf = mbk.fit(X) print(clf.labels_) #輸出:[0 2 1 1 1 2]

      (3) Birch

      Birch是平衡迭代歸約及聚類算法,全稱為Balanced Iterative Reducing and Clustering using Hierarchies,是一種常用的層次聚類算法。該算法通過聚類特征(Clustering Feature,CF)和聚類特征樹(Clustering Feature Tree,CFT)兩個概念描述聚類。聚類特征樹用來概括聚類的有用信息,由于其占用空間小并且可以存放在內(nèi)存中,從而提高了算法的聚類速度,產(chǎn)生了較高的聚類質(zhì)量,Birch算法適用于大型數(shù)據(jù)集。

      Sklearn包中調(diào)用方法如下:

      from sklearn.cluster import Birch X = [[1],[2],[3],[4],[3],[2]] clf = Birch(n_clusters=2) clf.fit(X) y_pred = clf.fit_predict(X) print(clf) print(y_pred) #輸出:[1 1 0 0 0 1]

      上述代碼調(diào)用Birch算法聚成兩類,并對X數(shù)據(jù)進行訓(xùn)練,共6個點(1、2、3、4、3、2),然后預(yù)測其聚類后的類標,輸出為0或1兩類結(jié)果,其中點1、2、2輸出類標為1,點3、4、3輸出類標為0。這是一個較好的聚類結(jié)果,因為值較大的點(3、4)聚集為一類,值較小的點(1、2)聚集為另一類。這里只是進行了簡單描述,后面將講述具體的算法及實例。

      (4) Mean Shift

      Mean Shift是均值偏移或均值漂移聚類算法,最早是1975年Fukunaga等人在一篇關(guān)于概率密度梯度函數(shù)的估計論文中提出。它是一種無參估計算法,沿著概率梯度的上升方向?qū)ふ曳植嫉姆逯怠ean Shift算法先算出當前點的偏移均值,移動該點到其偏移均值,然后以此為新的起始點,繼續(xù)移動,直到滿足一定的條件結(jié)束。

      (5) DBSCAN

      DBSCAN是一個典型的基于密度的聚類算法,它與劃分聚類方法、層次聚類方法不同,它將簇定義為密度相連的點的最大集合,能夠把具有足夠高密度的區(qū)域劃分為簇,并可在噪聲的空間數(shù)據(jù)庫中發(fā)現(xiàn)任意形狀的聚類。與K-Means方法相比,DBSCAN不需要事先知道要形成的簇類的數(shù)目,它可以發(fā)現(xiàn)任意形狀的簇類,同時該算法能夠識別出噪聲點,對于數(shù)據(jù)集中樣本的順序不敏感。但也存在一定缺點:DBSCAN聚類算法不能很好反映高維數(shù)據(jù)。

      3.性能評估

      聚類根據(jù)文檔的相似性把一個文檔集合中的文檔分成若干類,但是究竟分成多少類,這個要取決于文檔集合里文檔自身的性質(zhì)。圖3是Scikit-Learn官網(wǎng)中DBSCAN聚類示例結(jié)果,該聚類算法應(yīng)該把文檔集合分成3類,而不是2類或4類,這就涉及到了聚類算法評價。

      聚類算法的評價應(yīng)該考慮:聚類之間是否較好地相互分離、同一類簇中的點是否都靠近的中心點、聚類算法是否正確識別數(shù)據(jù)的類簇或標記。聚類算法的常見評價指標包括純度(Purity)、F值(F-measure)、熵值(Entropy)和RI,其中F值最為常用。

      (1) F值(F-measure)

      F值(F-measure或F-score)的計算包括兩個指標:精確率(Precision)和召回率(Recall)。精確率定義為檢索出相關(guān)文檔數(shù)與檢索出的文檔總數(shù)的比率,衡量的是檢索系統(tǒng)的查準率;召回率定義為檢索出的相關(guān)文檔數(shù)和文檔庫中所有相關(guān)文檔數(shù)的比率,衡量的是檢索系統(tǒng)的查全率。公式如下:

      其中,參數(shù)N表示實驗結(jié)果中正確識別出的聚類類簇數(shù),S表示實驗結(jié)果中實際識別出的聚類類簇數(shù),T表示數(shù)據(jù)集中所有真實存在的聚類相關(guān)類簇數(shù)。

      精確率和召回率兩個評估指標在特定的情況下是相互制約的,因而很難使用單一的評價指標來衡量實驗的效果。F-值是準確率和召回率的調(diào)和平均值,它可作為衡量實驗結(jié)果的最終評價指標,F(xiàn)值更接近兩個數(shù)中較小的那個。F值指的計算公式如下公式所示:

      (2) 純度(Purity)

      Purity方法是極為簡單的一種聚類評價方法,它表示正確聚類的文檔數(shù)占總文檔數(shù)的比例。公式如下:

      其中,參數(shù)m表示整個聚類劃分涉及的成員個數(shù);聚類i的純度定義為Pi;K表示聚類的類簇數(shù)目。舉個示例,假設(shè)聚類成3堆,其中x表示一類數(shù)據(jù)集,o表示一類數(shù)據(jù)集,◇表示一類數(shù)據(jù)集,如圖4所示。

      純度為正確聚類的文檔數(shù)占總文檔數(shù)的比例,即:purity=(5+4+3)/17=0.71。其中第一堆聚集正確5個x,第二堆正確聚集4個o,第三隊正確聚集3個◇。Purity方法優(yōu)點在于計算過程簡便,值在0~1之間,完全錯誤的聚類方法值為0,完全正確的聚類方法值為1;其缺點是無法對聚類方法給出正確的評價,尤其是每個文檔單獨聚集成一類的情況。

      (3) 蘭德指數(shù)(RI)

      蘭德指數(shù)(Rand Index,簡稱RI)是一種用排列組合原理來對聚類進行評價的手段,公式如下:

      其中參數(shù)TP表示被聚在一類的兩個文檔被正確分類,TN表示不應(yīng)該被聚在一類的兩個文檔被正確分開,F(xiàn)P表示不應(yīng)該放在一類的文檔被錯誤的放在了一類,F(xiàn)N表示不應(yīng)該分開的文檔被錯誤的分開。

      RI越大表示聚類效果準確性越高,同時每個類內(nèi)的純度越高,更多評價方法請讀者結(jié)合實際數(shù)據(jù)集進行分析。

      二.K-Means

      K-Means聚類是最常用的聚類算法,最初起源于信號處理,其目標是將數(shù)據(jù)點劃分為K個類簇,找到每個簇的中心并使其度量最小化。該算法的最大優(yōu)點是簡單、便于理解,運算速度較快,缺點是只能應(yīng)用于連續(xù)型數(shù)據(jù),并且要在聚類前指定聚集的類簇數(shù)。

      1.算法描述

      第一步,確定K值,即將數(shù)據(jù)集聚集成K個類簇或小組。

      第二步,從數(shù)據(jù)集中隨機選擇K個數(shù)據(jù)點作為質(zhì)心(Centroid)或數(shù)據(jù)中心。

      第三步,分別計算每個點到每個質(zhì)心之間的距離,并將每個點劃分到離最近質(zhì)心的小組,跟定了那個質(zhì)心。

      第四步,當每個質(zhì)心都聚集了一些點后,重新定義算法選出新的質(zhì)心。

      第五步,比較新的質(zhì)心和老的質(zhì)心,如果新質(zhì)心和老質(zhì)心之間的距離小于某一個閾值,則表示重新計算的質(zhì)心位置變化不大,收斂穩(wěn)定,則認為聚類已經(jīng)達到了期望的結(jié)果,算法終止。

      第六步,如果新的質(zhì)心和老的質(zhì)心變化很大,即距離大于閾值,則繼續(xù)迭代執(zhí)行第三步到第五步,直到算法終止。

      圖5是對身高和體重進行聚類的算法,將數(shù)據(jù)集的人群聚集成三類。

      2.K-Means聚類示例

      下面通過一個例子講解K-Means聚類算法,從而加深讀者的印象。假設(shè)存在如下表1所示六個點,需要將其聚類成兩堆。流程如下:

      坐標點 X坐標 Y坐標 P1 1 1 P2 2 1 P3 1 3 P4 6 6 P5 8 5 P6 7 8

      在坐標軸中繪制這6個點的分布如圖6所示。

      第一步:隨機選取質(zhì)心。假設(shè)選擇P1和P2點,它們則為聚類的中心。

      第二步:計算其他所有點到質(zhì)心的距離。

      計算過程采用勾股定理,如P3點到P1的距離為:

      P3點到P2距離為:

      P3離P1更近,則選擇跟P1聚集成一堆。同理P4、P5、P6算法如下:

      此時聚類分堆情況如下:

      第一組:P1、P3

      第二組:P2、P4、P5、P6

      第三步:組內(nèi)從新選擇質(zhì)心。

      這里涉及到距離的計算方法,通過不同的距離計算方法可以對K-Means聚類算法進行優(yōu)化。這里計算組內(nèi)每個點X坐標的平均值和Y坐標的平均值,構(gòu)成新的質(zhì)心,它可能是一個虛擬的點。

      第一組新質(zhì)心:

      第二組新質(zhì)心:

      第四步:再次計算各點到新質(zhì)心的距離。此時可以看到P1、P2、P3離PN1質(zhì)心較近,P4、P5、P6離PN2質(zhì)心較近。

      則聚類分堆情況如下,注意由于新的質(zhì)心PN1和PN2是虛擬的兩個點,則不需要對PN1和PN2進行分組。。

      第一組:P1、P2、P3

      第二組:P4、P5、P6

      第五步:同理,按照第三步計算新的質(zhì)心。

      第一組新質(zhì)心:

      第二組新質(zhì)心:

      第六步:計算點到新的質(zhì)心距離。

      這時可以看到P1、P2、P3離PN1更近,P4、P5、P6離PN2更近,所以第二聚類分堆的結(jié)果是:

      第一組:P1、P2、P3

      第二組:P4、P5、P6

      結(jié)論:此時發(fā)現(xiàn),第四步和第六步分組情況都是一樣的,說明聚類已經(jīng)穩(wěn)定收斂,聚類結(jié)束,其聚類結(jié)果P1、P2、P3一組,P4、P5、P6是另一組,這和我們最初預(yù)想的結(jié)果完全一致,說明聚類效果良好。這就是KMeans聚類示例的完整過程。

      3.Sklearn中K-Means用法介紹

      在Sklearn機器學(xué)習(xí)包中,調(diào)用cluster聚類子庫的Kmeans()函數(shù)即可進行Kmeans聚類運算,該算法要求輸入聚類類簇數(shù)。KMeans聚類構(gòu)造方法如下:

      sklearn.cluster.KMeans(n_clusters=8 , init='k-means++' , n_init=10 , max_iter=300 , tol=0.0001 , precompute_distances=True , verbose=0 , random_state=None , copy_x=True , n_jobs=1)

      其中,參數(shù)解釋如下:

      n_clusters:表示K值,聚類類簇數(shù)

      max_iter:表示最大迭代次數(shù),可省略

      n_init:表示用不同初始化質(zhì)心運算的次數(shù),由于K-Means結(jié)果是受初始值影響的局部最優(yōu)的迭代算法,因此需要多運行幾次算法以選擇一個較好的聚類效果,默認是10,一般不需要更改,如果你的K值較大,則可以適當增大這個值

      Init:是初始值選擇的方式,可以為完全隨機選擇’random’,優(yōu)化過的’k-means++‘或者自己指定初始化的K個質(zhì)心,建議使用默認的’k-means++’

      下面舉個簡單的實例,分析前面的例子中的6個點,設(shè)置聚類類簇數(shù)為2(n_clusters=2),調(diào)用KMeans(n_clusters=2)函數(shù)聚類,通過clf.fit()函數(shù)裝載數(shù)據(jù)訓(xùn)練模型。代碼如下:

      from sklearn.cluster import KMeans X = [[1,1],[2,1],[1,3],[6,6],[8,5],[7,8]] y = [0,0,0,1,1,1] clf = KMeans(n_clusters=2) clf.fit(X,y) print(clf) print(clf.labels_)

      輸出結(jié)果如下:

      >>> KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=2, n_init=10, n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001, verbose=0) [0 0 0 1 1 1] >>>

      clf.labels_表示輸出K-means聚類后的類標。由于聚類類簇設(shè)置為2,故類標為0或1,其中X[1,1]、X[2,1]、X[1,3]聚類后屬于0類,X[6,6]、X[8,5]、X[7,8]聚類后屬于1類。

      調(diào)用Matplotlib擴展包的scatter()函數(shù)可以繪制散點圖,代碼的具體含義將在接下來的K-Means分析籃球數(shù)據(jù)中詳細介紹。代碼如下:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn.cluster import KMeans X = [[1,1],[2,1],[1,3],[6,6],[8,5],[7,8]] y = [0,0,0,1,1,1] clf = KMeans(n_clusters=2) clf.fit(X,y) print(clf) print(clf.labels_) import matplotlib.pyplot as plt a = [n[0] for n in X] b = [n[1] for n in X] plt.scatter(a, b, c=clf.labels_) plt.show()

      輸出結(jié)果如圖7所示,其中右上角紅色三個點聚集在一起,左下角藍色三個點聚集在一起,聚類效果明顯。

      讀者為了區(qū)分,建議將不同類簇的點繪制成不同類型的散點圖,便于對比觀察。

      4.K-Means分析籃球數(shù)據(jù)

      (1) 籃球數(shù)據(jù)集

      數(shù)據(jù)集使用的是籃球運動員數(shù)據(jù):KEEL-dateset Basketball dataset,-為:

      http://sci2s.ugr.es/keel/dataset.php?cod=1293

      該數(shù)據(jù)集主要包括5個特征,共96行數(shù)據(jù),特征包括運動員身高(height)、每分鐘助攻數(shù)(assists_per_minute)、運動員出場時間(time_played)、運動員年齡(age)和每分鐘得分數(shù)(points_per_minute)。其特征和值域如圖8所示,比如每分鐘得分數(shù)為0.45,一場正常的NBA比賽共48分鐘,則場均能得21.6分。

      下載籃球數(shù)據(jù)集,前20行數(shù)據(jù)如圖9所示。

      (2) K-Means聚類

      現(xiàn)在需要通過籃球運動員的數(shù)據(jù),判斷該運動員在比賽中屬于什么位置。如果某個運動員得分能力比較強,他可能是得分后衛(wèi);如果籃板能力比較強,他可能是中鋒。

      下面獲取助攻數(shù)和得分數(shù)兩列數(shù)據(jù)的20行,相當于20*2矩陣。主要調(diào)用Sklearn機器學(xué)習(xí)包的KMeans()函數(shù)進行聚類,調(diào)用Matplotlib擴展包繪制圖形。完整代碼如下:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn.cluster import KMeans X = [[0.0888, 0.5885], [0.1399, 0.8291], [0.0747, 0.4974], [0.0983, 0.5772], [0.1276, 0.5703], [0.1671, 0.5835], [0.1906, 0.5276], [0.1061, 0.5523], [0.2446, 0.4007], [0.1670, 0.4770], [0.2485, 0.4313], [0.1227, 0.4909], [0.1240, 0.5668], [0.1461, 0.5113], [0.2315, 0.3788], [0.0494, 0.5590], [0.1107, 0.4799], [0.2521, 0.5735], [0.1007, 0.6318], [0.1067, 0.4326], [0.1956, 0.4280] ] print(X) # Kmeans聚類 clf = KMeans(n_clusters=3) y_pred = clf.fit_predict(X) print(clf) print(y_pred) # 可視化操作 import numpy as np import matplotlib.pyplot as plt x = [n[0] for n in X] y = [n[1] for n in X] plt.scatter(x, y, c=y_pred, marker='x') plt.title("Kmeans-Basketball Data") plt.xlabel("assists_per_minute") plt.ylabel("points_per_minute") plt.legend(["Rank"]) plt.show()

      運行結(jié)果如下圖10所示,從圖中可以看到聚集成三類,頂部紅色點所代表的球員比較厲害,得分和助攻都比較高,可能類似于NBA中喬丹、科比等得分巨星;中間藍色點代表普通球員那一類;右下角綠色表示助攻高得分低的一類球員,可能是控位。代碼中y_pred表示輸出的聚類類標,類簇數(shù)設(shè)置為3,則類標位0、1、2,它與20個球員數(shù)據(jù)一一對應(yīng)。

      from sklearn.cluster import KMeans

      表示在sklearn包中導(dǎo)入KMeans聚類模型,調(diào)用 sklearn.cluster.KMeans 這個類。

      X = [[164,62],[156,50],…]

      X是數(shù)據(jù)集,包括2列20行,對應(yīng)20個球員的助攻數(shù)和得分數(shù)。

      clf = KMeans(n_clusters=3)

      表示調(diào)用KMeans()函數(shù)聚類分析,并將數(shù)據(jù)集聚集成類簇數(shù)為3后的模型賦值給clf。

      y_pred =clf.fit_predict(X)

      調(diào)用clf.fit_predict(X)函數(shù)對X數(shù)據(jù)集(20行數(shù)據(jù))進行聚類分析,并將預(yù)測結(jié)果賦值給y_pred變量,每個y_pred對應(yīng)X的一行數(shù)據(jù),聚成3類,類標分別為0、1、2。

      print(y_pred)

      輸出預(yù)測結(jié)果:[0 2 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1]。

      import matplotlib.pyplot as plt

      導(dǎo)入matplotlib.pyplot擴展包來進行可視化繪圖,as表示重命名為plt,便于后續(xù)調(diào)用。

      x = [n[0] for n in X]

      y = [n[1] for n in X]

      分別獲取獲取第1列和第2列值,并賦值給x和y變量。通過for循環(huán)獲取,n[0]表示X第一列,n[1]表示X第2列。

      plt.scatter(x, y, c=y_pred, marker=‘o’)

      調(diào)用scatter()函數(shù)繪制散點圖,橫軸為x,獲取的第1列數(shù)據(jù);縱軸為y,獲取的第2列數(shù)據(jù);c=y_pred為預(yù)測的聚類結(jié)果類標;marker='o’說明用點表示圖形。

      plt.title(“Kmeans-Basketball Data”)

      表示繪制圖形的標題為“Kmeans-Basketball Data”。

      plt.xlabel(“assists_per_minute”)

      plt.ylabel(“points_per_minute”)

      表示輸出圖形x軸的標題和y軸的標題。

      plt.legend([“Rank”])

      設(shè)置右上角圖例。

      plt.show()

      最后調(diào)用show()函數(shù)將繪制的圖形顯示出來。

      5.K-Means聚類優(yōu)化

      上面的代碼存在一個問題是需要優(yōu)化的,可能細心的讀者已經(jīng)發(fā)現(xiàn)了。那就是前面的代碼定義了X數(shù)組(共20行、每行2個特征),再對其進行數(shù)據(jù)分析,而實際數(shù)據(jù)集通常存儲在TXT、CSV、XLS等格式文件中,并采用讀取文件的方式進行數(shù)據(jù)分析的。那么,如何實現(xiàn)讀取文件中數(shù)據(jù)再進行聚類分析的代碼呢?

      首先,需要將data.txt數(shù)據(jù)讀取,然后賦值到data變量數(shù)組中,代碼如下。

      # -*- coding: utf-8 -*- import os data = [] for line in open("data.txt", "r").readlines(): line = line.rstrip() #刪除換行 result = ' '.join(line.split()) #刪除多余空格,保存一個空格連接 #獲取每行的五個值,如'0 0.0888 201 36.02 28 0.5885',并將字符串轉(zhuǎn)換為小數(shù) s = [float(x) for x in result.strip().split(' ')] #輸出結(jié)果:['0', '0.0888', '201', '36.02', '28', '0.5885'] print(s) #數(shù)據(jù)存儲至data data.append(s) #輸出完整數(shù)據(jù)集 print(data) print(type(data))

      現(xiàn)在輸出的結(jié)果如下:

      ['0 0.0888 201 36.02 28 0.5885', '1 0.1399 198 39.32 30 0.8291', '2 0.0747 198 38.80 26 0.4974', '3 0.0983 191 40.71 30 0.5772', '4 0.1276 196 38.40 28 0.5703', .... ]

      然后需要獲取數(shù)據(jù)集中的任意兩列數(shù)據(jù)進行數(shù)據(jù)分析,賦值給二維矩陣X,對應(yīng)可視化圖形的X軸和Y軸,這里調(diào)用dict將兩列數(shù)據(jù)綁定,再將dict類型轉(zhuǎn)換位list。

      #獲取任意列數(shù)據(jù) print('第一列 第五列數(shù)據(jù)') L2 = [n[0] for n in data] #第一列表示球員每分鐘助攻數(shù):assists_per_minute L5 = [n[4] for n in data] #第五列表示球員每分鐘得分數(shù):points_per_minute T = dict(zip(L2,L5)) #兩列數(shù)據(jù)生成二維數(shù)據(jù) type(T) #下述代碼將dict類型轉(zhuǎn)換為list X = list(map(lambda x,y: (x,y), T.keys(),T.values())) print(type(X)) print(X)

      輸出結(jié)果如下圖所示:

      接下來就是調(diào)用KMeans(n_clusters=3)函數(shù)聚類,聚集的類簇數(shù)為3。輸出聚類預(yù)測結(jié)果,共96行數(shù)據(jù),每個y_pred對應(yīng)X一行數(shù)據(jù)或一個球員,聚成3類,其類標為0、1、2。其中,clf.fit_predict(X) 表示載入數(shù)據(jù)集X訓(xùn)練預(yù)測,并且將聚類的結(jié)果賦值給y_pred。

      from sklearn.cluster import KMeans clf = KMeans(n_clusters=3) y_pred = clf.fit_predict(X) print(clf) print(y_pred)

      最后是可視化分析代碼,并生成三堆指定的圖形和顏色散點圖。

      完整代碼如下:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 #------------------------------------------------------------------------ #第一步 讀取數(shù)據(jù) import os data = [] for line in open("data.txt", "r").readlines(): line = line.rstrip() result = ' '.join(line.split()) #將字符串轉(zhuǎn)換為小數(shù) s = [float(x) for x in result.strip().split(' ')] print(s) data.append(s) print(data) print(type(data)) #------------------------------------------------------------------------ #第二步 獲取兩列數(shù)據(jù) print('第一列 第五列數(shù)據(jù)') L2 = [n[0] for n in data] #第一列表示球員每分鐘助攻數(shù):assists_per_minute L5 = [n[4] for n in data] #第五列表示球員每分鐘得分數(shù):points_per_minute T = dict(zip(L2,L5)) #兩列數(shù)據(jù)生成二維數(shù)據(jù) type(T) print(L2) #下述代碼將dict類型轉(zhuǎn)換為list X = list(map(lambda x,y: (x,y), T.keys(),T.values())) print(type(X)) print(X) #------------------------------------------------------------------------ #第三步 聚類分析 from sklearn.cluster import KMeans clf = KMeans(n_clusters=3) y_pred = clf.fit_predict(X) print(clf) print(y_pred) #------------------------------------------------------------------------ #第四步 繪制圖形 import numpy as np import matplotlib.pyplot as plt #獲取第一列和第二列數(shù)據(jù),使用for循環(huán)獲取,n[0]表示X第一列 x = [n[0] for n in X] y = [n[1] for n in X] #坐標 x1, y1 = [], [] x2, y2 = [], [] x3, y3 = [], [] #分布獲取類標為0、1、2的數(shù)據(jù)并賦值給(x1,y1) (x2,y2) (x3,y3) i = 0 while i < len(X): if y_pred[i]==0: x1.append(X[i][0]) y1.append(X[i][1]) elif y_pred[i]==1: x2.append(X[i][0]) y2.append(X[i][1]) elif y_pred[i]==2: x3.append(X[i][0]) y3.append(X[i][1]) i = i + 1 #三種顏色 紅 綠 藍,marker='x'表示類型,o表示圓點、*表示星型、x表示點 plot1, = plt.plot(x1, y1, 'or', marker="x") plot2, = plt.plot(x2, y2, 'og', marker="o") plot3, = plt.plot(x3, y3, 'ob', marker="*") plt.title("Kmeans-Basketball Data") #繪制標題 plt.xlabel("assists_per_minute") #繪制x軸 plt.ylabel("points_per_minute") #繪制y軸 plt.legend((plot1, plot2, plot3), ('A', 'B', 'C'), fontsize=10) #設(shè)置右上角圖例 plt.show()

      輸出結(jié)果如下圖所示:

      6.設(shè)置類簇中心

      KMeans聚類時,尋找類簇中心或質(zhì)心的過程尤為重要,那么聚類后的質(zhì)心是否可以顯示出來呢?答案是可以的,下面這段代碼就是顯示前面對籃球運動員聚類分析的類簇中心并繪制相關(guān)圖形。完整代碼如下。

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 #------------------------------------------------------------------------ #第一步 讀取數(shù)據(jù) import os data = [] for line in open("data.txt", "r").readlines(): line = line.rstrip() result = ' '.join(line.split()) #將字符串轉(zhuǎn)換為小數(shù) s = [float(x) for x in result.strip().split(' ')] print(s) data.append(s) print(data) print(type(data)) #------------------------------------------------------------------------ #第二步 獲取兩列數(shù)據(jù) print('第一列 第五列數(shù)據(jù)') L2 = [n[0] for n in data] #第一列表示球員每分鐘助攻數(shù):assists_per_minute L5 = [n[4] for n in data] #第五列表示球員每分鐘得分數(shù):points_per_minute T = dict(zip(L2,L5)) #兩列數(shù)據(jù)生成二維數(shù)據(jù) type(T) print(L2) #下述代碼將dict類型轉(zhuǎn)換為list X = list(map(lambda x,y: (x,y), T.keys(),T.values())) print(type(X)) print(X) #------------------------------------------------------------------------ #第三步 聚類分析 from sklearn.cluster import KMeans clf = KMeans(n_clusters=3) y_pred = clf.fit_predict(X) print(clf) print(y_pred) #------------------------------------------------------------------------ #第四步 繪制圖形 import numpy as np import matplotlib.pyplot as plt #獲取第一列和第二列數(shù)據(jù),使用for循環(huán)獲取,n[0]表示X第一列 x = [n[0] for n in X] y = [n[1] for n in X] #坐標 x1, y1 = [], [] x2, y2 = [], [] x3, y3 = [], [] #分布獲取類標為0、1、2的數(shù)據(jù)并賦值給(x1,y1) (x2,y2) (x3,y3) i = 0 while i < len(X): if y_pred[i]==0: x1.append(X[i][0]) y1.append(X[i][1]) elif y_pred[i]==1: x2.append(X[i][0]) y2.append(X[i][1]) elif y_pred[i]==2: x3.append(X[i][0]) y3.append(X[i][1]) i = i + 1 #三種顏色 紅 綠 藍,marker='x'表示類型,o表示圓點、*表示星型、x表示點 plot1, = plt.plot(x1, y1, 'or', marker="x") plot2, = plt.plot(x2, y2, 'og', marker="o") plot3, = plt.plot(x3, y3, 'ob', marker="*") plt.title("Kmeans-Basketball Data") #繪制標題 plt.xlabel("assists_per_minute") #繪制x軸 plt.ylabel("points_per_minute") #繪制y軸 plt.legend((plot1, plot2, plot3), ('A', 'B', 'C'), fontsize=10) #設(shè)置右上角圖例 #------------------------------------------------------------------------ #第五步 設(shè)置類簇中心 centers = clf.cluster_centers_ print(centers) plt.plot(centers[:,0],centers[:,1],'r*',markersize=20) #顯示三個中心點 plt.show()

      輸出如下圖所示,可以看到三個紅色的五角星為類簇中心。

      其中類簇中心的坐標為:

      [[ 0.1741069 0.29691724] [ 0.13618696 0.56265652] [ 0.16596136 0.42713636]]

      三.Birch

      Birch聚類算法稱為平衡迭代歸約及聚類算法,它是一種常用的層次聚類算法。該算法通過聚類特征(Clustering Feature,CF)和聚類特征樹(Clustering Feature Tree,CFT)兩個概念描述聚類。聚類特征樹用來概括聚類的有用信息,由于其占用空間小并且可以存放在內(nèi)存中,從而提高了算法的聚類速度,產(chǎn)生了較高的聚類質(zhì)量,并適用于大型數(shù)據(jù)集。層次聚類算法是講數(shù)據(jù)樣本組成一顆聚類樹,根據(jù)層次分解是以自頂向下(分裂)還是自底向上(合并)方式進一步合并或分裂。

      1.算法描述

      Birch聚類算法的聚類特征(CF)通過三元組結(jié)構(gòu)描述了聚類類簇的基本信息,其中三元組結(jié)構(gòu)公式如下:

      其中,N表示聚類數(shù)據(jù)點的個數(shù),每個點用一個d維向量表示;表示N個聚類數(shù)據(jù)點的線性和;SS表示N個聚類數(shù)據(jù)點的平方和。聚類特征通過線性和表示聚類的質(zhì)心,通過平方和表示聚類的直徑大小。

      Birch算法主要包括以下三個階段:

      設(shè)定初始閾值z并掃描整個數(shù)據(jù)集D,再根據(jù)該閾值建立一棵聚類特征樹T。

      通過提升閾值z重建該聚類特征樹T,從而得到一棵壓縮的CF樹。

      利用全局性聚類算法對CF樹進行聚類,改進聚類質(zhì)量以得到更好的聚類結(jié)果。

      Birch聚類算法具有處理的數(shù)據(jù)規(guī)模大、算法效率高、更容易計算類簇的直徑和類簇之間的距離等優(yōu)點。

      在Sklearn機器學(xué)習(xí)包中,調(diào)用cluster聚類子庫的Birch()函數(shù)即可進行Birch聚類運算,該算法要求輸入聚類類簇數(shù)。Birch類構(gòu)造方法如下:

      sklearn.cluster.Birch(branching_factor=50 , compute_labels=True , copy=True , n_clusters=3 , threshold=0.5)

      其中,最重要的參數(shù)n_clusters=3表示該聚類類簇數(shù)為3,即聚集成3堆。下面舉個簡單的實例,使用前面的例子中的6個點進行,設(shè)置聚類類簇數(shù)為2(n_clusters=2),調(diào)用Birch()函數(shù)聚類,通過clf.fit()裝載數(shù)據(jù)訓(xùn)練模型。代碼如下:

      from sklearn.cluster import Birch X = [[1,1],[2,1],[1,3],[6,6],[8,5],[7,8]] y = [0,0,0,1,1,1] clf = Birch(n_clusters=2) clf.fit(X,y) print(clf.labels_)

      輸出結(jié)果如下:

      >>> [0 0 0 1 1 1] >>>

      clf.labels_表示輸出聚類后的類標。由于聚類類簇設(shè)置為2,故類標為0或1,其中X[1,1]、X[2,1]、X[1,3]聚類后屬于0類,X[6,6]、X[8,5]、X[7,8]聚類后屬于1類。

      2.Birch分析氧化物數(shù)據(jù)

      (1) 數(shù)據(jù)集

      數(shù)據(jù)來源為UCI的玻璃數(shù)據(jù)集(Glass Identification Database)。該數(shù)據(jù)集包括7種類型的玻璃,各個特征是定義它們的氧化物含量(即鈉,鐵,鉀等)。數(shù)據(jù)集中化學(xué)符號包括:Na-鈉、Mg-鎂、Al-鋁、Si-硅、K-鉀、Ca-鈣、Ba-鋇、Fe-鐵。數(shù)據(jù)集為glass.csv文件,前10行數(shù)據(jù)(包括列名第一行)如下圖14所示。

      數(shù)據(jù)集共包含9個特征變量,分別為ri、na、mg、al、si、k、ca、ba、fe,1個類別變量glass_type,共有214個樣本。其中類別變量glass_type包括7個值,分別是:1 表示浮動處理的窗口類型、2表示非浮動處理的窗口類型、3表示浮動處理的加工窗口類型、4表示非浮動處理的加工窗口類型(該類型在該數(shù)據(jù)集中不存在)、5表示集裝箱類型、6表示餐具類型、7表示頭燈類型。

      數(shù)據(jù)集地址:

      http://archive.ics.uci.edu/ml/machine-learning-databases/glass/

      (2) 算法實現(xiàn)

      首先調(diào)用Pandas庫讀取glass.csv文件中的數(shù)據(jù),并繪制簡單的散點圖,代碼如下:

      import pandas as pd import matplotlib.pyplot as plt glass = pd.read_csv("glass.csv") plt.scatter(glass.al, glass.ri, c=glass.glass_type) plt.xlabel('al') plt.ylabel('ri') plt.show()

      首先調(diào)用Pandas的read_csv()函數(shù)讀取文件,然后調(diào)用Matplotlib.pyplot包中的scatter()函數(shù)繪制散點圖。scatter(glass.al, glass.ri, c=glass.glass_type)中鋁元素作為x軸,折射率作為y軸進行散點圖繪制,不同類別glass_type繪制為不同顏色的點(共7個類別)。輸出如圖15所示,可以看到各種顏色的點。

      下面是調(diào)用Birch()函數(shù)進行聚類處理,主要步驟包括:

      調(diào)用Pandas擴展包的read_csv導(dǎo)入玻璃數(shù)據(jù)集,注意獲取兩列數(shù)據(jù),需要轉(zhuǎn)換為二維數(shù)組X。

      從sklearn.cluster包中導(dǎo)入Birch()聚類函數(shù),并設(shè)置聚類類簇數(shù)。

      調(diào)用clf.fit(X, y)函數(shù)訓(xùn)練模型。

      用訓(xùn)練得到的模型進行預(yù)測分析,調(diào)用predict()函數(shù)預(yù)測數(shù)據(jù)集。

      分別獲取三類數(shù)據(jù)集對應(yīng)類的點。

      調(diào)用plot()函數(shù)繪制散點圖,不同類別的數(shù)據(jù)集設(shè)置為不同樣式。

      完整代碼如下:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import Birch #數(shù)據(jù)獲取 glass=pd.read_csv("glass.csv") X1 = glass.al X2 = glass.ri T = dict(zip(X1,X2)) #生成二維數(shù)組 X = list(map(lambda x,y: (x,y), T.keys(),T.values())) #dict類型轉(zhuǎn)換為list y = glass.glass_type #聚類 clf = Birch(n_clusters=3) clf.fit(X, y) y_pred = clf.predict(X) print(y_pred) #分別獲取不同類別數(shù)據(jù)點 x1, y1 = [], [] x2, y2 = [], [] x3, y3 = [], [] i = 0 while i < len(X): if y_pred[i]==0: x1.append(X[i][0]) y1.append(X[i][1]) elif y_pred[i]==1: x2.append(X[i][0]) y2.append(X[i][1]) elif y_pred[i]==2: x3.append(X[i][0]) y3.append(X[i][1]) i = i + 1 #三種顏色 紅 綠 藍,marker='x'表示類型,o表示圓點 *表示星型 x表示點 plot1, = plt.plot(x1, y1, 'or', marker="x") plot2, = plt.plot(x2, y2, 'og', marker="o") plot3, = plt.plot(x3, y3, 'ob', marker="*") plt.xlabel('al') plt.ylabel('ri') plt.show()

      輸出如下圖所示:

      從圖中可以看到,右下角紅色x形點聚集在一起,其al含量較高、ri含量較低;中間綠色o點聚集在一起,其al、ri含量均勻;右部藍色*星形點聚集在一起,其al含量較低、ri含量較高。該Birch算法很好的將數(shù)據(jù)集劃分為三部分。

      但不知道讀者有沒有注意到,在代碼中獲取了兩列數(shù)據(jù)進行聚類,而數(shù)據(jù)集中包含多個特征,如ri、na、mg、al、si、k、ca、ba、fe等,真正的聚類分析中,是可以對多個特征進行分析的,這就涉及到了降維技術(shù)。

      四.結(jié)合降維處理的聚類分析

      任何回歸、聚類和分類算法的復(fù)雜度都依賴于輸入的數(shù)量,為了減少存儲量和計算時間,我們需要降低問題的維度,丟棄不相關(guān)的特征。同時,當數(shù)據(jù)可以用較少的維度表示而不丟失信息時,我們可以對數(shù)據(jù)繪圖,可視化分析它的結(jié)構(gòu)和離群點,數(shù)據(jù)降維由此產(chǎn)生。

      數(shù)據(jù)降維(Dimensionality Reduction)是指采用一個低緯度的特征來表示高緯度特征,其本質(zhì)是構(gòu)造一個映射函數(shù)f:X->Y,其中X是原始數(shù)據(jù)點,用n維向量表示;Y是數(shù)據(jù)點映射后的r維向量,并且n>r。通過這種映射方法,可以將高維空間中的數(shù)據(jù)點降低。

      特征降維一般有兩類方法:特征選擇(Feature Selection)和特征提取(Feature Extraction)。

      特征選擇

      特征選擇是指從高緯度特征中選擇其中的一個子集來作為新的特征。最佳子集表示以最少的維貢獻最大的正確率,丟棄不重要的維,使用合適的誤差函數(shù)產(chǎn)生,特征選擇的方法包括在向前選擇(Forword Selection)和在向后選擇(Backward Selection)。

      特征提取

      特征提取是指將高緯度的特征經(jīng)過某個函數(shù)映射至低緯度作為新的特征。常用的特征抽取方法包括PCA(主成分分析)和LDA(線性判別分析)。圖17表示采用PCA方法將三維圖形尾花數(shù)據(jù)降維成兩維2D圖形。

      1.PCA降維

      主成分分析(Principal Component Analysis,簡稱PCA)是一種常用的線性降維數(shù)據(jù)分析方法,它是在能盡可能保留具有代表性的原特征數(shù)據(jù)點的情況下,將原特征進行線性變換,從而映射至低緯度空間中。

      PCA降維方法通過正交變換將一組可能存在相關(guān)性的變量轉(zhuǎn)換為一組線性不相關(guān)的變量,轉(zhuǎn)換后的這組變量叫做主成分,它可以用于提取數(shù)據(jù)中的主要特征分量,常用于高維數(shù)據(jù)的降維。該方法的重點在于:能否在各個變量之間相關(guān)關(guān)系的基礎(chǔ)上,用較少的新變量代替原來較多的變量,并且這些較少的新變量盡可能多地反映原來較多的變量所提供信息,又能保證新指標之間信息不重疊。

      圖18是將二維樣本的散點圖(紅色三角形點)降低成一維直線(黃色圓點)表示。最理想的情況是這個一維新向量所包含的原始數(shù)據(jù)信息最多,即降維后的直線能盡可能多覆蓋二維圖形中的點,或者所有點到這條直線的距離和最短,這類似于橢圓長軸,該方向上的離散程度最大、方差最大,所包含的信息最多;而橢圓短軸方向上的數(shù)據(jù)變化很少,對數(shù)據(jù)的解釋能力較弱。

      2.Sklearn PCA降維

      下面介紹Sklearn機器學(xué)習(xí)包中PCA降維方法的應(yīng)用。

      導(dǎo)入擴展包

      from sklearn.decomposition import PCA

      調(diào)用降維函數(shù)

      pca = PCA(n_components=2)

      其中參數(shù)n_components=2表示降低為2維,下述代碼是調(diào)用PCA降維方法進行降維操作,將一條直線(二維矩陣)X變量降低為一個點并輸出。

      import numpy as np from sklearn.decomposition import PCA X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) pca = PCA(n_components=2) print(pca) pca.fit(X) print(pca.explained_variance_ratio_)

      輸出如下所示,包括PCA算法原型及降維成2維的結(jié)果。

      [Python從零到壹] 十三.機器學(xué)習(xí)之聚類算法四萬字總結(jié)(K-Means、BIRCH、MeanShift)丨【百變AI秀】

      其結(jié)果表示通過PCA降維方法將六個點或一條直線降低成為一個點,并盡可能表征這六個點的特征。輸出點為:[0.99244289 0.00755711]。

      降維操作

      pca = PCA(n_components=2)

      newData = pca.fit_transform(x)

      調(diào)用PCA()函數(shù)降維,降低成2維數(shù)組,并將降維后的數(shù)據(jù)集賦值給newData變量。下面舉一個例子,載入波士頓(Boston)房價數(shù)據(jù)集,將數(shù)據(jù)集中的13個特征降低為2個特征。核心代碼如下所示:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 #載入數(shù)據(jù)集 from sklearn.datasets import load_boston d = load_boston() x = d.data y = d.target print(x[:2]) print('形狀:', x.shape) #降維 import numpy as np from sklearn.decomposition import PCA pca = PCA(n_components=2) newData = pca.fit_transform(x) print('降維后數(shù)據(jù):') print(newData[:4]) print('形狀:', newData.shape)

      其中,波士頓房價數(shù)據(jù)集共506行,13個特征,經(jīng)過PCA算法降維后,降低為兩個特征,并調(diào)用newData[:4]輸出前4行數(shù)據(jù),輸出結(jié)果如下所示。

      [[ 6.32000000e-03 1.80000000e+01 2.31000000e+00 0.00000000e+00 5.38000000e-01 6.57500000e+00 6.52000000e+01 4.09000000e+00 1.00000000e+00 2.96000000e+02 1.53000000e+01 3.96900000e+02 4.98000000e+00] [ 2.73100000e-02 0.00000000e+00 7.07000000e+00 0.00000000e+00 4.69000000e-01 6.42100000e+00 7.89000000e+01 4.96710000e+00 2.00000000e+00 2.42000000e+02 1.78000000e+01 3.96900000e+02 9.14000000e+00]] 形狀: (506L, 13L) 降維后數(shù)據(jù): [[-119.81821283 5.56072403] [-168.88993091 -10.11419701] [-169.31150637 -14.07855395] [-190.2305986 -18.29993274]] 形狀: (506L, 2L)

      3.PCA降維實例

      前面講述的Birch聚類算法分析氧化物的數(shù)據(jù)只抽取了數(shù)據(jù)集的第一列和第二列數(shù)據(jù),接下來講述對整個數(shù)據(jù)集的所有特征進行聚類的代碼,調(diào)用PCA將數(shù)據(jù)集降低為兩維數(shù)據(jù),再進行可視化操作,完整代碼如下。

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 #第一步 數(shù)據(jù)獲取 import pandas as pd glass = pd.read_csv("glass.csv") print(glass[:4]) #第二步 聚類 from sklearn.cluster import Birch clf = Birch(n_clusters=3) clf.fit(glass) pre = clf.predict(glass) print(pre) #第三步 降維 from sklearn.decomposition import PCA pca = PCA(n_components=2) newData = pca.fit_transform(glass) print(newData[:4]) x1 = [n[0] for n in newData] x2 = [n[1] for n in newData] #第四步 繪圖 import matplotlib.pyplot as plt plt.xlabel("x feature") plt.ylabel("y feature") plt.scatter(x1, x2, c=pre, marker='x') plt.show()

      輸出如圖19所示。核心代碼前面已經(jīng)詳細敘述了,其中[n[0] for n in newData]代碼表示獲取降維后的第一列數(shù)據(jù),[n[1] for n in newData]獲取降維后的第二列數(shù)據(jù),并分別賦值給x1和x2變量,為最后的繪圖做準備。

      同時,上述代碼輸出的前4行數(shù)據(jù)集結(jié)果如下:

      最后簡單講述設(shè)置不同類簇數(shù)的聚類對比代碼,完整代碼如下:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import pandas as pd import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.cluster import Birch #獲取數(shù)據(jù)集及降維 glass = pd.read_csv("glass.csv") pca = PCA(n_components=2) newData = pca.fit_transform(glass) print(newData[:4]) L1 = [n[0] for n in newData] L2 = [n[1] for n in newData] plt.rc('font', family='SimHei', size=8) #設(shè)置字體 plt.rcParams['axes.unicode_minus'] = False #負號 #聚類 類簇數(shù)=2 clf = Birch(n_clusters=2) clf.fit(glass) pre = clf.predict(glass) p1 = plt.subplot(221) plt.title(u"Birch聚類 n=2") plt.scatter(L1,L2,c=pre,marker="s") plt.sca(p1) #聚類 類簇數(shù)=3 clf = Birch(n_clusters=3) clf.fit(glass) pre = clf.predict(glass) p2 = plt.subplot(222) plt.title(u"Birch聚類 n=3") plt.scatter(L1,L2,c=pre,marker="o") plt.sca(p2) #聚類 類簇數(shù)=4 clf = Birch(n_clusters=4) clf.fit(glass) pre = clf.predict(glass) p3 = plt.subplot(223) plt.title(u"Birch聚類 n=4") plt.scatter(L1,L2,c=pre,marker="o") plt.sca(p3) #聚類 類簇數(shù)=5 clf = Birch(n_clusters=5) clf.fit(glass) pre = clf.predict(glass) p4 = plt.subplot(224) plt.title(u"Birch聚類 n=5") plt.scatter(L1,L2,c=pre,marker="s") plt.sca(p4) plt.savefig('18.20.png', dpi=300) plt.show()

      輸出如圖20所示,可以分別看到類簇數(shù)為2、3、4、5的聚類對比情況。需要注意的是不同類簇數(shù)據(jù)點的顏色是不同的,建議讀者下來自己去實現(xiàn)該部分代碼,從實際數(shù)據(jù)分析中體會。

      五.基于均值漂移的圖像聚類

      前面我看到是針對TXT和CSV文件中的數(shù)據(jù),接著我們來看看聚類算法如何應(yīng)用到圖像分割領(lǐng)域。

      1.MeanShift圖像聚類

      均值漂移(Mean Shfit)算法是一種通用的聚類算法,最早是1975年Fukunaga等人在一篇關(guān)于概率密度梯度函數(shù)的估計論文中提出。它是一種無參估計算法,沿著概率梯度的上升方向?qū)ふ曳植嫉姆逯怠ean Shift算法先算出當前點的偏移均值,移動該點到其偏移均值,然后以此為新的起始點,繼續(xù)移動,直到滿足一定的條件結(jié)束。

      圖像分割中可以利用均值漂移算法的特性,實現(xiàn)彩色圖像分割。在OpenCV中提供的函數(shù)為pyrMeanShiftFiltering(),該函數(shù)嚴格來說并不是圖像分割,而是圖像在色彩層面的平滑濾波,它可以中和色彩分布相近的顏色,平滑色彩細節(jié),侵蝕掉面積較小的顏色區(qū)域,所以在OpenCV中它的后綴是濾波“Filter”,而不是分割“segment”。該函數(shù)原型如下所示:

      dst = pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]])

      – src表示輸入圖像,8位三通道的彩色圖像

      – dst表示輸出圖像,需同輸入圖像具有相同的大小和類型

      – sp表示定義漂移物理空間半徑的大小

      – sr表示定義漂移色彩空間半徑的大小

      – maxLevel表示定義金字塔的最大層數(shù)

      – termcrit表示定義的漂移迭代終止條件,可以設(shè)置為迭代次數(shù)滿足終止,迭代目標與中心點偏差滿足終止,或者兩者的結(jié)合

      均值漂移pyrMeanShiftFiltering()函數(shù)的執(zhí)行過程是如下:

      (1) 構(gòu)建迭代空間。

      以輸入圖像上任一點P0為圓心,建立以sp為物理空間半徑,sr為色彩空間半徑的球形空間,物理空間上坐標為x和y,色彩空間上坐標為RGB或HSV,構(gòu)成一個空間球體。其中x和y表示圖像的長和寬,色彩空間R、G、B在0至255之間。

      (2) 求迭代空間的向量并移動迭代空間球體重新計算向量,直至收斂。

      在上一步構(gòu)建的球形空間中,求出所有點相對于中心點的色彩向量之和,移動迭代空間的中心點到該向量的終點,并再次計算該球形空間中所有點的向量之和,如此迭代,直到在最后一個空間球體中所求得向量和的終點就是該空間球體的中心點Pn,迭代結(jié)束。

      (3) 更新輸出圖像dst上對應(yīng)的初始原點P0的色彩值為本輪迭代的終點Pn的色彩值,完成一個點的色彩均值漂移。

      (4) 對輸入圖像src上其他點,依次執(zhí)行上述三個步驟,直至遍歷完所有點后,整個均值偏移色彩濾波完成。

      下面的代碼是圖像均值漂移的實現(xiàn)過程:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像灰度顏色 img = cv2.imread('scenery.png') spatialRad = 100 #空間窗口大小 colorRad = 100 #色彩窗口大小 maxPyrLevel = 2 #金字塔層數(shù) #圖像均值漂移分割 dst = cv2.pyrMeanShiftFiltering( img, spatialRad, colorRad, maxPyrLevel) #顯示圖像 cv2.imshow('src', img) cv2.imshow('dst', dst) cv2.waitKey() cv2.destroyAllWindows()

      當漂移物理空間半徑設(shè)置為50,漂移色彩空間半徑設(shè)置為50,金字塔層數(shù) 為2,輸出的效果圖如圖21所示。

      當漂移物理空間半徑設(shè)置為20,漂移色彩空間半徑設(shè)置為20,金字塔層數(shù)為2,輸出的效果圖如圖22所示。對比可以發(fā)現(xiàn),半徑為20時,圖像色彩細節(jié)大部分存在,半徑為50時,森林和水面的色彩細節(jié)基本都已經(jīng)丟失。

      寫到這里,均值偏移算法對彩色圖像的分割平滑操作就完成了,為了達到更好地分割目的,借助漫水填充函數(shù)進行下一步處理。完整代碼如下所示:

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像灰度顏色 img = cv2.imread('scenery.png') #獲取圖像行和列 rows, cols = img.shape[:2] #mask必須行和列都加2且必須為uint8單通道陣列 mask = np.zeros([rows+2, cols+2], np.uint8) spatialRad = 100 #空間窗口大小 colorRad = 100 #色彩窗口大小 maxPyrLevel = 2 #金字塔層數(shù) #圖像均值漂移分割 dst = cv2.pyrMeanShiftFiltering( img, spatialRad, colorRad, maxPyrLevel) #圖像漫水填充處理 cv2.floodFill(dst, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE) #顯示圖像 cv2.imshow('src', img) cv2.imshow('dst', dst) cv2.waitKey() cv2.destroyAllWindows()

      輸出的效果圖如圖23所示,它將天空染成黃色。

      2.K-Means圖像聚類

      同樣,K-Means算法也能實現(xiàn)圖像分割。在圖像處理中,通過K-Means聚類算法可以實現(xiàn)圖像分割、圖像聚類、圖像識別等操作,本小節(jié)主要用來進行圖像顏色分割。假設(shè)存在一張100×100像素的灰度圖像,它由10000個RGB灰度級組成,我們通過K-Means可以將這些像素點聚類成K個簇,然后使用每個簇內(nèi)的質(zhì)心點來替換簇內(nèi)所有的像素點,這樣就能實現(xiàn)在不改變分辨率的情況下量化壓縮圖像顏色,實現(xiàn)圖像顏色層級分割。

      在OpenCV中,Kmeans()函數(shù)原型如下所示:

      retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])

      – data表示聚類數(shù)據(jù),最好是np.flloat32類型的N維點集

      – K表示聚類類簇數(shù)

      – bestLabels表示輸出的整數(shù)數(shù)組,用于存儲每個樣本的聚類標簽索引

      – criteria表示算法終止條件,即最大迭代次數(shù)或所需精度。在某些迭代中,一旦每個簇中心的移動小于criteria.epsilon,算法就會停止

      – attempts表示重復(fù)試驗kmeans算法的次數(shù),算法返回產(chǎn)生最佳緊湊性的標簽

      – flags表示初始中心的選擇,兩種方法是cv2.KMEANS_PP_CENTERS ;和cv2.KMEANS_RANDOM_CENTERS

      – centers表示集群中心的輸出矩陣,每個集群中心為一行數(shù)據(jù)

      下面使用該方法對灰度圖像顏色進行分割處理,需要注意,在進行K-Means聚類操作之前,需要將RGB像素點轉(zhuǎn)換為一維的數(shù)組,再將各形式的顏色聚集在一起,形成最終的顏色分割。

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像灰度顏色 img = cv2.imread('scenery.png', 0) print(img.shape) #獲取圖像高度、寬度和深度 rows, cols = img.shape[:] #圖像二維像素轉(zhuǎn)換為一維 data = img.reshape((rows * cols, 1)) data = np.float32(data) #定義中心 (type,max_iter,epsilon) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) #設(shè)置標簽 flags = cv2.KMEANS_RANDOM_CENTERS #K-Means聚類 聚集成4類 compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags) #生成最終圖像 dst = labels.reshape((img.shape[0], img.shape[1])) #用來正常顯示中文標簽 plt.rcParams['font.sans-serif']=['SimHei'] #顯示圖像 titles = [u'原始圖像', u'聚類圖像'] images = [img, dst] for i in range(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()

      輸出結(jié)果如圖24所示,左邊為灰度圖像,右邊為K-Means聚類后的圖像,它將灰度級聚集成四個層級,相似的顏色或區(qū)域聚集在一起。

      下面代碼是對彩色圖像進行顏色分割處理,它將彩色圖像聚集成2類、4類和64類。

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('scenery.png') print(img.shape) #圖像二維像素轉(zhuǎn)換為一維 data = img.reshape((-1,3)) data = np.float32(data) #定義中心 (type,max_iter,epsilon) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) #設(shè)置標簽 flags = cv2.KMEANS_RANDOM_CENTERS #K-Means聚類 聚集成2類 compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags) #K-Means聚類 聚集成4類 compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags) #K-Means聚類 聚集成8類 compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags) #K-Means聚類 聚集成16類 compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags) #K-Means聚類 聚集成64類 compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags) #圖像轉(zhuǎn)換回uint8二維類型 centers2 = np.uint8(centers2) res = centers2[labels2.flatten()] dst2 = res.reshape((img.shape)) centers4 = np.uint8(centers4) res = centers4[labels4.flatten()] dst4 = res.reshape((img.shape)) centers8 = np.uint8(centers8) res = centers8[labels8.flatten()] dst8 = res.reshape((img.shape)) centers16 = np.uint8(centers16) res = centers16[labels16.flatten()] dst16 = res.reshape((img.shape)) centers64 = np.uint8(centers64) res = centers64[labels64.flatten()] dst64 = res.reshape((img.shape)) #圖像轉(zhuǎn)換為RGB顯示 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB) dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB) dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB) dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB) dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB) #用來正常顯示中文標簽 plt.rcParams['font.sans-serif']=['SimHei'] #顯示圖像 titles = [u'原始圖像', u'聚類圖像 K=2', u'聚類圖像 K=4', u'聚類圖像 K=8', u'聚類圖像 K=16', u'聚類圖像 K=64'] images = [img, dst2, dst4, dst8, dst16, dst64] for i in range(6): plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()

      輸出結(jié)果如圖10所示,它對比了原始圖像和各K-Means聚類處理后的圖像。當K=2時,聚集成2種顏色;當K=4時,聚集成4種顏色;當K=8時,聚集成8種顏色;當K=16時,聚集成16種顏色;當K=64時,聚集成64種顏色。

      https://blog.csdn.net/eastmount/category_9278090.html

      六.基于文本的樹狀關(guān)鍵詞聚類

      最終輸出結(jié)果如下圖所示,可以看到這個內(nèi)容分為不同的主題,包括網(wǎng)絡(luò)安全、人工智能、圖像處理、算法等。

      # -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import os import codecs from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from sklearn.manifold import TSNE from sklearn.cluster import KMeans import matplotlib.pyplot as plt import numpy as np import pandas as pd import jieba from sklearn import metrics from sklearn.metrics import silhouette_score from array import array from numpy import * from pylab import mpl from sklearn.metrics.pairwise import cosine_similarity import matplotlib.pyplot as plt import matplotlib as mpl from scipy.cluster.hierarchy import ward, dendrogram #---------------------------------------加載語料------------------------------------- text = open('data-fenci.txt').read() print(text) list1=text.split("\n") print(list1) print(list1[0]) print(list1[1]) mytext_list=list1 #控制顯示數(shù)量 count_vec = CountVectorizer(min_df=20, max_df=1000) #最大值忽略 xx1 = count_vec.fit_transform(list1).toarray() word=count_vec.get_feature_names() print("word feature length: {}".format(len(word))) print(word) print(xx1) print(type(xx1)) print(xx1.shape) print(xx1[0]) #---------------------------------------層次聚類------------------------------------- titles = word #dist = cosine_similarity(xx1) mpl.rcParams['font.sans-serif'] = ['SimHei'] df = pd.DataFrame(xx1) print(df.corr()) print(df.corr('spearman')) print(df.corr('kendall')) dist = df.corr() print (dist) print(type(dist)) print(dist.shape) #define the linkage_matrix using ward clustering pre-computed distances linkage_matrix = ward(dist) fig, ax = plt.subplots(figsize=(8, 12)) # set size ax = dendrogram(linkage_matrix, orientation="right", p=20, labels=titles, leaf_font_size=12 ) #leaf_rotation=90., leaf_font_size=12. #show plot with tight layout plt.tight_layout() #save figure as ward_clusters plt.savefig('KH.png', dpi=200) plt.show()

      七.總結(jié)

      寫到這里,這篇文章就結(jié)束了,您是否對聚類有更好的認識呢?

      聚類是把一堆數(shù)據(jù)歸為若干類,同一類數(shù)據(jù)具有某些相似性,并且這些類別是通過數(shù)據(jù)自發(fā)的聚集出來的,而不是事先給定的,也不需要標記結(jié)果,機器學(xué)習(xí)里面稱之為無監(jiān)督學(xué)習(xí),常見的聚類方法包括KMeans、Birch、譜聚類、圖聚類等。聚類被廣泛應(yīng)用于不同場景中,社交網(wǎng)絡(luò)通過聚類來發(fā)現(xiàn)人群,關(guān)注人群的喜好;網(wǎng)頁通過聚類來查找相似文本內(nèi)容;圖像通過聚類來進行分割和檢索相似圖片;電商通過用戶聚類來分析購物的人群、商品推薦以及計算購物最佳時間等。

      一.聚類

      1.算法模型

      2.常見聚類算法

      3.性能評估

      二.K-Means

      1.算法描述

      2.K-Means聚類示例

      3.Sklearn中K-Means用法介紹

      4.K-Means分析籃球數(shù)據(jù)

      5.K-Means聚類優(yōu)化

      6.設(shè)置類簇中心

      三.Birch

      1.算法描述

      2.Birch分析氧化物數(shù)據(jù)

      四.結(jié)合降維處理的聚類分析

      1.PCA降維

      2.Sklearn PCA降維

      3.PCA降維實例

      五.基于均值漂移的圖像聚類

      1.MeanShift圖像聚類

      2.K-Means圖像聚類

      六.基于文本的樹狀關(guān)鍵詞聚類

      七.總結(jié)

      最后希望讀者能復(fù)現(xiàn)每一行代碼,只有實踐才能進步。同時更多聚類算法和原理知識,希望讀者下來自行深入學(xué)習(xí)研究,也推薦大家結(jié)合Sklearn官網(wǎng)和開源網(wǎng)站學(xué)習(xí)更多的機器學(xué)習(xí)知識。

      該系列所有代碼-:

      https://github.com/eastmountyxz/Python-zero2one

      感謝在求學(xué)路上的同行者,不負遇見,勿忘初心。這周的留言感慨~

      感恩能與大家在華為云遇見!

      希望能與大家一起在華為云社區(qū)共同成長,原文地址:https://blog.csdn.net/Eastmount/article/details/118518130

      【百變AI秀】有獎?wù)魑幕馃徇M行中:https://bbs.huaweicloud.com/blogs/29670

      (By:娜璋之家 Eastmount 2021-08-27 夜于貴陽)

      參考文獻:

      [1] 楊秀璋. 專欄:知識圖譜、web數(shù)據(jù)挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.

      [2] 張良均,王路,譚立云,蘇劍林. Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)[M]. 北京:機械工業(yè)出版社,2016.

      [3] (美)Wes McKinney著. 唐學(xué)韜等譯. 利用Python進行數(shù)據(jù)分析[M]. 北京:機械工業(yè)出版社,2013.

      [4] Jiawei Han,Micheline Kamber著. 范明,孟小峰譯. 數(shù)據(jù)挖掘概念與技術(shù). 北京:機械工業(yè)出版社,2007.

      [5] 楊秀璋. [Python數(shù)據(jù)挖掘課程] 二.Kmeans聚類數(shù)據(jù)分析及Anaconda介紹[EB/OL]. (2016-10-10)[2017-11-17]. http://blog.csdn.net/eastmount/article/details/52777308.

      [6] 楊秀璋. [Python數(shù)據(jù)挖掘課程] 三.Kmeans聚類代碼實現(xiàn)、作業(yè)及優(yōu)化[EB/OL]. (2016-10-12)[2017-11-17]. http://blog.csdn.net/eastmount/article/details/52793549.

      [7] 楊秀璋. [Python數(shù)據(jù)挖掘課程] 七.PCA降維操作及subplot子圖繪制[EB/OL]. (2016-11-26)[2017-11-17]. http://blog.csdn.net/eastmount/article/details/53285192

      [8] scikit-learn官網(wǎng). scikit-learn clusterin [EB/OL]. (2017)[2017-11-17]. http://scikit-learn.org/stable/modules/clustering.html#clustering.

      [9] KEEL數(shù)據(jù)集. KEEL-dateset Basketball dataset[EB/OL]. (2017)[2017-11-17]. http://sci2s.ugr.es/keel/dataset.php?cod=1293.

      [10] UCI官網(wǎng). 玻璃數(shù)據(jù)集(Glass Identification Database)[EB\OL]. (2017)[2017-11-17]. http://archive.ics.uci.edu/ml/machine-learning-databases/glass/.

      AI Python 機器學(xué)習(xí)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel兩個表格同時出現(xiàn)如何設(shè)置(excel表格怎么設(shè)置兩個表格同時顯示)
      下一篇:為什么我的WPS做PPT特別卡啊(為什么wps做ppt很卡)
      相關(guān)文章
      亚洲国产综合91精品麻豆| 亚洲尹人香蕉网在线视颅| 亚洲国产综合在线| 久久夜色精品国产嚕嚕亚洲av| 亚洲欧洲精品成人久久奇米网| 无码一区二区三区亚洲人妻| 亚洲avav天堂av在线网毛片| 亚洲av永久无码天堂网| 亚洲AV色无码乱码在线观看| 亚洲а∨精品天堂在线| 人人狠狠综合久久亚洲| 国产成人综合亚洲绿色| 国产大陆亚洲精品国产| 亚洲国产精品成人AV无码久久综合影院| WWW亚洲色大成网络.COM| 自拍偷自拍亚洲精品播放| 国产偷国产偷亚洲清高APP| 午夜亚洲av永久无码精品| 亚洲6080yy久久无码产自国产| 亚洲av成本人无码网站| 亚洲精品国产综合久久一线| 亚洲国产精品综合久久一线| 狠狠亚洲狠狠欧洲2019| 亚洲午夜久久久久久久久电影网 | 亚洲成AV人片在线观看ww| 久久精品国产亚洲麻豆| 亚洲国产精品VA在线观看麻豆| 亚洲成av人影院| 亚洲精品福利在线观看| 亚洲三级视频在线| 亚洲成AV人影片在线观看| 国产成人精品亚洲| 国产亚洲一区二区三区在线不卡| 亚洲最大激情中文字幕| 亚洲AV无码一区东京热久久| 亚洲美女视频一区| 亚洲色在线无码国产精品不卡| 亚洲成a∨人片在无码2023| 亚洲第一区精品日韩在线播放| 久久亚洲中文字幕精品一区| 亚洲av一综合av一区|