python數(shù)據(jù)分析之聚類分析(cluster analysis)
何為聚類分析
聚類分析或聚類是對一組對象進行分組的任務,使得同一組(稱為聚類)中的對象(在某種意義上)與其他組(聚類)中的對象更相似(在某種意義上)。它是探索性數(shù)據(jù)挖掘的主要任務,也是統(tǒng)計 數(shù)據(jù)分析的常用技術,用于許多領域,包括機器學習,模式識別,圖像分析,信息檢索,生物信息學,數(shù)據(jù)壓縮和計算機圖形學。
聚類分析本身不是一個特定的算法,而是要解決的一般任務。它可以通過各種算法來實現(xiàn),這些算法在理解群集的構(gòu)成以及如何有效地找到它們方面存在顯著差異。流行的群集概念包括群集成員之間距離較小的群體,數(shù)據(jù)空間的密集區(qū)域,間隔或特定的統(tǒng)計分布。因此,聚類可以表述為多目標優(yōu)化問題。適當?shù)木垲愃惴ê蛥?shù)設置(包括距離函數(shù)等參數(shù))使用,密度閾值或預期聚類的數(shù)量)取決于個體數(shù)據(jù)集和結(jié)果的預期用途。這樣的聚類分析不是自動任務,而是涉及試驗和失敗的知識發(fā)現(xiàn)或交互式多目標優(yōu)化的迭代過程。通常需要修改數(shù)據(jù)預處理和模型參數(shù),直到結(jié)果達到所需的屬性。
常見聚類方法
常用的聚類算法分為基于劃分、層次、密度、網(wǎng)格、統(tǒng)計學、模型等類型的算法,典型算法包括K均值(經(jīng)典的聚類算法)、DBSCAN、兩步聚類、BIRCH、譜聚類等。
K-means
聚類算法中k-means是最常使用的方法之一,但是k-means要注意數(shù)據(jù)異常:
- 數(shù)據(jù)異常值。數(shù)據(jù)中的異常值能明顯改變不同點之間的距離相識度,并且這種影響是非常顯著的。因此基于距離相似度的判別模式下,異常值的處理必不可少。
- 數(shù)據(jù)的異常量綱。不同的維度和變量之間,如果存在數(shù)值規(guī)?;蛄烤V的差異,那么在做距離之前需要先將變量歸一化或標準化。例如跳出率的數(shù)值分布區(qū)間是[0,1],訂單金額可能是[0,10000 000],而訂單數(shù)量則是[0,1000],如果沒有歸一化或標準化操作,那么相似度將主要受到訂單金額的影響。
DBSCAN
有異常的數(shù)據(jù)可以使用DBSCAN聚類方法進行處理,DBSCAN的全稱是Density-Based Spatial Clustering of Applications with Noise,中文含義是“基于密度的帶有噪聲的空間聚類”。
跟K均值相比,它具有以下優(yōu)點:
- 原始數(shù)據(jù)分布規(guī)律沒有明顯要求,能適應任意數(shù)據(jù)集分布形狀的空間聚類,因此數(shù)據(jù)集適用性更廣,尤其是對非凸裝、圓環(huán)形等異性簇分布的識別較好。
- 無需指定聚類數(shù)量,對結(jié)果的先驗要求不高
- 由于DBSCAN可區(qū)分核心對象、邊界點和噪點,因此對噪聲的過濾效果好,能有效應對數(shù)據(jù)噪點。
由于他對整個數(shù)據(jù)集進行操作且聚類時使用了一個全局性的表征密度的參數(shù),因此也存在比較明顯的弱點:
- 對于高緯度問題,基于半徑和密度的定義成問題。
- 當簇的密度變化太大時,聚類結(jié)果較差。
- 當數(shù)據(jù)量增大時,要求較大的內(nèi)存支持,I/O消耗也很大。
MiniBatchKMeans
K均值在算法穩(wěn)定性、效率和準確率(相對于真實標簽的判別)上表現(xiàn)非常好,并且在應對大量數(shù)據(jù)時依然如此。它的算法時間復雜度上界為O(nkt),其中n是樣本量、k是劃分的聚類數(shù)、t是迭代次數(shù)。當聚類數(shù)和迭代次數(shù)不變時,K均值的算法消耗時間只跟樣本量有關,因此會呈線性增長趨勢。
但是當面對海量數(shù)據(jù)時,k均值算法計算速度慢會產(chǎn)生延時,尤其算法被用于做實時性處理時這種弊端尤為明顯。針對K均值的這一問題,很多延伸算法出現(xiàn)了,MiniBatchKMeans就是其中一個典型代表。MiniBatchKMeans使用了一個種名為Mini Batch(分批處理)的方法計算數(shù)據(jù)點之間的距離。Mini Batch的好處是計算過程中不必使用所有的數(shù)據(jù)樣本,而是從不同類別的樣本中抽取一部分樣本(而非全部樣本)作為代表參與聚類算法過程。由于計算樣本量少,所以會相應減少運行時間;但另一方面,由于是抽樣方法,抽樣樣本很難完全代表整體樣本的全部特征,因此會帶來準確度的小幅度下降,但是并不明顯。
譜聚類
在大數(shù)據(jù)背景下,有很多高緯度數(shù)據(jù)場景,如電子商務交易數(shù)據(jù)、web文本數(shù)據(jù)日益豐富。高維數(shù)據(jù)聚類時耗時長、聚類結(jié)果準確性和穩(wěn)定性都不盡如人意。因為,在高維數(shù)據(jù),基于距離的相似度計算效率極低;特征值過多在所有維度上存在簇的可能性非常低;由于稀疏性和緊鄰特性,基于距離的相似度幾乎為0,導致高維空間很難出現(xiàn)數(shù)據(jù)簇。這時我們可以選著使用子空間聚類,或是降維處理。
子空間聚類算法是在高維數(shù)據(jù)空間中對傳統(tǒng)聚類算法的一種擴展,其思想是選取與給定簇密切相關的維,然后在對應的子空間進行聚類。比如譜聚類就是一種子空間聚類方法,由于選擇相關維的方法以及評估子空間的方法需要自定義,因此這種方法對操作者的要求較高。
使用聚類分析中間預處理
- 圖像壓縮
用較少的數(shù)據(jù)量來表示原有的像素矩陣的過程,這個過程稱為圖像編碼。數(shù)據(jù)圖像的顯著特點是數(shù)據(jù)量龐大,需要占用相當大的儲存空間,這給圖像的存儲、計算、傳輸?shù)葞砹瞬槐?。因此,現(xiàn)在大多數(shù)數(shù)字網(wǎng)絡下的圖像都會經(jīng)過壓縮后再做進一步應用,圖像壓縮的方法之一便是聚類算法。
在使用聚類算法做圖像壓縮時,我們會定義K個顏色數(shù)(例如128種顏色),顏色數(shù)就是聚類類別的數(shù)量;K均值聚類算法會把類似的顏色分別放在K個簇中,然后每個簇使用一種顏色來代替原始顏色,那么結(jié)果就是有多少個簇,就生成了多少種顏色構(gòu)成的圖像,由此實現(xiàn)圖像壓縮。
- 圖像分割
圖像分割就是把圖像分成若干個特定的、具有獨特性質(zhì)的區(qū)域并提出感興趣的目標技術和過程,這是圖像處理和分析的關鍵步驟。圖像分割后提取出的目標可以用于圖像語義識別,圖像搜索等領域。例如從圖像中分割出前景人臉信息,然后做人臉識別。聚類算法是圖像分割方法的一種,其實施的關鍵是通過不同區(qū)域間明顯不同的圖像色彩特征做聚類,聚類數(shù)量就是要分割的區(qū)域的數(shù)量。
- 圖像理解
在圖像理解中,有一種稱為基于區(qū)域的提取方法?;趨^(qū)域的提取方法是在圖像分割和對象識別的前提下進行的,利用對象模板、場景分類器等,通過識別對象及對象之間的拓撲關系挖掘語義,生成對應的場景語義信息。例如,先以顏色、形狀等特征對分割后的圖像區(qū)域進行聚類,形成少量BLOB;然后通過CMRM模型計算出BLOB與某些關鍵詞共同出現(xiàn)的概率。
- 異常檢測
異常檢測有多種實施方法,其中常用的方法是基于距離的異常檢測方法。即使數(shù)據(jù)集不滿足任何特定分布模型,它仍能有效地發(fā)現(xiàn)離群點,特別是當空間維度比較高時,算法的效率比基于密度的方法要高得多。算法具體實現(xiàn)時,首先算出數(shù)據(jù)樣本間的距離(如曼哈頓距離、歐氏距離等),然后對數(shù)據(jù)做預處理后就可以根據(jù)距離的定義來檢測異常值。
例如,可以使用K-means的聚類可以將離中心店最遠的類或者不屬于任何一個類的數(shù)據(jù)點提取出來,然后將其定義為異常值。
聚類算法的選擇:
- 數(shù)據(jù)為高維數(shù)據(jù),那么選取子空間聚類(如譜聚類)
- 數(shù)據(jù)量在100萬條以內(nèi),那么使用k均值較好;如果數(shù)據(jù)量超過100萬條,那么可以考慮使用Mini Batch KMeans
- 如果數(shù)據(jù)中存在噪點,那么可以使用基于密度的DBSCAN
- 如果最求更高的分類準確度,那么選擇譜聚類將比K均值準確度更好
python代碼實現(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ù)準備
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ù)量
n_clusters = 2
# 建立聚類模型對象
kmeans = KMeans(n_clusters=n_clusters, random_state=2018)
# 訓練聚類模型
kmeans.fit(X)
# 預測聚類模型
pre_y = kmeans.predict(X)
### 模型效果指標評估 ###
# 樣本距離最近的聚類中心的總和
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_
# 顏色設置
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ù)劃分為一個聚類子集
cluster = X[index_sets]
# 展示樣本點
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()

