[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)
歡迎大家來(lái)到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學(xué)習(xí)和玩耍,看看Python這個(gè)有趣的世界。所有文章都將結(jié)合案例、代碼和作者的經(jīng)驗(yàn)講解,真心想把自己近十年的編程經(jīng)驗(yàn)分享給大家,希望對(duì)您有所幫助,文章中不足之處也請(qǐng)海涵。Python系列整體框架包括基礎(chǔ)語(yǔ)法10篇、網(wǎng)絡(luò)爬蟲30篇、可視化分析10篇、機(jī)器學(xué)習(xí)20篇、大數(shù)據(jù)分析20篇、圖像識(shí)別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關(guān)注、點(diǎn)贊和轉(zhuǎn)發(fā)就是對(duì)秀璋最大的支持,知識(shí)無(wú)價(jià)人有情,希望我們都能在人生路上開心快樂(lè)、共同成長(zhǎng)。
前一篇文章講述了回歸模型的原理知識(shí),包括線性回歸、多項(xiàng)式回歸和邏輯回歸,并詳細(xì)介紹Python Sklearn機(jī)器學(xué)習(xí)庫(kù)的線性回歸和邏輯回歸算法及案例。本文介紹聚類算法的原理知識(shí)級(jí)案例,包括K-Means聚類、BIRCH算法、PCA降維聚類、均值漂移聚類、文本聚類等?;A(chǔ)文章,希望對(duì)您有所幫助。
文章目錄
- 一.聚類
- 1.算法模型
- 2.常見聚類算法
- 3.性能評(píng)估
- 二.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降維實(shí)例
- 五.基于均值漂移的圖像聚類
- 1.MeanShift圖像聚類
- 2.K-Means圖像聚類
- 六.基于文本的樹狀關(guān)鍵詞聚類
- 七.總結(jié)
下載地址:
- https://github.com/eastmountyxz/Python-zero2one
前文賞析:
第一部分 基礎(chǔ)語(yǔ)法
- [Python從零到壹] 一.為什么我們要學(xué)Python及基礎(chǔ)語(yǔ)法詳解
- [Python從零到壹] 二.語(yǔ)法基礎(chǔ)之條件語(yǔ)句、循環(huán)語(yǔ)句和函數(shù)
- [Python從零到壹] 三.語(yǔ)法基礎(chǔ)之文件操作、CSV文件讀寫及面向?qū)ο?/li>
第二部分 網(wǎng)絡(luò)爬蟲
- [Python從零到壹] 四.網(wǎng)絡(luò)爬蟲之入門基礎(chǔ)及正則表達(dá)式抓取博客案例
- [Python從零到壹] 五.網(wǎng)絡(luò)爬蟲之BeautifulSoup基礎(chǔ)語(yǔ)法萬(wàn)字詳解
- [Python從零到壹] 六.網(wǎng)絡(luò)爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解
- [Python從零到壹] 七.網(wǎng)絡(luò)爬蟲之Requests爬取豆瓣電影TOP250及CSV存儲(chǔ)
- [Python從零到壹] 八.數(shù)據(jù)庫(kù)之MySQL基礎(chǔ)知識(shí)及操作萬(wàn)字詳解
- [Python從零到壹] 九.網(wǎng)絡(luò)爬蟲之Selenium基礎(chǔ)技術(shù)萬(wàn)字詳解(定位元素、常用方法、鍵盤鼠標(biāo)操作)
- [Python從零到壹] 十.網(wǎng)絡(luò)爬蟲之Selenium爬取在線百科知識(shí)萬(wàn)字詳解(NLP語(yǔ)料構(gòu)造必備技能)
第三部分 數(shù)據(jù)分析和機(jī)器學(xué)習(xí)
- [Python從零到壹] 十一.數(shù)據(jù)分析之Numpy、Pandas、Matplotlib和Sklearn入門知識(shí)萬(wàn)字詳解(1)
- [Python從零到壹] 十二.機(jī)器學(xué)習(xí)之回歸分析萬(wàn)字總結(jié)全網(wǎng)首發(fā)(線性回歸、多項(xiàng)式回歸、邏輯回歸)
- [Python從零到壹] 十三.機(jī)器學(xué)習(xí)之聚類分析萬(wàn)字總結(jié)全網(wǎng)首發(fā)(K-Means、BIRCH、層次聚類、樹狀聚類)
作者新開的“娜璋AI安全之家”將專注于Python和安全技術(shù),主要分享Web滲透、系統(tǒng)安全、人工智能、大數(shù)據(jù)分析、圖像識(shí)別、惡意代碼檢測(cè)、CVE復(fù)現(xiàn)、威脅情報(bào)分析等文章。雖然作者是一名技術(shù)小白,但會(huì)保證每一篇文章都會(huì)很用心地撰寫,希望這些基礎(chǔ)性文章對(duì)你有所幫助,在Python和安全路上與大家一起進(jìn)步。
在過(guò)去,科學(xué)家會(huì)根據(jù)物種的形狀習(xí)性規(guī)律等特征將其劃分為不同類型的門類,比如將人種劃分為黃種人、白種人和黑種人,這就是簡(jiǎn)單的人工聚類方法。聚類是將數(shù)據(jù)集中某些方面相似的數(shù)據(jù)成員劃分在一起,給定簡(jiǎn)單的規(guī)則,對(duì)數(shù)據(jù)集進(jìn)行分堆,是一種無(wú)監(jiān)督學(xué)習(xí)。聚類集合中,處于相同聚類中的數(shù)據(jù)彼此是相似的,處于不同聚類中的元素彼此是不同的。本章主要介紹聚類概念和常用聚類算法,然后詳細(xì)講述Scikit-Learn機(jī)器學(xué)習(xí)包中聚類算法的用法,并通過(guò)K-Means聚類、Birch層次聚類及PAC降維三個(gè)實(shí)例加深讀者印象。
一.聚類
俗話說(shuō)“物以類聚,人以群分”,聚類(Clustering)就是根據(jù)“物以類聚”的原理而得。從廣義上說(shuō),聚類是將數(shù)據(jù)集中在某些方面相似的數(shù)據(jù)成員放在一起,聚類中處于相同類簇中的數(shù)據(jù)元素彼此相似,處于不同類簇中的元素彼此分離。
由于在聚類中那些表示數(shù)據(jù)類別的分組信息或類標(biāo)是沒(méi)有的,即這些數(shù)據(jù)是沒(méi)有標(biāo)簽的,所有聚類又被稱為無(wú)監(jiān)督學(xué)習(xí)(Unsupervised Learning)。
1.算法模型
聚類是將本身沒(méi)有類別的樣本聚集成不同類型的組,每一組數(shù)據(jù)對(duì)象的集合都叫做簇。聚類的目的是讓屬于同一個(gè)類簇的樣本之間彼此相似,而不同類簇的樣本應(yīng)該分離。圖1表示聚類的算法模型圖。
聚類模型的基本步驟包括:
- 訓(xùn)練。通過(guò)歷史數(shù)據(jù)訓(xùn)練得到一個(gè)聚類模型,該模型用于后面的預(yù)測(cè)分析。需要注意的是,有的聚類算法需要預(yù)先設(shè)定類簇?cái)?shù),如KMeans聚類算法。
- 預(yù)測(cè)。輸入新的數(shù)據(jù)集,用訓(xùn)練得到的聚類模型對(duì)新數(shù)據(jù)集進(jìn)行預(yù)測(cè),即分堆處理,并給每行預(yù)測(cè)數(shù)據(jù)計(jì)算一個(gè)類標(biāo)值。
- 可視化操作及算法評(píng)價(jià)。得到預(yù)測(cè)結(jié)果之后,可以通過(guò)可視化分析反應(yīng)聚類算法的好壞,如果聚類結(jié)果中相同簇的樣本之間距離越近,不同簇的樣本之間距離越遠(yuǎn),其聚類效果越好。同時(shí)采用相關(guān)的評(píng)價(jià)標(biāo)準(zhǔn)對(duì)聚類算法進(jìn)行評(píng)估。
常用聚類模型包括:
- K-Means聚類
- 層次聚類
- DBSCAN
- Affinity Propagatio
- MeanShift
2.常見聚類算法
聚類算法在Scikit-Learn機(jī)器學(xué)習(xí)包中,主要調(diào)用sklearn.cluster子類實(shí)現(xiàn),下面對(duì)常見的聚類算法進(jìn)行簡(jiǎn)單描述,后面主要介紹K-Means算法和Birch算法實(shí)例。
(1) K-Means
K-Means聚類算法最早起源于信號(hào)處理,是一種最經(jīng)典的聚類分析方法。它是一種自下而上的聚類方法,采用劃分法實(shí)現(xiàn),其優(yōu)點(diǎn)是簡(jiǎn)單、速度快;缺點(diǎn)是必須提供聚類的數(shù)目,并且聚類結(jié)果與初始中心的選擇有關(guān),若不知道樣本集要聚成多少個(gè)類別,則無(wú)法使用K-Means算法。Sklearn包中調(diào)用方法如下:
(2) Mini Batch K-Means
Mini Batch K-means是KMeans的一種變換,目的為了減少計(jì)算時(shí)間。其實(shí)現(xiàn)類是MiniBatchKMeans。Sklearn包中調(diào)用方法如下:
(3) Birch
Birch是平衡迭代歸約及聚類算法,全稱為Balanced Iterative Reducing and Clustering using Hierarchies,是一種常用的層次聚類算法。該算法通過(guò)聚類特征(Clustering Feature,CF)和聚類特征樹(Clustering Feature Tree,CFT)兩個(gè)概念描述聚類。聚類特征樹用來(lái)概括聚類的有用信息,由于其占用空間小并且可以存放在內(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算法聚成兩類,并對(duì)X數(shù)據(jù)進(jìn)行訓(xùn)練,共6個(gè)點(diǎn)(1、2、3、4、3、2),然后預(yù)測(cè)其聚類后的類標(biāo),輸出為0或1兩類結(jié)果,其中點(diǎn)1、2、2輸出類標(biāo)為1,點(diǎn)3、4、3輸出類標(biāo)為0。這是一個(gè)較好的聚類結(jié)果,因?yàn)橹递^大的點(diǎn)(3、4)聚集為一類,值較小的點(diǎn)(1、2)聚集為另一類。這里只是進(jìn)行了簡(jiǎn)單描述,后面將講述具體的算法及實(shí)例。
(4) Mean Shift
Mean Shift是均值偏移或均值漂移聚類算法,最早是1975年Fukunaga等人在一篇關(guān)于概率密度梯度函數(shù)的估計(jì)論文中提出。它是一種無(wú)參估計(jì)算法,沿著概率梯度的上升方向?qū)ふ曳植嫉姆逯怠ean Shift算法先算出當(dāng)前點(diǎn)的偏移均值,移動(dòng)該點(diǎn)到其偏移均值,然后以此為新的起始點(diǎn),繼續(xù)移動(dòng),直到滿足一定的條件結(jié)束。
(5) DBSCAN
DBSCAN是一個(gè)典型的基于密度的聚類算法,它與劃分聚類方法、層次聚類方法不同,它將簇定義為密度相連的點(diǎn)的最大集合,能夠把具有足夠高密度的區(qū)域劃分為簇,并可在噪聲的空間數(shù)據(jù)庫(kù)中發(fā)現(xiàn)任意形狀的聚類。與K-Means方法相比,DBSCAN不需要事先知道要形成的簇類的數(shù)目,它可以發(fā)現(xiàn)任意形狀的簇類,同時(shí)該算法能夠識(shí)別出噪聲點(diǎn),對(duì)于數(shù)據(jù)集中樣本的順序不敏感。但也存在一定缺點(diǎn):DBSCAN聚類算法不能很好反映高維數(shù)據(jù)。
3.性能評(píng)估
聚類根據(jù)文檔的相似性把一個(gè)文檔集合中的文檔分成若干類,但是究竟分成多少類,這個(gè)要取決于文檔集合里文檔自身的性質(zhì)。圖3是Scikit-Learn官網(wǎng)中DBSCAN聚類示例結(jié)果,該聚類算法應(yīng)該把文檔集合分成3類,而不是2類或4類,這就涉及到了聚類算法評(píng)價(jià)。
聚類算法的評(píng)價(jià)應(yīng)該考慮:聚類之間是否較好地相互分離、同一類簇中的點(diǎn)是否都靠近的中心點(diǎn)、聚類算法是否正確識(shí)別數(shù)據(jù)的類簇或標(biāo)記。聚類算法的常見評(píng)價(jià)指標(biāo)包括純度(Purity)、F值(F-measure)、熵值(Entropy)和RI,其中F值最為常用。
(1) F值(F-measure)
F值(F-measure或F-score)的計(jì)算包括兩個(gè)指標(biāo):精確率(Precision)和召回率(Recall)。精確率定義為檢索出相關(guān)文檔數(shù)與檢索出的文檔總數(shù)的比率,衡量的是檢索系統(tǒng)的查準(zhǔn)率;召回率定義為檢索出的相關(guān)文檔數(shù)和文檔庫(kù)中所有相關(guān)文檔數(shù)的比率,衡量的是檢索系統(tǒng)的查全率。公式如下:
其中,參數(shù)N表示實(shí)驗(yàn)結(jié)果中正確識(shí)別出的聚類類簇?cái)?shù),S表示實(shí)驗(yàn)結(jié)果中實(shí)際識(shí)別出的聚類類簇?cái)?shù),T表示數(shù)據(jù)集中所有真實(shí)存在的聚類相關(guān)類簇?cái)?shù)。
精確率和召回率兩個(gè)評(píng)估指標(biāo)在特定的情況下是相互制約的,因而很難使用單一的評(píng)價(jià)指標(biāo)來(lái)衡量實(shí)驗(yàn)的效果。F-值是準(zhǔn)確率和召回率的調(diào)和平均值,它可作為衡量實(shí)驗(yàn)結(jié)果的最終評(píng)價(jià)指標(biāo),F值更接近兩個(gè)數(shù)中較小的那個(gè)。F值指的計(jì)算公式如下公式所示:
(2) 純度(Purity)
Purity方法是極為簡(jiǎn)單的一種聚類評(píng)價(jià)方法,它表示正確聚類的文檔數(shù)占總文檔數(shù)的比例。公式如下:
其中,參數(shù)m表示整個(gè)聚類劃分涉及的成員個(gè)數(shù);聚類i的純度定義為Pi;K表示聚類的類簇?cái)?shù)目。舉個(gè)示例,假設(shè)聚類成3堆,其中x表示一類數(shù)據(jù)集,o表示一類數(shù)據(jù)集,◇表示一類數(shù)據(jù)集,如圖4所示。
純度為正確聚類的文檔數(shù)占總文檔數(shù)的比例,即:purity=(5+4+3)/17=0.71。其中第一堆聚集正確5個(gè)x,第二堆正確聚集4個(gè)o,第三隊(duì)正確聚集3個(gè)◇。Purity方法優(yōu)點(diǎn)在于計(jì)算過(guò)程簡(jiǎn)便,值在0~1之間,完全錯(cuò)誤的聚類方法值為0,完全正確的聚類方法值為1;其缺點(diǎn)是無(wú)法對(duì)聚類方法給出正確的評(píng)價(jià),尤其是每個(gè)文檔單獨(dú)聚集成一類的情況。
(3) 蘭德指數(shù)(RI)
蘭德指數(shù)(Rand Index,簡(jiǎn)稱RI)是一種用排列組合原理來(lái)對(duì)聚類進(jìn)行評(píng)價(jià)的手段,公式如下:
其中參數(shù)TP表示被聚在一類的兩個(gè)文檔被正確分類,TN表示不應(yīng)該被聚在一類的兩個(gè)文檔被正確分開,FP表示不應(yīng)該放在一類的文檔被錯(cuò)誤的放在了一類,FN表示不應(yīng)該分開的文檔被錯(cuò)誤的分開。
RI越大表示聚類效果準(zhǔn)確性越高,同時(shí)每個(gè)類內(nèi)的純度越高,更多評(píng)價(jià)方法請(qǐng)讀者結(jié)合實(shí)際數(shù)據(jù)集進(jìn)行分析。
二.K-Means
K-Means聚類是最常用的聚類算法,最初起源于信號(hào)處理,其目標(biāo)是將數(shù)據(jù)點(diǎn)劃分為K個(gè)類簇,找到每個(gè)簇的中心并使其度量最小化。該算法的最大優(yōu)點(diǎn)是簡(jiǎn)單、便于理解,運(yùn)算速度較快,缺點(diǎn)是只能應(yīng)用于連續(xù)型數(shù)據(jù),并且要在聚類前指定聚集的類簇?cái)?shù)。
1.算法描述
(1) K-Means聚類算法流程
下面作者采用通俗易懂的方法描述K-Means聚類算法的分析流程,步驟如下:
- 第一步,確定K值,即將數(shù)據(jù)集聚集成K個(gè)類簇或小組。
- 第二步,從數(shù)據(jù)集中隨機(jī)選擇K個(gè)數(shù)據(jù)點(diǎn)作為質(zhì)心(Centroid)或數(shù)據(jù)中心。
- 第三步,分別計(jì)算每個(gè)點(diǎn)到每個(gè)質(zhì)心之間的距離,并將每個(gè)點(diǎn)劃分到離最近質(zhì)心的小組,跟定了那個(gè)質(zhì)心。
- 第四步,當(dāng)每個(gè)質(zhì)心都聚集了一些點(diǎn)后,重新定義算法選出新的質(zhì)心。
- 第五步,比較新的質(zhì)心和老的質(zhì)心,如果新質(zhì)心和老質(zhì)心之間的距離小于某一個(gè)閾值,則表示重新計(jì)算的質(zhì)心位置變化不大,收斂穩(wěn)定,則認(rèn)為聚類已經(jīng)達(dá)到了期望的結(jié)果,算法終止。
- 第六步,如果新的質(zhì)心和老的質(zhì)心變化很大,即距離大于閾值,則繼續(xù)迭代執(zhí)行第三步到第五步,直到算法終止。
圖5是對(duì)身高和體重進(jìn)行聚類的算法,將數(shù)據(jù)集的人群聚集成三類。
2.K-Means聚類示例
下面通過(guò)一個(gè)例子講解K-Means聚類算法,從而加深讀者的印象。假設(shè)存在如下表1所示六個(gè)點(diǎn),需要將其聚類成兩堆。流程如下:
坐標(biāo)點(diǎn) X坐標(biāo) Y坐標(biāo) P1 1 1 P2 2 1 P3 1 3 P4 6 6 P5 8 5 P6 7 8在坐標(biāo)軸中繪制這6個(gè)點(diǎn)的分布如圖6所示。
第一步:隨機(jī)選取質(zhì)心。假設(shè)選擇P1和P2點(diǎn),它們則為聚類的中心。
第二步:計(jì)算其他所有點(diǎn)到質(zhì)心的距離。
計(jì)算過(guò)程采用勾股定理,如P3點(diǎn)到P1的距離為:
P3點(diǎn)到P2距離為:
P3離P1更近,則選擇跟P1聚集成一堆。同理P4、P5、P6算法如下:
此時(shí)聚類分堆情況如下:
- 第一組:P1、P3
- 第二組:P2、P4、P5、P6
第三步:組內(nèi)從新選擇質(zhì)心。
這里涉及到距離的計(jì)算方法,通過(guò)不同的距離計(jì)算方法可以對(duì)K-Means聚類算法進(jìn)行優(yōu)化。這里計(jì)算組內(nèi)每個(gè)點(diǎn)X坐標(biāo)的平均值和Y坐標(biāo)的平均值,構(gòu)成新的質(zhì)心,它可能是一個(gè)虛擬的點(diǎn)。
- 第一組新質(zhì)心:
- 第二組新質(zhì)心:
第四步:再次計(jì)算各點(diǎn)到新質(zhì)心的距離。此時(shí)可以看到P1、P2、P3離PN1質(zhì)心較近,P4、P5、P6離PN2質(zhì)心較近。
則聚類分堆情況如下,注意由于新的質(zhì)心PN1和PN2是虛擬的兩個(gè)點(diǎn),則不需要對(duì)PN1和PN2進(jìn)行分組。。
- 第一組:P1、P2、P3
- 第二組:P4、P5、P6
第五步:同理,按照第三步計(jì)算新的質(zhì)心。
- 第一組新質(zhì)心:
- 第二組新質(zhì)心:
第六步:計(jì)算點(diǎn)到新的質(zhì)心距離。
這時(shí)可以看到P1、P2、P3離PN1更近,P4、P5、P6離PN2更近,所以第二聚類分堆的結(jié)果是:
- 第一組:P1、P2、P3
- 第二組:P4、P5、P6
結(jié)論:此時(shí)發(fā)現(xiàn),第四步和第六步分組情況都是一樣的,說(shuō)明聚類已經(jīng)穩(wěn)定收斂,聚類結(jié)束,其聚類結(jié)果P1、P2、P3一組,P4、P5、P6是另一組,這和我們最初預(yù)想的結(jié)果完全一致,說(shuō)明聚類效果良好。這就是KMeans聚類示例的完整過(guò)程。
3.Sklearn中K-Means用法介紹
在Sklearn機(jī)器學(xué)習(xí)包中,調(diào)用cluster聚類子庫(kù)的Kmeans()函數(shù)即可進(jìn)行Kmeans聚類運(yùn)算,該算法要求輸入聚類類簇?cái)?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值,聚類類簇?cái)?shù)
- max_iter:表示最大迭代次數(shù),可省略
- n_init:表示用不同初始化質(zhì)心運(yùn)算的次數(shù),由于K-Means結(jié)果是受初始值影響的局部最優(yōu)的迭代算法,因此需要多運(yùn)行幾次算法以選擇一個(gè)較好的聚類效果,默認(rèn)是10,一般不需要更改,如果你的K值較大,則可以適當(dāng)增大這個(gè)值
- Init:是初始值選擇的方式,可以為完全隨機(jī)選擇’random’,優(yōu)化過(guò)的’k-means++‘或者自己指定初始化的K個(gè)質(zhì)心,建議使用默認(rèn)的’k-means++’
下面舉個(gè)簡(jiǎn)單的實(shí)例,分析前面的例子中的6個(gè)點(diǎn),設(shè)置聚類類簇?cái)?shù)為2(n_clusters=2),調(diào)用KMeans(n_clusters=2)函數(shù)聚類,通過(guò)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聚類后的類標(biāo)。由于聚類類簇設(shè)置為2,故類標(biāo)為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擴(kuò)展包的scatter()函數(shù)可以繪制散點(diǎn)圖,代碼的具體含義將在接下來(lái)的K-Means分析籃球數(shù)據(jù)中詳細(xì)介紹。代碼如下:
# -*- 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所示,其中右上角紅色三個(gè)點(diǎn)聚集在一起,左下角藍(lán)色三個(gè)點(diǎn)聚集在一起,聚類效果明顯。
讀者為了區(qū)分,建議將不同類簇的點(diǎn)繪制成不同類型的散點(diǎn)圖,便于對(duì)比觀察。
4.K-Means分析籃球數(shù)據(jù)
(1) 籃球數(shù)據(jù)集
數(shù)據(jù)集使用的是籃球運(yùn)動(dòng)員數(shù)據(jù):KEEL-dateset Basketball dataset,下載地址為:
- http://sci2s.ugr.es/keel/dataset.php?cod=1293
該數(shù)據(jù)集主要包括5個(gè)特征,共96行數(shù)據(jù),特征包括運(yùn)動(dòng)員身高(height)、每分鐘助攻數(shù)(assists_per_minute)、運(yùn)動(dòng)員出場(chǎng)時(shí)間(time_played)、運(yùn)動(dòng)員年齡(age)和每分鐘得分?jǐn)?shù)(points_per_minute)。其特征和值域如圖8所示,比如每分鐘得分?jǐn)?shù)為0.45,一場(chǎng)正常的NBA比賽共48分鐘,則場(chǎng)均能得21.6分。
下載籃球數(shù)據(jù)集,前20行數(shù)據(jù)如圖9所示。
(2) K-Means聚類
現(xiàn)在需要通過(guò)籃球運(yùn)動(dòng)員的數(shù)據(jù),判斷該運(yùn)動(dòng)員在比賽中屬于什么位置。如果某個(gè)運(yùn)動(dòng)員得分能力比較強(qiáng),他可能是得分后衛(wèi);如果籃板能力比較強(qiáng),他可能是中鋒。
下面獲取助攻數(shù)和得分?jǐn)?shù)兩列數(shù)據(jù)的20行,相當(dāng)于20*2矩陣。主要調(diào)用Sklearn機(jī)器學(xué)習(xí)包的KMeans()函數(shù)進(jìn)行聚類,調(diào)用Matplotlib擴(kuò)展包繪制圖形。完整代碼如下:
# -*- 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()運(yùn)行結(jié)果如下圖10所示,從圖中可以看到聚集成三類,頂部紅色點(diǎn)所代表的球員比較厲害,得分和助攻都比較高,可能類似于NBA中喬丹、科比等得分巨星;中間藍(lán)色點(diǎn)代表普通球員那一類;右下角綠色表示助攻高得分低的一類球員,可能是控位。代碼中y_pred表示輸出的聚類類標(biāo),類簇?cái)?shù)設(shè)置為3,則類標(biāo)位0、1、2,它與20個(gè)球員數(shù)據(jù)一一對(duì)應(yīng)。
(3) 代碼詳解
推薦讀者結(jié)合作者分享的文件用法進(jìn)行讀取及聚類。
-
from sklearn.cluster import KMeans
表示在sklearn包中導(dǎo)入KMeans聚類模型,調(diào)用 sklearn.cluster.KMeans 這個(gè)類。 -
X = [[164,62],[156,50],…]
X是數(shù)據(jù)集,包括2列20行,對(duì)應(yīng)20個(gè)球員的助攻數(shù)和得分?jǐn)?shù)。 -
clf = KMeans(n_clusters=3)
表示調(diào)用KMeans()函數(shù)聚類分析,并將數(shù)據(jù)集聚集成類簇?cái)?shù)為3后的模型賦值給clf。 -
y_pred =clf.fit_predict(X)
調(diào)用clf.fit_predict(X)函數(shù)對(duì)X數(shù)據(jù)集(20行數(shù)據(jù))進(jìn)行聚類分析,并將預(yù)測(cè)結(jié)果賦值給y_pred變量,每個(gè)y_pred對(duì)應(yīng)X的一行數(shù)據(jù),聚成3類,類標(biāo)分別為0、1、2。 -
print(y_pred)
輸出預(yù)測(cè)結(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擴(kuò)展包來(lái)進(jìn)行可視化繪圖,as表示重命名為plt,便于后續(xù)調(diào)用。 -
x = [n[0] for n in X]
y = [n[1] for n in X]
分別獲取獲取第1列和第2列值,并賦值給x和y變量。通過(guò)for循環(huán)獲取,n[0]表示X第一列,n[1]表示X第2列。 -
plt.scatter(x, y, c=y_pred, marker=‘o’)
調(diào)用scatter()函數(shù)繪制散點(diǎn)圖,橫軸為x,獲取的第1列數(shù)據(jù);縱軸為y,獲取的第2列數(shù)據(jù);c=y_pred為預(yù)測(cè)的聚類結(jié)果類標(biāo);marker='o’說(shuō)明用點(diǎn)表示圖形。 -
plt.title(“Kmeans-Basketball Data”)
表示繪制圖形的標(biāo)題為“Kmeans-Basketball Data”。 -
plt.xlabel(“assists_per_minute”)
-
plt.ylabel(“points_per_minute”)
表示輸出圖形x軸的標(biāo)題和y軸的標(biāo)題。 -
plt.legend([“Rank”])
設(shè)置右上角圖例。 -
plt.show()
最后調(diào)用show()函數(shù)將繪制的圖形顯示出來(lái)。
5.K-Means聚類優(yōu)化
上面的代碼存在一個(gè)問(wèn)題是需要優(yōu)化的,可能細(xì)心的讀者已經(jīng)發(fā)現(xiàn)了。那就是前面的代碼定義了X數(shù)組(共20行、每行2個(gè)特征),再對(duì)其進(jìn)行數(shù)據(jù)分析,而實(shí)際數(shù)據(jù)集通常存儲(chǔ)在TXT、CSV、XLS等格式文件中,并采用讀取文件的方式進(jìn)行數(shù)據(jù)分析的。那么,如何實(shí)現(xiàn)讀取文件中數(shù)據(jù)再進(jìn)行聚類分析的代碼呢?
接下來(lái),作者將完整的96行籃球數(shù)據(jù)存儲(chǔ)至TXT文件進(jìn)行讀取操作,再調(diào)用K-Means算法聚類分析,并將聚集的三類數(shù)據(jù)繪制成想要的顏色和形狀。假設(shè)下載的籃球數(shù)據(jù)集存在在本地data.txt文件中,如下所示。
首先,需要將data.txt數(shù)據(jù)讀取,然后賦值到data變量數(shù)組中,代碼如下。
# -*- coding: utf-8 -*- import osdata = [] for line in open("data.txt", "r").readlines(): line = line.rstrip() #刪除換行 result = ' '.join(line.split()) #刪除多余空格,保存一個(gè)空格連接#獲取每行的五個(gè)值,如'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ù)存儲(chǔ)至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ù)進(jìn)行數(shù)據(jù)分析,賦值給二維矩陣X,對(duì)應(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] #第五列表示球員每分鐘得分?jǐn)?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é)果如下圖所示:
接下來(lái)就是調(diào)用KMeans(n_clusters=3)函數(shù)聚類,聚集的類簇?cái)?shù)為3。輸出聚類預(yù)測(cè)結(jié)果,共96行數(shù)據(jù),每個(gè)y_pred對(duì)應(yīng)X一行數(shù)據(jù)或一個(gè)球員,聚成3類,其類標(biāo)為0、1、2。其中,clf.fit_predict(X) 表示載入數(shù)據(jù)集X訓(xùn)練預(yù)測(cè),并且將聚類的結(jié)果賦值給y_pred。
from sklearn.cluster import KMeans clf = KMeans(n_clusters=3) y_pred = clf.fit_predict(X) print(clf) print(y_pred)最后是可視化分析代碼,并生成三堆指定的圖形和顏色散點(diǎn)圖。
完整代碼如下:
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03#------------------------------------------------------------------------ #第一步 讀取數(shù)據(jù) import osdata = [] 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] #第五列表示球員每分鐘得分?jǐn)?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]#坐標(biāo) x1, y1 = [], [] x2, y2 = [], [] x3, y3 = [], [] #分布獲取類標(biāo)為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 #三種顏色 紅 綠 藍(lán),marker='x'表示類型,o表示圓點(diǎn)、*表示星型、x表示點(diǎn) 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") #繪制標(biāo)題 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聚類時(shí),尋找類簇中心或質(zhì)心的過(guò)程尤為重要,那么聚類后的質(zhì)心是否可以顯示出來(lái)呢?答案是可以的,下面這段代碼就是顯示前面對(duì)籃球運(yùn)動(dòng)員聚類分析的類簇中心并繪制相關(guān)圖形。完整代碼如下。
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03#------------------------------------------------------------------------ #第一步 讀取數(shù)據(jù) import osdata = [] 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] #第五列表示球員每分鐘得分?jǐn)?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]#坐標(biāo) x1, y1 = [], [] x2, y2 = [], [] x3, y3 = [], [] #分布獲取類標(biāo)為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 #三種顏色 紅 綠 藍(lán),marker='x'表示類型,o表示圓點(diǎn)、*表示星型、x表示點(diǎn) 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") #繪制標(biāo)題 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) #顯示三個(gè)中心點(diǎn) plt.show()輸出如下圖所示,可以看到三個(gè)紅色的五角星為類簇中心。
其中類簇中心的坐標(biāo)為:
[[ 0.1741069 0.29691724][ 0.13618696 0.56265652][ 0.16596136 0.42713636]]三.Birch
Birch聚類算法稱為平衡迭代歸約及聚類算法,它是一種常用的層次聚類算法。該算法通過(guò)聚類特征(Clustering Feature,CF)和聚類特征樹(Clustering Feature Tree,CFT)兩個(gè)概念描述聚類。聚類特征樹用來(lái)概括聚類的有用信息,由于其占用空間小并且可以存放在內(nèi)存中,從而提高了算法的聚類速度,產(chǎn)生了較高的聚類質(zhì)量,并適用于大型數(shù)據(jù)集。層次聚類算法是講數(shù)據(jù)樣本組成一顆聚類樹,根據(jù)層次分解是以自頂向下(分裂)還是自底向上(合并)方式進(jìn)一步合并或分裂。
1.算法描述
Birch聚類算法的聚類特征(CF)通過(guò)三元組結(jié)構(gòu)描述了聚類類簇的基本信息,其中三元組結(jié)構(gòu)公式如下:
其中,N表示聚類數(shù)據(jù)點(diǎn)的個(gè)數(shù),每個(gè)點(diǎn)用一個(gè)d維向量表示;表示N個(gè)聚類數(shù)據(jù)點(diǎn)的線性和;SS表示N個(gè)聚類數(shù)據(jù)點(diǎn)的平方和。聚類特征通過(guò)線性和表示聚類的質(zhì)心,通過(guò)平方和表示聚類的直徑大小。
Birch算法主要包括以下三個(gè)階段:
- 設(shè)定初始閾值z(mì)并掃描整個(gè)數(shù)據(jù)集D,再根據(jù)該閾值建立一棵聚類特征樹T。
- 通過(guò)提升閾值z(mì)重建該聚類特征樹T,從而得到一棵壓縮的CF樹。
- 利用全局性聚類算法對(duì)CF樹進(jìn)行聚類,改進(jìn)聚類質(zhì)量以得到更好的聚類結(jié)果。
Birch聚類算法具有處理的數(shù)據(jù)規(guī)模大、算法效率高、更容易計(jì)算類簇的直徑和類簇之間的距離等優(yōu)點(diǎn)。
在Sklearn機(jī)器學(xué)習(xí)包中,調(diào)用cluster聚類子庫(kù)的Birch()函數(shù)即可進(jìn)行Birch聚類運(yùn)算,該算法要求輸入聚類類簇?cái)?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表示該聚類類簇?cái)?shù)為3,即聚集成3堆。下面舉個(gè)簡(jiǎn)單的實(shí)例,使用前面的例子中的6個(gè)點(diǎn)進(jìn)行,設(shè)置聚類類簇?cái)?shù)為2(n_clusters=2),調(diào)用Birch()函數(shù)聚類,通過(guò)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_表示輸出聚類后的類標(biāo)。由于聚類類簇設(shè)置為2,故類標(biāo)為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ù)來(lái)源為UCI的玻璃數(shù)據(jù)集(Glass Identification Database)。該數(shù)據(jù)集包括7種類型的玻璃,各個(gè)特征是定義它們的氧化物含量(即鈉,鐵,鉀等)。數(shù)據(jù)集中化學(xué)符號(hào)包括:Na-鈉、Mg-鎂、Al-鋁、Si-硅、K-鉀、Ca-鈣、Ba-鋇、Fe-鐵。數(shù)據(jù)集為glass.csv文件,前10行數(shù)據(jù)(包括列名第一行)如下圖14所示。
數(shù)據(jù)集共包含9個(gè)特征變量,分別為ri、na、mg、al、si、k、ca、ba、fe,1個(gè)類別變量glass_type,共有214個(gè)樣本。其中類別變量glass_type包括7個(gè)值,分別是:1 表示浮動(dòng)處理的窗口類型、2表示非浮動(dòng)處理的窗口類型、3表示浮動(dòng)處理的加工窗口類型、4表示非浮動(dòng)處理的加工窗口類型(該類型在該數(shù)據(jù)集中不存在)、5表示集裝箱類型、6表示餐具類型、7表示頭燈類型。
數(shù)據(jù)集地址:
- http://archive.ics.uci.edu/ml/machine-learning-databases/glass/
(2) 算法實(shí)現(xiàn)
首先調(diào)用Pandas庫(kù)讀取glass.csv文件中的數(shù)據(jù),并繪制簡(jiǎn)單的散點(diǎn)圖,代碼如下:
首先調(diào)用Pandas的read_csv()函數(shù)讀取文件,然后調(diào)用Matplotlib.pyplot包中的scatter()函數(shù)繪制散點(diǎn)圖。scatter(glass.al, glass.ri, c=glass.glass_type)中鋁元素作為x軸,折射率作為y軸進(jìn)行散點(diǎn)圖繪制,不同類別glass_type繪制為不同顏色的點(diǎn)(共7個(gè)類別)。輸出如圖15所示,可以看到各種顏色的點(diǎn)。
下面是調(diào)用Birch()函數(shù)進(jìn)行聚類處理,主要步驟包括:
- 調(diào)用Pandas擴(kuò)展包的read_csv導(dǎo)入玻璃數(shù)據(jù)集,注意獲取兩列數(shù)據(jù),需要轉(zhuǎn)換為二維數(shù)組X。
- 從sklearn.cluster包中導(dǎo)入Birch()聚類函數(shù),并設(shè)置聚類類簇?cái)?shù)。
- 調(diào)用clf.fit(X, y)函數(shù)訓(xùn)練模型。
- 用訓(xùn)練得到的模型進(jìn)行預(yù)測(cè)分析,調(diào)用predict()函數(shù)預(yù)測(cè)數(shù)據(jù)集。
- 分別獲取三類數(shù)據(jù)集對(duì)應(yīng)類的點(diǎn)。
- 調(diào)用plot()函數(shù)繪制散點(diǎn)圖,不同類別的數(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ù)點(diǎn) 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 #三種顏色 紅 綠 藍(lán),marker='x'表示類型,o表示圓點(diǎn) *表示星型 x表示點(diǎn) 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形點(diǎn)聚集在一起,其al含量較高、ri含量較低;中間綠色o點(diǎn)聚集在一起,其al、ri含量均勻;右部藍(lán)色*星形點(diǎn)聚集在一起,其al含量較低、ri含量較高。該Birch算法很好的將數(shù)據(jù)集劃分為三部分。
但不知道讀者有沒(méi)有注意到,在代碼中獲取了兩列數(shù)據(jù)進(jìn)行聚類,而數(shù)據(jù)集中包含多個(gè)特征,如ri、na、mg、al、si、k、ca、ba、fe等,真正的聚類分析中,是可以對(duì)多個(gè)特征進(jìn)行分析的,這就涉及到了降維技術(shù)。
四.結(jié)合降維處理的聚類分析
任何回歸、聚類和分類算法的復(fù)雜度都依賴于輸入的數(shù)量,為了減少存儲(chǔ)量和計(jì)算時(shí)間,我們需要降低問(wèn)題的維度,丟棄不相關(guān)的特征。同時(shí),當(dāng)數(shù)據(jù)可以用較少的維度表示而不丟失信息時(shí),我們可以對(duì)數(shù)據(jù)繪圖,可視化分析它的結(jié)構(gòu)和離群點(diǎn),數(shù)據(jù)降維由此產(chǎn)生。
數(shù)據(jù)降維(Dimensionality Reduction)是指采用一個(gè)低緯度的特征來(lái)表示高緯度特征,其本質(zhì)是構(gòu)造一個(gè)映射函數(shù)f:X->Y,其中X是原始數(shù)據(jù)點(diǎn),用n維向量表示;Y是數(shù)據(jù)點(diǎn)映射后的r維向量,并且n>r。通過(guò)這種映射方法,可以將高維空間中的數(shù)據(jù)點(diǎn)降低。
特征降維一般有兩類方法:特征選擇(Feature Selection)和特征提取(Feature Extraction)。
-
特征選擇
特征選擇是指從高緯度特征中選擇其中的一個(gè)子集來(lái)作為新的特征。最佳子集表示以最少的維貢獻(xiàn)最大的正確率,丟棄不重要的維,使用合適的誤差函數(shù)產(chǎn)生,特征選擇的方法包括在向前選擇(Forword Selection)和在向后選擇(Backward Selection)。 -
特征提取
特征提取是指將高緯度的特征經(jīng)過(guò)某個(gè)函數(shù)映射至低緯度作為新的特征。常用的特征抽取方法包括PCA(主成分分析)和LDA(線性判別分析)。圖17表示采用PCA方法將三維圖形尾花數(shù)據(jù)降維成兩維2D圖形。
1.PCA降維
主成分分析(Principal Component Analysis,簡(jiǎn)稱PCA)是一種常用的線性降維數(shù)據(jù)分析方法,它是在能盡可能保留具有代表性的原特征數(shù)據(jù)點(diǎn)的情況下,將原特征進(jìn)行線性變換,從而映射至低緯度空間中。
PCA降維方法通過(guò)正交變換將一組可能存在相關(guān)性的變量轉(zhuǎn)換為一組線性不相關(guān)的變量,轉(zhuǎn)換后的這組變量叫做主成分,它可以用于提取數(shù)據(jù)中的主要特征分量,常用于高維數(shù)據(jù)的降維。該方法的重點(diǎn)在于:能否在各個(gè)變量之間相關(guān)關(guān)系的基礎(chǔ)上,用較少的新變量代替原來(lái)較多的變量,并且這些較少的新變量盡可能多地反映原來(lái)較多的變量所提供信息,又能保證新指標(biāo)之間信息不重疊。
圖18是將二維樣本的散點(diǎn)圖(紅色三角形點(diǎn))降低成一維直線(黃色圓點(diǎn))表示。最理想的情況是這個(gè)一維新向量所包含的原始數(shù)據(jù)信息最多,即降維后的直線能盡可能多覆蓋二維圖形中的點(diǎn),或者所有點(diǎn)到這條直線的距離和最短,這類似于橢圓長(zhǎng)軸,該方向上的離散程度最大、方差最大,所包含的信息最多;而橢圓短軸方向上的數(shù)據(jù)變化很少,對(duì)數(shù)據(jù)的解釋能力較弱。
由于作者數(shù)學(xué)能力有限,該方法的推算過(guò)程及原理推薦讀者下來(lái)自行研究學(xué)習(xí),也請(qǐng)讀者海涵。
2.Sklearn PCA降維
下面介紹Sklearn機(jī)器學(xué)習(xí)包中PCA降維方法的應(yīng)用。
- 導(dǎo)入擴(kuò)展包
from sklearn.decomposition import PCA - 調(diào)用降維函數(shù)
pca = PCA(n_components=2)
其中參數(shù)n_components=2表示降低為2維,下述代碼是調(diào)用PCA降維方法進(jìn)行降維操作,將一條直線(二維矩陣)X變量降低為一個(gè)點(diǎn)并輸出。
輸出如下所示,包括PCA算法原型及降維成2維的結(jié)果。
其結(jié)果表示通過(guò)PCA降維方法將六個(gè)點(diǎn)或一條直線降低成為一個(gè)點(diǎn),并盡可能表征這六個(gè)點(diǎn)的特征。輸出點(diǎn)為:[0.99244289 0.00755711]。
- 降維操作
pca = PCA(n_components=2)
newData = pca.fit_transform(x)
調(diào)用PCA()函數(shù)降維,降低成2維數(shù)組,并將降維后的數(shù)據(jù)集賦值給newData變量。下面舉一個(gè)例子,載入波士頓(Boston)房?jī)r(jià)數(shù)據(jù)集,將數(shù)據(jù)集中的13個(gè)特征降低為2個(gè)特征。核心代碼如下所示:
# -*- 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)其中,波士頓房?jī)r(jià)數(shù)據(jù)集共506行,13個(gè)特征,經(jīng)過(guò)PCA算法降維后,降低為兩個(gè)特征,并調(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降維實(shí)例
前面講述的Birch聚類算法分析氧化物的數(shù)據(jù)只抽取了數(shù)據(jù)集的第一列和第二列數(shù)據(jù),接下來(lái)講述對(duì)整個(gè)數(shù)據(jù)集的所有特征進(jìn)行聚類的代碼,調(diào)用PCA將數(shù)據(jù)集降低為兩維數(shù)據(jù),再進(jìn)行可視化操作,完整代碼如下。
# -*- 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)詳細(xì)敘述了,其中[n[0] for n in newData]代碼表示獲取降維后的第一列數(shù)據(jù),[n[1] for n in newData]獲取降維后的第二列數(shù)據(jù),并分別賦值給x1和x2變量,為最后的繪圖做準(zhǔn)備。
同時(shí),上述代碼輸出的前4行數(shù)據(jù)集結(jié)果如下:
最后簡(jiǎn)單講述設(shè)置不同類簇?cái)?shù)的聚類對(duì)比代碼,完整代碼如下:
# -*- 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 #負(fù)號(hào)#聚類 類簇?cái)?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) #聚類 類簇?cái)?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) #聚類 類簇?cái)?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) #聚類 類簇?cái)?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所示,可以分別看到類簇?cái)?shù)為2、3、4、5的聚類對(duì)比情況。需要注意的是不同類簇?cái)?shù)據(jù)點(diǎn)的顏色是不同的,建議讀者下來(lái)自己去實(shí)現(xiàn)該部分代碼,從實(shí)際數(shù)據(jù)分析中體會(huì)。
五.基于均值漂移的圖像聚類
前面我看到是針對(duì)TXT和CSV文件中的數(shù)據(jù),接著我們來(lái)看看聚類算法如何應(yīng)用到圖像分割領(lǐng)域。
1.MeanShift圖像聚類
均值漂移(Mean Shfit)算法是一種通用的聚類算法,最早是1975年Fukunaga等人在一篇關(guān)于概率密度梯度函數(shù)的估計(jì)論文中提出。它是一種無(wú)參估計(jì)算法,沿著概率梯度的上升方向?qū)ふ曳植嫉姆逯?。Mean Shift算法先算出當(dāng)前點(diǎn)的偏移均值,移動(dòng)該點(diǎn)到其偏移均值,然后以此為新的起始點(diǎn),繼續(xù)移動(dòng),直到滿足一定的條件結(jié)束。
圖像分割中可以利用均值漂移算法的特性,實(shí)現(xiàn)彩色圖像分割。在OpenCV中提供的函數(shù)為pyrMeanShiftFiltering(),該函數(shù)嚴(yán)格來(lái)說(shuō)并不是圖像分割,而是圖像在色彩層面的平滑濾波,它可以中和色彩分布相近的顏色,平滑色彩細(xì)節(jié),侵蝕掉面積較小的顏色區(qū)域,所以在OpenCV中它的后綴是濾波“Filter”,而不是分割“segment”。該函數(shù)原型如下所示:
- dst = pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]])
– src表示輸入圖像,8位三通道的彩色圖像
– dst表示輸出圖像,需同輸入圖像具有相同的大小和類型
– sp表示定義漂移物理空間半徑的大小
– sr表示定義漂移色彩空間半徑的大小
– maxLevel表示定義金字塔的最大層數(shù)
– termcrit表示定義的漂移迭代終止條件,可以設(shè)置為迭代次數(shù)滿足終止,迭代目標(biāo)與中心點(diǎn)偏差滿足終止,或者兩者的結(jié)合
均值漂移pyrMeanShiftFiltering()函數(shù)的執(zhí)行過(guò)程是如下:
-
(1) 構(gòu)建迭代空間。
以輸入圖像上任一點(diǎn)P0為圓心,建立以sp為物理空間半徑,sr為色彩空間半徑的球形空間,物理空間上坐標(biāo)為x和y,色彩空間上坐標(biāo)為RGB或HSV,構(gòu)成一個(gè)空間球體。其中x和y表示圖像的長(zhǎng)和寬,色彩空間R、G、B在0至255之間。 -
(2) 求迭代空間的向量并移動(dòng)迭代空間球體重新計(jì)算向量,直至收斂。
在上一步構(gòu)建的球形空間中,求出所有點(diǎn)相對(duì)于中心點(diǎn)的色彩向量之和,移動(dòng)迭代空間的中心點(diǎn)到該向量的終點(diǎn),并再次計(jì)算該球形空間中所有點(diǎn)的向量之和,如此迭代,直到在最后一個(gè)空間球體中所求得向量和的終點(diǎn)就是該空間球體的中心點(diǎn)Pn,迭代結(jié)束。 -
(3) 更新輸出圖像dst上對(duì)應(yīng)的初始原點(diǎn)P0的色彩值為本輪迭代的終點(diǎn)Pn的色彩值,完成一個(gè)點(diǎn)的色彩均值漂移。
-
(4) 對(duì)輸入圖像src上其他點(diǎn),依次執(zhí)行上述三個(gè)步驟,直至遍歷完所有點(diǎn)后,整個(gè)均值偏移色彩濾波完成。
下面的代碼是圖像均值漂移的實(shí)現(xiàn)過(guò)程:
# -*- 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()當(dāng)漂移物理空間半徑設(shè)置為50,漂移色彩空間半徑設(shè)置為50,金字塔層數(shù) 為2,輸出的效果圖如圖21所示。
當(dāng)漂移物理空間半徑設(shè)置為20,漂移色彩空間半徑設(shè)置為20,金字塔層數(shù)為2,輸出的效果圖如圖22所示。對(duì)比可以發(fā)現(xiàn),半徑為20時(shí),圖像色彩細(xì)節(jié)大部分存在,半徑為50時(shí),森林和水面的色彩細(xì)節(jié)基本都已經(jīng)丟失。
寫到這里,均值偏移算法對(duì)彩色圖像的分割平滑操作就完成了,為了達(dá)到更好地分割目的,借助漫水填充函數(shù)進(jì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') #獲取圖像行和列 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算法也能實(shí)現(xiàn)圖像分割。在圖像處理中,通過(guò)K-Means聚類算法可以實(shí)現(xiàn)圖像分割、圖像聚類、圖像識(shí)別等操作,本小節(jié)主要用來(lái)進(jìn)行圖像顏色分割。假設(shè)存在一張100×100像素的灰度圖像,它由10000個(gè)RGB灰度級(jí)組成,我們通過(guò)K-Means可以將這些像素點(diǎn)聚類成K個(gè)簇,然后使用每個(gè)簇內(nèi)的質(zhì)心點(diǎn)來(lái)替換簇內(nèi)所有的像素點(diǎn),這樣就能實(shí)現(xiàn)在不改變分辨率的情況下量化壓縮圖像顏色,實(shí)現(xiàn)圖像顏色層級(jí)分割。
在OpenCV中,Kmeans()函數(shù)原型如下所示:
- retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])
– data表示聚類數(shù)據(jù),最好是np.flloat32類型的N維點(diǎn)集
– K表示聚類類簇?cái)?shù)
– bestLabels表示輸出的整數(shù)數(shù)組,用于存儲(chǔ)每個(gè)樣本的聚類標(biāo)簽索引
– criteria表示算法終止條件,即最大迭代次數(shù)或所需精度。在某些迭代中,一旦每個(gè)簇中心的移動(dòng)小于criteria.epsilon,算法就會(huì)停止
– attempts表示重復(fù)試驗(yàn)kmeans算法的次數(shù),算法返回產(chǎn)生最佳緊湊性的標(biāo)簽
– flags表示初始中心的選擇,兩種方法是cv2.KMEANS_PP_CENTERS ;和cv2.KMEANS_RANDOM_CENTERS
– centers表示集群中心的輸出矩陣,每個(gè)集群中心為一行數(shù)據(jù)
下面使用該方法對(duì)灰度圖像顏色進(jìn)行分割處理,需要注意,在進(jìn)行K-Means聚類操作之前,需要將RGB像素點(diǎn)轉(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è)置標(biāo)簽 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]))#用來(lái)正常顯示中文標(biāo)簽 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聚類后的圖像,它將灰度級(jí)聚集成四個(gè)層級(jí),相似的顏色或區(qū)域聚集在一起。
下面代碼是對(duì)彩色圖像進(jìn)行顏色分割處理,它將彩色圖像聚集成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è)置標(biāo)簽 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)#用來(lái)正常顯示中文標(biāo)簽 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所示,它對(duì)比了原始圖像和各K-Means聚類處理后的圖像。當(dāng)K=2時(shí),聚集成2種顏色;當(dāng)K=4時(shí),聚集成4種顏色;當(dāng)K=8時(shí),聚集成8種顏色;當(dāng)K=16時(shí),聚集成16種顏色;當(dāng)K=64時(shí),聚集成64種顏色。
更多圖像處理知識(shí)推薦作者的專欄:
- https://blog.csdn.net/eastmount/category_9278090.html
六.基于文本的樹狀關(guān)鍵詞聚類
最后我們簡(jiǎn)單補(bǔ)充文本聚類相關(guān)知識(shí),這里以樹狀圖為例,后面的文本挖掘系列也會(huì)進(jìn)行詳細(xì)介紹。層次聚類繪制的樹狀圖,也是文本挖掘領(lǐng)域常用的技術(shù),它會(huì)將各個(gè)領(lǐng)域相關(guān)的主題以樹狀的形式進(jìn)行顯示。數(shù)據(jù)集為作者在CSDN近十年分享的所有博客標(biāo)題,如下圖所示。
最終輸出結(jié)果如下圖所示,可以看到這個(gè)內(nèi)容分為不同的主題,包括網(wǎng)絡(luò)安全、人工智能、圖像處理、算法等。
注意,這里作者可以通過(guò)設(shè)置過(guò)濾來(lái)顯示樹狀圖顯示的主題詞數(shù)量,并進(jìn)行相關(guān)的對(duì)比實(shí)驗(yàn),找到最優(yōu)結(jié)果。
# -*- 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#---------------------------------------加載語(yǔ)料------------------------------------- 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é)束了,您是否對(duì)聚類有更好的認(rèn)識(shí)呢?
聚類是把一堆數(shù)據(jù)歸為若干類,同一類數(shù)據(jù)具有某些相似性,并且這些類別是通過(guò)數(shù)據(jù)自發(fā)的聚集出來(lái)的,而不是事先給定的,也不需要標(biāo)記結(jié)果,機(jī)器學(xué)習(xí)里面稱之為無(wú)監(jiān)督學(xué)習(xí),常見的聚類方法包括KMeans、Birch、譜聚類、圖聚類等。聚類被廣泛應(yīng)用于不同場(chǎng)景中,社交網(wǎng)絡(luò)通過(guò)聚類來(lái)發(fā)現(xiàn)人群,關(guān)注人群的喜好;網(wǎng)頁(yè)通過(guò)聚類來(lái)查找相似文本內(nèi)容;圖像通過(guò)聚類來(lái)進(jìn)行分割和檢索相似圖片;電商通過(guò)用戶聚類來(lái)分析購(gòu)物的人群、商品推薦以及計(jì)算購(gòu)物最佳時(shí)間等。
- 一.聚類
1.算法模型
2.常見聚類算法
3.性能評(píng)估 - 二.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降維實(shí)例 - 五.基于均值漂移的圖像聚類
1.MeanShift圖像聚類
2.K-Means圖像聚類 - 六.基于文本的樹狀關(guān)鍵詞聚類
- 七.總結(jié)
最后希望讀者能復(fù)現(xiàn)每一行代碼,只有實(shí)踐才能進(jìn)步。同時(shí)更多聚類算法和原理知識(shí),希望讀者下來(lái)自行深入學(xué)習(xí)研究,也推薦大家結(jié)合Sklearn官網(wǎng)和開源網(wǎng)站學(xué)習(xí)更多的機(jī)器學(xué)習(xí)知識(shí)。
該系列所有代碼下載地址:
- https://github.com/eastmountyxz/Python-zero2one
感謝在求學(xué)路上的同行者,不負(fù)遇見,勿忘初心。這周的留言感慨~
(By:娜璋之家 Eastmount 2021-07-06 夜于武漢 https://blog.csdn.net/Eastmount )
參考文獻(xiàn):
- [1] 楊秀璋. 專欄:知識(shí)圖譜、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]. 北京:機(jī)械工業(yè)出版社,2016.
- [3] (美)Wes McKinney著. 唐學(xué)韜等譯. 利用Python進(jìn)行數(shù)據(jù)分析[M]. 北京:機(jī)械工業(yè)出版社,2013.
- [4] Jiawei Han,Micheline Kamber著. 范明,孟小峰譯. 數(shù)據(jù)挖掘概念與技術(shù). 北京:機(jī)械工業(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聚類代碼實(shí)現(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/.
總結(jié)
以上是生活随笔為你收集整理的[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Python从零到壹] 十二.机器学习
- 下一篇: [Python从零到壹] 十四.机器学习