python數(shù)據(jù)分析之聚類分析(cluster analysis)
何為聚類分析
聚類分析或聚類是對(duì)一組對(duì)象進(jìn)行分組的任務(wù),使得同一組(稱為聚類)中的對(duì)象(在某種意義上)與其他組(聚類)中的對(duì)象更相似(在某種意義上)。它是探索性數(shù)據(jù)挖掘的主要任務(wù),也是統(tǒng)計(jì) 數(shù)據(jù)分析的常用技術(shù),用于許多領(lǐng)域,包括機(jī)器學(xué)習(xí),模式識(shí)別,圖像分析,信息檢索,生物信息學(xué),數(shù)據(jù)壓縮和計(jì)算機(jī)圖形學(xué)。
聚類分析本身不是一個(gè)特定的算法,而是要解決的一般任務(wù)。它可以通過(guò)各種算法來(lái)實(shí)現(xiàn),這些算法在理解群集的構(gòu)成以及如何有效地找到它們方面存在顯著差異。流行的群集概念包括群集成員之間距離較小的群體,數(shù)據(jù)空間的密集區(qū)域,間隔或特定的統(tǒng)計(jì)分布。因此,聚類可以表述為多目標(biāo)優(yōu)化問(wèn)題。適當(dāng)?shù)木垲愃惴ê蛥?shù)設(shè)置(包括距離函數(shù)等參數(shù))使用,密度閾值或預(yù)期聚類的數(shù)量)取決于個(gè)體數(shù)據(jù)集和結(jié)果的預(yù)期用途。這樣的聚類分析不是自動(dòng)任務(wù),而是涉及試驗(yàn)和失敗的知識(shí)發(fā)現(xiàn)或交互式多目標(biāo)優(yōu)化的迭代過(guò)程。通常需要修改數(shù)據(jù)預(yù)處理和模型參數(shù),直到結(jié)果達(dá)到所需的屬性。
常見(jiàn)聚類方法
常用的聚類算法分為基于劃分、層次、密度、網(wǎng)格、統(tǒng)計(jì)學(xué)、模型等類型的算法,典型算法包括K均值(經(jīng)典的聚類算法)、DBSCAN、兩步聚類、BIRCH、譜聚類等。
K-means
聚類算法中k-means是最常使用的方法之一,但是k-means要注意數(shù)據(jù)異常:
- 數(shù)據(jù)異常值。數(shù)據(jù)中的異常值能明顯改變不同點(diǎn)之間的距離相識(shí)度,并且這種影響是非常顯著的。因此基于距離相似度的判別模式下,異常值的處理必不可少。
- 數(shù)據(jù)的異常量綱。不同的維度和變量之間,如果存在數(shù)值規(guī)?;蛄烤V的差異,那么在做距離之前需要先將變量歸一化或標(biāo)準(zhǔn)化。例如跳出率的數(shù)值分布區(qū)間是[0,1],訂單金額可能是[0,10000 000],而訂單數(shù)量則是[0,1000],如果沒(méi)有歸一化或標(biāo)準(zhǔn)化操作,那么相似度將主要受到訂單金額的影響。
DBSCAN
有異常的數(shù)據(jù)可以使用DBSCAN聚類方法進(jìn)行處理,DBSCAN的全稱是Density-Based Spatial Clustering of Applications with Noise,中文含義是“基于密度的帶有噪聲的空間聚類”。
跟K均值相比,它具有以下優(yōu)點(diǎn):
- 原始數(shù)據(jù)分布規(guī)律沒(méi)有明顯要求,能適應(yīng)任意數(shù)據(jù)集分布形狀的空間聚類,因此數(shù)據(jù)集適用性更廣,尤其是對(duì)非凸裝、圓環(huán)形等異性簇分布的識(shí)別較好。
- 無(wú)需指定聚類數(shù)量,對(duì)結(jié)果的先驗(yàn)要求不高
- 由于DBSCAN可區(qū)分核心對(duì)象、邊界點(diǎn)和噪點(diǎn),因此對(duì)噪聲的過(guò)濾效果好,能有效應(yīng)對(duì)數(shù)據(jù)噪點(diǎn)。
由于他對(duì)整個(gè)數(shù)據(jù)集進(jìn)行操作且聚類時(shí)使用了一個(gè)全局性的表征密度的參數(shù),因此也存在比較明顯的弱點(diǎn):
- 對(duì)于高緯度問(wèn)題,基于半徑和密度的定義成問(wèn)題。
- 當(dāng)簇的密度變化太大時(shí),聚類結(jié)果較差。
- 當(dāng)數(shù)據(jù)量增大時(shí),要求較大的內(nèi)存支持,I/O消耗也很大。
MiniBatchKMeans
K均值在算法穩(wěn)定性、效率和準(zhǔn)確率(相對(duì)于真實(shí)標(biāo)簽的判別)上表現(xiàn)非常好,并且在應(yīng)對(duì)大量數(shù)據(jù)時(shí)依然如此。它的算法時(shí)間復(fù)雜度上界為O(nkt),其中n是樣本量、k是劃分的聚類數(shù)、t是迭代次數(shù)。當(dāng)聚類數(shù)和迭代次數(shù)不變時(shí),K均值的算法消耗時(shí)間只跟樣本量有關(guān),因此會(huì)呈線性增長(zhǎng)趨勢(shì)。
但是當(dāng)面對(duì)海量數(shù)據(jù)時(shí),k均值算法計(jì)算速度慢會(huì)產(chǎn)生延時(shí),尤其算法被用于做實(shí)時(shí)性處理時(shí)這種弊端尤為明顯。針對(duì)K均值的這一問(wèn)題,很多延伸算法出現(xiàn)了,MiniBatchKMeans就是其中一個(gè)典型代表。MiniBatchKMeans使用了一個(gè)種名為Mini Batch(分批處理)的方法計(jì)算數(shù)據(jù)點(diǎn)之間的距離。Mini Batch的好處是計(jì)算過(guò)程中不必使用所有的數(shù)據(jù)樣本,而是從不同類別的樣本中抽取一部分樣本(而非全部樣本)作為代表參與聚類算法過(guò)程。由于計(jì)算樣本量少,所以會(huì)相應(yīng)減少運(yùn)行時(shí)間;但另一方面,由于是抽樣方法,抽樣樣本很難完全代表整體樣本的全部特征,因此會(huì)帶來(lái)準(zhǔn)確度的小幅度下降,但是并不明顯。
譜聚類
在大數(shù)據(jù)背景下,有很多高緯度數(shù)據(jù)場(chǎng)景,如電子商務(wù)交易數(shù)據(jù)、web文本數(shù)據(jù)日益豐富。高維數(shù)據(jù)聚類時(shí)耗時(shí)長(zhǎng)、聚類結(jié)果準(zhǔn)確性和穩(wěn)定性都不盡如人意。因?yàn)?,在高維數(shù)據(jù),基于距離的相似度計(jì)算效率極低;特征值過(guò)多在所有維度上存在簇的可能性非常低;由于稀疏性和緊鄰特性,基于距離的相似度幾乎為0,導(dǎo)致高維空間很難出現(xiàn)數(shù)據(jù)簇。這時(shí)我們可以選著使用子空間聚類,或是降維處理。
子空間聚類算法是在高維數(shù)據(jù)空間中對(duì)傳統(tǒng)聚類算法的一種擴(kuò)展,其思想是選取與給定簇密切相關(guān)的維,然后在對(duì)應(yīng)的子空間進(jìn)行聚類。比如譜聚類就是一種子空間聚類方法,由于選擇相關(guān)維的方法以及評(píng)估子空間的方法需要自定義,因此這種方法對(duì)操作者的要求較高。
使用聚類分析中間預(yù)處理
- 圖像壓縮
用較少的數(shù)據(jù)量來(lái)表示原有的像素矩陣的過(guò)程,這個(gè)過(guò)程稱為圖像編碼。數(shù)據(jù)圖像的顯著特點(diǎn)是數(shù)據(jù)量龐大,需要占用相當(dāng)大的儲(chǔ)存空間,這給圖像的存儲(chǔ)、計(jì)算、傳輸?shù)葞?lái)了不便。因此,現(xiàn)在大多數(shù)數(shù)字網(wǎng)絡(luò)下的圖像都會(huì)經(jīng)過(guò)壓縮后再做進(jìn)一步應(yīng)用,圖像壓縮的方法之一便是聚類算法。
在使用聚類算法做圖像壓縮時(shí),我們會(huì)定義K個(gè)顏色數(shù)(例如128種顏色),顏色數(shù)就是聚類類別的數(shù)量;K均值聚類算法會(huì)把類似的顏色分別放在K個(gè)簇中,然后每個(gè)簇使用一種顏色來(lái)代替原始顏色,那么結(jié)果就是有多少個(gè)簇,就生成了多少種顏色構(gòu)成的圖像,由此實(shí)現(xiàn)圖像壓縮。
- 圖像分割
圖像分割就是把圖像分成若干個(gè)特定的、具有獨(dú)特性質(zhì)的區(qū)域并提出感興趣的目標(biāo)技術(shù)和過(guò)程,這是圖像處理和分析的關(guān)鍵步驟。圖像分割后提取出的目標(biāo)可以用于圖像語(yǔ)義識(shí)別,圖像搜索等領(lǐng)域。例如從圖像中分割出前景人臉信息,然后做人臉識(shí)別。聚類算法是圖像分割方法的一種,其實(shí)施的關(guān)鍵是通過(guò)不同區(qū)域間明顯不同的圖像色彩特征做聚類,聚類數(shù)量就是要分割的區(qū)域的數(shù)量。
- 圖像理解
在圖像理解中,有一種稱為基于區(qū)域的提取方法?;趨^(qū)域的提取方法是在圖像分割和對(duì)象識(shí)別的前提下進(jìn)行的,利用對(duì)象模板、場(chǎng)景分類器等,通過(guò)識(shí)別對(duì)象及對(duì)象之間的拓?fù)潢P(guān)系挖掘語(yǔ)義,生成對(duì)應(yīng)的場(chǎng)景語(yǔ)義信息。例如,先以顏色、形狀等特征對(duì)分割后的圖像區(qū)域進(jìn)行聚類,形成少量BLOB;然后通過(guò)CMRM模型計(jì)算出BLOB與某些關(guān)鍵詞共同出現(xiàn)的概率。
- 異常檢測(cè)
異常檢測(cè)有多種實(shí)施方法,其中常用的方法是基于距離的異常檢測(cè)方法。即使數(shù)據(jù)集不滿足任何特定分布模型,它仍能有效地發(fā)現(xiàn)離群點(diǎn),特別是當(dāng)空間維度比較高時(shí),算法的效率比基于密度的方法要高得多。算法具體實(shí)現(xiàn)時(shí),首先算出數(shù)據(jù)樣本間的距離(如曼哈頓距離、歐氏距離等),然后對(duì)數(shù)據(jù)做預(yù)處理后就可以根據(jù)距離的定義來(lái)檢測(cè)異常值。
例如,可以使用K-means的聚類可以將離中心店最遠(yuǎn)的類或者不屬于任何一個(gè)類的數(shù)據(jù)點(diǎn)提取出來(lái),然后將其定義為異常值。
聚類算法的選擇:
- 數(shù)據(jù)為高維數(shù)據(jù),那么選取子空間聚類(如譜聚類)
- 數(shù)據(jù)量在100萬(wàn)條以內(nèi),那么使用k均值較好;如果數(shù)據(jù)量超過(guò)100萬(wàn)條,那么可以考慮使用Mini Batch KMeans
- 如果數(shù)據(jù)中存在噪點(diǎn),那么可以使用基于密度的DBSCAN
- 如果最求更高的分類準(zhǔn)確度,那么選擇譜聚類將比K均值準(zhǔn)確度更好
python代碼實(shí)現(xiàn)
import numpy as np import pandas as pd from sklearn.cluster import KMeans from sklearn import metrics import matplotlib.pyplot as plt from sklearn.datasets import make_blobs %matplotlib inline # 數(shù)據(jù)準(zhǔn)備 data = make_blobs(n_samples=2000, centers=[[1,1], [-1, -1]], cluster_std=0.7, random_state=2018) X = data[0] y = data[1] #設(shè)置聚類數(shù)量 n_clusters = 2 # 建立聚類模型對(duì)象 kmeans = KMeans(n_clusters=n_clusters, random_state=2018) # 訓(xùn)練聚類模型 kmeans.fit(X) # 預(yù)測(cè)聚類模型 pre_y = kmeans.predict(X) ### 模型效果指標(biāo)評(píng)估 ### # 樣本距離最近的聚類中心的總和 inertias = kmeans.inertia_ # 調(diào)整后的蘭德指數(shù) adjusted_rand_s = metrics.adjusted_rand_score(y, pre_y) # 互信息 mutual_info_s = metrics.mutual_info_score(y, pre_y) # 調(diào)整后的互信息 adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y, pre_y) # 同質(zhì)化得分 homogeneity_s = metrics.homogeneity_score(y, pre_y) # 完整性得分 completeness_s = metrics.completeness_score(y, pre_y) # V-measure得分 v_measure_s = metrics.v_measure_score(y, pre_y) # 平均輪廓系數(shù) silhouette_s = metrics.silhouette_score(X, pre_y, metric='euclidean') # Calinski 和 Harabaz 得分 calinski_harabaz_s = metrics.calinski_harabaz_score(X, pre_y) df_metrics = pd.DataFrame([[inertias, adjusted_rand_s,mutual_info_s, adjusted_mutual_info_s, homogeneity_s,completeness_s,v_measure_s, silhouette_s ,calinski_harabaz_s]], columns=['ine','tARI','tMI','tAMI','thomo','tcomp','tv_m','tsilh','tc&h']) df_metrics
## 模型可視化## centers = kmeans.cluster_centers_ # 顏色設(shè)置 colors = ['green', 'pink'] # 創(chuàng)建畫布 plt.figure(figsize=(12,6)) titles = ['Real', 'Predict'] for j, y_ in enumerate([y, pre_y]): plt.subplot(1,2, j+1) plt.title(titles[j]) # 循環(huán)讀類別 for i in range(n_clusters): # 找到相同的索引 index_sets = np.where(y_ == i) # 將相同類的數(shù)據(jù)劃分為一個(gè)聚類子集 cluster = X[index_sets] # 展示樣本點(diǎn) plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], marker='.') if j==1: # 簇中心 plt.plot(centers[i][0], centers[i][1], 'o',markerfacecolor=colors[i],markeredgecolor='k', markersize=6) plt.savefig('xx.png') plt.show()
評(píng)估指標(biāo)解析:
- inertias:inertias是K均值模型對(duì)象的屬性,表示樣本距離最近的聚類中心的總和,它是作為在沒(méi)有真實(shí)分類結(jié)果標(biāo)簽下的非監(jiān)督式評(píng)估指標(biāo)。該值越小越好,值越小證明樣本在類間的分布越集中,即類內(nèi)的距離越小。
- adjusted_rand_s:調(diào)整后的蘭德指數(shù)(Adjusted Rand Index),蘭德指數(shù)通過(guò)考慮在預(yù)測(cè)和真實(shí)聚類中在相同或不同聚類中分配的所有樣本對(duì)和計(jì)數(shù)對(duì)來(lái)計(jì)算兩個(gè)聚類之間的相似性度量。調(diào)整后的蘭德指數(shù)通過(guò)對(duì)蘭德指數(shù)的調(diào)整得到獨(dú)立于樣本量和類別的接近于0的值,其取值范圍為[-1, 1],負(fù)數(shù)代表結(jié)果不好,越接近于1越好意味著聚類結(jié)果與真實(shí)情況越吻合。
- mutual_info_s:互信息(Mutual Information, MI),互信息是一個(gè)隨機(jī)變量中包含的關(guān)于另一個(gè)隨機(jī)變量的信息量,在這里指的是相同數(shù)據(jù)的兩個(gè)標(biāo)簽之間的相似度的量度,結(jié)果是非負(fù)值。
- adjusted_mutual_info_s:調(diào)整后的互信息(Adjusted Mutual Information, AMI),調(diào)整后的互信息是對(duì)互信息評(píng)分的調(diào)整得分。它考慮到對(duì)于具有更大數(shù)量的聚類群,通常MI較高,而不管實(shí)際上是否有更多的信息共享,它通過(guò)調(diào)整聚類群的概率來(lái)糾正這種影響。當(dāng)兩個(gè)聚類集相同(即完全匹配)時(shí),AMI返回值為1;隨機(jī)分區(qū)(獨(dú)立標(biāo)簽)平均預(yù)期AMI約為0,也可能為負(fù)數(shù)。
- homogeneity_s:同質(zhì)化得分(Homogeneity),如果所有的聚類都只包含屬于單個(gè)類的成員的數(shù)據(jù)點(diǎn),則聚類結(jié)果將滿足同質(zhì)性。其取值范圍[0,1]值越大意味著聚類結(jié)果與真實(shí)情況越吻合。
- completeness_s:完整性得分(Completeness),如果作為給定類的成員的所有數(shù)據(jù)點(diǎn)是相同集群的元素,則聚類結(jié)果滿足完整性。其取值范圍[0,1],值越大意味著聚類結(jié)果與真實(shí)情況越吻合。
- v_measure_s:它是同質(zhì)化和完整性之間的諧波平均值,v = 2 (均勻性完整性)/(均勻性+完整性)。其取值范圍[0,1],值越大意味著聚類結(jié)果與真實(shí)情況越吻合。
- silhouette_s:輪廓系數(shù)(Silhouette),它用來(lái)計(jì)算所有樣本的平均輪廓系數(shù),使用平均群內(nèi)距離和每個(gè)樣本的平均最近簇距離來(lái)計(jì)算,它是一種非監(jiān)督式評(píng)估指標(biāo)。其最高值為1,最差值為-1,0附近的值表示重疊的聚類,負(fù)值通常表示樣本已被分配到錯(cuò)誤的集群。
- calinski_harabaz_s:該分?jǐn)?shù)定義為群內(nèi)離散與簇間離散的比值,它是一種非監(jiān)督式評(píng)估指標(biāo)。
參考:
《python數(shù)據(jù)分析與數(shù)據(jù)化運(yùn)營(yíng)》 宋天龍
到此這篇關(guān)于python數(shù)據(jù)分析之聚類分析(cluster analysis)的文章就介紹到這了,更多相關(guān)python聚類分析內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。