評估指標解析:
- inertias:inertias是K均值模型對象的屬性,表示樣本距離最近的聚類中心的總和,它是作為在沒有真實分類結(jié)果標簽下的非監(jiān)督式評估指標。該值越小越好,值越小證明樣本在類間的分布越集中,即類內(nèi)的距離越小。
- adjusted_rand_s:調(diào)整后的蘭德指數(shù)(Adjusted Rand Index),蘭德指數(shù)通過考慮在預測和真實聚類中在相同或不同聚類中分配的所有樣本對和計數(shù)對來計算兩個聚類之間的相似性度量。調(diào)整后的蘭德指數(shù)通過對蘭德指數(shù)的調(diào)整得到獨立于樣本量和類別的接近于0的值,其取值范圍為[-1, 1],負數(shù)代表結(jié)果不好,越接近于1越好意味著聚類結(jié)果與真實情況越吻合。
- mutual_info_s:互信息(Mutual Information, MI),互信息是一個隨機變量中包含的關于另一個隨機變量的信息量,在這里指的是相同數(shù)據(jù)的兩個標簽之間的相似度的量度,結(jié)果是非負值。
- adjusted_mutual_info_s:調(diào)整后的互信息(Adjusted Mutual Information, AMI),調(diào)整后的互信息是對互信息評分的調(diào)整得分。它考慮到對于具有更大數(shù)量的聚類群,通常MI較高,而不管實際上是否有更多的信息共享,它通過調(diào)整聚類群的概率來糾正這種影響。當兩個聚類集相同(即完全匹配)時,AMI返回值為1;隨機分區(qū)(獨立標簽)平均預期AMI約為0,也可能為負數(shù)。
- homogeneity_s:同質(zhì)化得分(Homogeneity),如果所有的聚類都只包含屬于單個類的成員的數(shù)據(jù)點,則聚類結(jié)果將滿足同質(zhì)性。其取值范圍[0,1]值越大意味著聚類結(jié)果與真實情況越吻合。
- completeness_s:完整性得分(Completeness),如果作為給定類的成員的所有數(shù)據(jù)點是相同集群的元素,則聚類結(jié)果滿足完整性。其取值范圍[0,1],值越大意味著聚類結(jié)果與真實情況越吻合。
- v_measure_s:它是同質(zhì)化和完整性之間的諧波平均值,v = 2 (均勻性完整性)/(均勻性+完整性)。其取值范圍[0,1],值越大意味著聚類結(jié)果與真實情況越吻合。
- silhouette_s:輪廓系數(shù)(Silhouette),它用來計算所有樣本的平均輪廓系數(shù),使用平均群內(nèi)距離和每個樣本的平均最近簇距離來計算,它是一種非監(jiān)督式評估指標。其最高值為1,最差值為-1,0附近的值表示重疊的聚類,負值通常表示樣本已被分配到錯誤的集群。
- calinski_harabaz_s:該分數(shù)定義為群內(nèi)離散與簇間離散的比值,它是一種非監(jiān)督式評估指標。
參考:
《python數(shù)據(jù)分析與數(shù)據(jù)化運營》 宋天龍
到此這篇關于python數(shù)據(jù)分析之聚類分析(cluster analysis)的文章就介紹到這了,更多相關python聚類分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)周日歷與時間相互轉(zhuǎn)換
周日歷是日常生活中不常用到的歷法系統(tǒng),一般用于政府、商務的會計年度或者學校教學日歷中。本文為大家介紹了如何利用Python語言實現(xiàn)周日歷與時間相互轉(zhuǎn)換,感興趣的可以學習一下2022-07-07
在Python的Flask框架中實現(xiàn)全文搜索功能
這篇文章主要介紹了在Python的Flask框架中實現(xiàn)全文搜索功能,這個基本的web功能實現(xiàn)起來非常簡單,需要的朋友可以參考下2015-04-04
Python實現(xiàn)批量將PPT轉(zhuǎn)換成長圖
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)批量將PPT轉(zhuǎn)換成長圖,并且圖片名稱與PPT文件名稱相同,保存位置相同,感興趣的小伙伴可以了解下2023-08-08

