人工智能和機器學習之聚類算法:Affinity Propagation:聚類結(jié)果評估與可視化_第1頁
人工智能和機器學習之聚類算法:Affinity Propagation:聚類結(jié)果評估與可視化_第2頁
人工智能和機器學習之聚類算法:Affinity Propagation:聚類結(jié)果評估與可視化_第3頁
人工智能和機器學習之聚類算法:Affinity Propagation:聚類結(jié)果評估與可視化_第4頁
人工智能和機器學習之聚類算法:Affinity Propagation:聚類結(jié)果評估與可視化_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

人工智能和機器學習之聚類算法:AffinityPropagation:聚類結(jié)果評估與可視化1AffinityPropagation算法原理1.11、AffinityPropagation算法簡介AffinityPropagation(親和力傳播)是一種基于消息傳遞的聚類算法,由Frey和Dueck在2007年提出。與傳統(tǒng)的聚類算法如K-means不同,AffinityPropagation不需要預先設(shè)定聚類的數(shù)量,而是通過數(shù)據(jù)點之間的相似度來確定聚類中心。算法的核心思想是將數(shù)據(jù)點之間的相似度作為信息在網(wǎng)絡(luò)中傳播,通過迭代更新消息,最終確定哪些數(shù)據(jù)點作為聚類中心。1.1.1代碼示例:使用Scikit-learn實現(xiàn)AffinityPropagationimportnumpyasnp

fromsklearn.clusterimportAffinityPropagation

fromsklearn.datasetsimportmake_blobs

#生成數(shù)據(jù)

X,_=make_blobs(n_samples=300,centers=4,cluster_std=0.6,random_state=0)

#初始化AffinityPropagation模型

af=AffinityPropagation(damping=0.5,max_iter=200,convergence_iter=15,preference=None)

#擬合數(shù)據(jù)

af.fit(X)

#獲取聚類中心

cluster_centers_indices=af.cluster_centers_indices_

n_clusters=len(cluster_centers_indices)

#輸出聚類結(jié)果

print(f"Numberofdetectedclusters:{n_clusters}")

print(f"Clustercentersindices:{cluster_centers_indices}")1.22、消息傳遞機制詳解AffinityPropagation算法通過兩種類型的消息傳遞來確定聚類中心:責任消息(responsibility)和可用性消息(availability)。責任消息:表示數(shù)據(jù)點i成為數(shù)據(jù)點j的聚類中心的合適程度。如果數(shù)據(jù)點i比其他任何數(shù)據(jù)點更適合作為數(shù)據(jù)點j的聚類中心,那么責任消息為正;否則為負。可用性消息:表示數(shù)據(jù)點i可以成為數(shù)據(jù)點j的聚類中心的合適程度。如果數(shù)據(jù)點i已經(jīng)有很多其他數(shù)據(jù)點認為它適合作為聚類中心,那么可用性消息為正;否則為負。算法通過迭代更新這兩種消息,直到達到收斂狀態(tài)。1.2.1代碼示例:AffinityPropagation消息傳遞過程#假設(shè)我們有以下的責任和可用性消息矩陣

responsibility=np.array([[-1,0,-2],

[0,-1,0],

[-2,0,-1]])

availability=np.array([[-1,0,-2],

[0,-1,0],

[-2,0,-1]])

#模擬一次消息傳遞更新

#更新責任消息

foriinrange(responsibility.shape[0]):

forjinrange(responsibility.shape[1]):

ifi==j:

responsibility[i,j]=np.min(availability[i,:]+responsibility[i,:])

else:

responsibility[i,j]=np.min(availability[i,:]+responsibility[i,:])-availability[i,j]

#更新可用性消息

foriinrange(availability.shape[0]):

forjinrange(availability.shape[1]):

ifi==j:

availability[i,j]=responsibility[i,j]

else:

availability[i,j]=np.max([availability[i,j],responsibility[j,i]])

#輸出更新后的消息矩陣

print("UpdatedResponsibilityMatrix:\n",responsibility)

print("UpdatedAvailabilityMatrix:\n",availability)1.33、算法步驟與參數(shù)設(shè)置1.3.1算法步驟初始化:為每個數(shù)據(jù)點分配一個責任和可用性消息。消息傳遞:通過迭代更新責任和可用性消息,直到達到收斂狀態(tài)。確定聚類中心:根據(jù)最終的責任和可用性消息確定哪些數(shù)據(jù)點作為聚類中心。1.3.2參數(shù)設(shè)置damping:阻尼系數(shù),用于防止消息更新過程中的振蕩,取值范圍為0.5到1.0。max_iter:最大迭代次數(shù)。convergence_iter:連續(xù)迭代次數(shù)內(nèi),如果消息更新變化小于某個閾值,則認為算法收斂。preference:每個數(shù)據(jù)點成為聚類中心的偏好值,可以用來控制聚類中心的數(shù)量。1.3.3代碼示例:AffinityPropagation參數(shù)設(shè)置與應用#使用不同的參數(shù)設(shè)置

af=AffinityPropagation(damping=0.9,max_iter=300,convergence_iter=20,preference=-50)

#擬合數(shù)據(jù)

af.fit(X)

#輸出聚類結(jié)果

print(f"Numberofdetectedclusters:{len(af.cluster_centers_indices_)}")通過調(diào)整參數(shù),可以控制AffinityPropagation算法的收斂速度和聚類中心的數(shù)量,從而優(yōu)化聚類結(jié)果。1.4AffinityPropagation算法實現(xiàn)1.4.11、Python中使用Scikit-Learn實現(xiàn)AffinityPropagationAffinityPropagation是一種基于消息傳遞的聚類算法,它能夠從數(shù)據(jù)中確定聚類中心,而不需要事先指定聚類的數(shù)量。在Python中,Scikit-Learn庫提供了AffinityPropagation類,使得實現(xiàn)AffinityPropagation算法變得簡單。1.4.1.1安裝Scikit-Learnpipinstallscikit-learn1.4.1.2導入必要的庫importnumpyasnp

fromsklearn.clusterimportAffinityPropagation

fromsklearn.datasetsimportmake_blobs

importmatplotlib.pyplotasplt1.4.1.3創(chuàng)建數(shù)據(jù)集使用make_blobs函數(shù)生成一個包含多個聚類的數(shù)據(jù)集。#設(shè)置隨機種子以確保結(jié)果可復現(xiàn)

np.random.seed(0)

#生成數(shù)據(jù)集

X,_=make_blobs(n_samples=300,centers=4,cluster_std=0.6,random_state=0)1.4.1.4應用AffinityPropagation#創(chuàng)建AffinityPropagation模型

af=AffinityPropagation(damping=0.9,max_iter=300,convergence_iter=15,preference=None)

#擬合數(shù)據(jù)

af.fit(X)

#獲取聚類中心

cluster_centers=af.cluster_centers_

#獲取每個樣本的聚類標簽

labels=af.labels_1.4.1.5可視化結(jié)果使用Matplotlib庫來可視化數(shù)據(jù)點和聚類中心。#繪制數(shù)據(jù)點

plt.scatter(X[:,0],X[:,1],c=labels,s=50,cmap='viridis')

#繪制聚類中心

plt.scatter(cluster_centers[:,0],cluster_centers[:,1],c='red',s=200,alpha=0.5);

#顯示圖表

plt.title('AffinityPropagationClustering')

plt.show()1.4.22、代碼示例與運行結(jié)果分析1.4.2.1示例代碼importnumpyasnp

fromsklearn.clusterimportAffinityPropagation

fromsklearn.datasetsimportmake_blobs

importmatplotlib.pyplotasplt

#設(shè)置隨機種子

np.random.seed(0)

#生成數(shù)據(jù)集

X,_=make_blobs(n_samples=300,centers=4,cluster_std=0.6,random_state=0)

#創(chuàng)建AffinityPropagation模型

af=AffinityPropagation(damping=0.9,max_iter=300,convergence_iter=15,preference=None)

#擬合數(shù)據(jù)

af.fit(X)

#獲取聚類中心和標簽

cluster_centers=af.cluster_centers_

labels=af.labels_

#可視化結(jié)果

plt.scatter(X[:,0],X[:,1],c=labels,s=50,cmap='viridis')

plt.scatter(cluster_centers[:,0],cluster_centers[:,1],c='red',s=200,alpha=0.5);

plt.title('AffinityPropagationClustering')

plt.show()1.4.2.2運行結(jié)果分析在上述代碼中,我們首先生成了一個包含300個樣本和4個中心的數(shù)據(jù)集。然后,我們創(chuàng)建了一個AffinityPropagation模型,并使用damping參數(shù)來控制消息傳遞過程中的穩(wěn)定性。max_iter和convergence_iter參數(shù)分別控制最大迭代次數(shù)和收斂所需的迭代次數(shù)。擬合數(shù)據(jù)后,我們從模型中提取了聚類中心和每個樣本的聚類標簽。最后,我們使用Matplotlib庫來可視化數(shù)據(jù)點和聚類中心,其中數(shù)據(jù)點的顏色表示它們所屬的聚類,聚類中心以紅色大點表示。AffinityPropagation算法通過消息傳遞機制確定數(shù)據(jù)點之間的相似度,并從中選擇最合適的聚類中心。這種算法的一個優(yōu)點是它不需要預先指定聚類的數(shù)量,而是根據(jù)數(shù)據(jù)的分布自動確定。然而,它可能在處理大規(guī)模數(shù)據(jù)集時效率較低,因為其計算復雜度較高。在本例中,我們可以看到算法成功地識別了四個聚類中心,并將數(shù)據(jù)點正確地分配給了這些中心。通過調(diào)整damping參數(shù),我們可以控制算法的收斂速度和穩(wěn)定性,從而影響最終的聚類結(jié)果。2聚類結(jié)果評估2.11、評估指標介紹:輪廓系數(shù)與Calinski-Harabasz指數(shù)2.1.1輪廓系數(shù)(SilhouetteCoefficient)輪廓系數(shù)是一種用于評估聚類結(jié)果質(zhì)量的度量,其值范圍在-1到1之間。輪廓系數(shù)越接近1,表示樣本在聚類中的歸屬感越強,聚類效果越好;越接近-1,表示樣本歸屬感越弱,聚類效果越差;接近0則表示樣本處于兩個聚類的邊界上。計算公式:s其中:-ai是樣本i與其所在聚類中其他樣本的平均距離。-bi代碼示例:fromsklearn.datasetsimportmake_blobs

fromsklearn.clusterimportAffinityPropagation

fromsklearn.metricsimportsilhouette_score

#生成數(shù)據(jù)

X,_=make_blobs(n_samples=300,centers=4,random_state=0,cluster_std=0.60)

#使用AffinityPropagation進行聚類

clustering=AffinityPropagation().fit(X)

#計算輪廓系數(shù)

score=silhouette_score(X,clustering.labels_)

print("輪廓系數(shù):",score)2.1.2Calinski-Harabasz指數(shù)Calinski-Harabasz指數(shù)(也稱為varianceratiocriterion)是另一種評估聚類效果的指標,它通過比較聚類內(nèi)部的分散度和聚類之間的分散度來評估聚類質(zhì)量。指數(shù)值越大,表示聚類效果越好。計算公式:C其中:-trBk是聚類間分散度矩陣的跡。-trWk是聚類內(nèi)分散度矩陣的跡。-N是樣本總數(shù)。代碼示例:fromsklearn.metricsimportcalinski_harabasz_score

#使用Calinski-Harabasz指數(shù)評估聚類效果

ch_score=calinski_harabasz_score(X,clustering.labels_)

print("Calinski-Harabasz指數(shù):",ch_score)2.22、如何使用評估指標判斷聚類效果在使用輪廓系數(shù)和Calinski-Harabasz指數(shù)評估聚類效果時,可以遵循以下步驟:執(zhí)行聚類:使用AffinityPropagation或其他聚類算法對數(shù)據(jù)進行聚類。計算評估指標:對聚類結(jié)果應用輪廓系數(shù)和Calinski-Harabasz指數(shù)計算。比較指標值:將計算出的指標值與預設(shè)的閾值或不同聚類結(jié)果的指標值進行比較。選擇最佳聚類:選擇輪廓系數(shù)接近1且Calinski-Harabasz指數(shù)較高的聚類結(jié)果。示例:#生成多個聚類結(jié)果

clustering1=AffinityPropagation(damping=0.5).fit(X)

clustering2=AffinityPropagation(damping=0.9).fit(X)

#計算并比較輪廓系數(shù)

score1=silhouette_score(X,clustering1.labels_)

score2=silhouette_score(X,clustering2.labels_)

print("聚類1的輪廓系數(shù):",score1)

print("聚類2的輪廓系數(shù):",score2)

#計算并比較Calinski-Harabasz指數(shù)

ch_score1=calinski_harabasz_score(X,clustering1.labels_)

ch_score2=calinski_harabasz_score(X,clustering2.labels_)

print("聚類1的Calinski-Harabasz指數(shù):",ch_score1)

print("聚類2的Calinski-Harabasz指數(shù):",ch_score2)通過比較不同參數(shù)設(shè)置下的輪廓系數(shù)和Calinski-Harabasz指數(shù),可以確定哪種聚類結(jié)果更優(yōu)。在實際應用中,可能需要多次嘗試不同的參數(shù)組合,以找到最佳的聚類效果。3聚類結(jié)果可視化3.11、使用Matplotlib和Seaborn進行數(shù)據(jù)可視化在評估和理解AffinityPropagation聚類算法的結(jié)果時,數(shù)據(jù)可視化是一個強大的工具。它不僅幫助我們直觀地看到數(shù)據(jù)點如何被分組,還能揭示聚類的結(jié)構(gòu)和潛在的模式。本節(jié)將介紹如何使用Python中的Matplotlib和Seaborn庫來可視化AffinityPropagation的聚類結(jié)果。3.1.1示例代碼假設(shè)我們已經(jīng)使用AffinityPropagation對一個二維數(shù)據(jù)集進行了聚類,現(xiàn)在我們想要可視化這些聚類。首先,我們需要導入必要的庫,并準備數(shù)據(jù)。importnumpyasnp

importmatplotlib.pyplotasplt

importseabornassns

fromsklearn.clusterimportAffinityPropagation

fromsklearn.datasetsimportmake_blobs

#生成數(shù)據(jù)

X,_=make_blobs(n_samples=300,centers=4,random_state=42,cluster_std=0.60)

#使用AffinityPropagation進行聚類

af=AffinityPropagation(damping=0.9,max_iter=200)

af.fit(X)

cluster_centers_indices=af.cluster_centers_indices_

labels=af.labels_

#可視化結(jié)果

plt.figure(figsize=(10,8))

sns.scatterplot(x=X[:,0],y=X[:,1],hue=labels,palette=sns.color_palette("hls",len(cluster_centers_indices)),legend=False)

plt.scatter(X[cluster_centers_indices,0],X[cluster_centers_indices,1],c='black',s=200,alpha=0.5,label='Centers')

plt.title('AffinityPropagationClustering')

plt.xlabel('Feature1')

plt.ylabel('Feature2')

plt.show()3.1.2代碼解釋數(shù)據(jù)生成:我們使用make_blobs函數(shù)生成一個包含300個樣本、4個中心的二維數(shù)據(jù)集。聚類:通過AffinityPropagation類對數(shù)據(jù)進行聚類,設(shè)置damping和max_iter參數(shù)來控制算法的收斂。結(jié)果可視化:使用sns.scatterplot來繪制數(shù)據(jù)點,其中hue參數(shù)根據(jù)labels來著色,palette參數(shù)設(shè)置顏色方案。plt.scatter用于突出顯示聚類中心,通過cluster_centers_indices來確定中心點的位置。設(shè)置圖表的標題、坐標軸標簽,并顯示圖表。3.22、可視化技巧與最佳實踐3.2.1選擇合適的顏色方案在可視化聚類結(jié)果時,選擇一個清晰且區(qū)分度高的顏色方案至關(guān)重要。Seaborn的color_palette函數(shù)提供了多種顏色方案,如"hls"、"husl"或"deep",可以根據(jù)聚類的數(shù)量和數(shù)據(jù)的特性來選擇。3.2.2標記聚類中心在散點圖中,標記聚類中心可以幫助我們更好地理解聚類的結(jié)構(gòu)。使用不同的形狀或顏色來突出顯示中心點,如上述示例中的黑色大點。3.2.3使用圖例和標簽雖然在上述示例中我們沒有使用圖例,但在更復雜的可視化中,圖例和標簽可以幫助解釋圖表中的元素。確保所有重要的數(shù)據(jù)系列都有適當?shù)臉撕灒⒃谛枰獣r添加圖例。3.2.4調(diào)整圖表大小和分辨率根據(jù)數(shù)據(jù)集的大小和復雜性,調(diào)整圖表的大小和分辨率以確保所有細節(jié)都能清晰可見。在plt.figure中設(shè)置figsize參數(shù)可以調(diào)整圖表的大小。3.2.5交互式可視化對于高維數(shù)據(jù)或大型數(shù)據(jù)集,考慮使用交互式可視化工具,如Plotly或Bokeh,它們允許用戶通過縮放、平移和懸停來探索數(shù)據(jù)的細節(jié)。3.2.6結(jié)論通過使用Matplotlib和Seaborn,我們可以有效地可視化AffinityPropagation的聚類結(jié)果,從而更好地理解和評估算法的性能。選擇合適的數(shù)據(jù)可視化策略,如顏色方案、標記聚類中心和使用圖例,可以顯著提高結(jié)果的可讀性和解釋性。4案例研究:AffinityPropagation在真實數(shù)據(jù)集上的應用4.11、數(shù)據(jù)預處理與特征選擇在應用AffinityPropagation算法進行聚類之前,數(shù)據(jù)預處理和特征選擇是至關(guān)重要的步驟。這不僅確保數(shù)據(jù)的質(zhì)量,還能夠提高算法的效率和聚類結(jié)果的準確性。4.1.1數(shù)據(jù)預處理數(shù)據(jù)預處理包括清洗數(shù)據(jù)、處理缺失值、標準化或歸一化數(shù)據(jù)等步驟。例如,使用pandas庫讀取數(shù)據(jù)并處理缺失值:importpandasaspd

fromsklearn.preprocessingimportStandardScaler

#讀取數(shù)據(jù)

data=pd.read_csv('data.csv')

#處理缺失值

data=data.dropna()

#數(shù)據(jù)標準化

scaler=StandardScaler()

data_scaled=scaler.fit_transform(data)4.1.2特征選擇特征選擇是選擇對聚類結(jié)果有貢獻的特征,去除無關(guān)或冗余特征。可以使用sklearn的SelectKBest類進行特征選擇:fromsklearn.feature_selectionimportSelectKBest,f_classif

#特征選擇,選擇最好的10個特征

selector=SelectKBest(score_func=f_classif,k=10)

data_selected=selector.fit_transform(data_scaled,data['target'])4.22、應用AffinityPropagation進行聚類AffinityPropagation算法基于消息傳遞機制,能夠自動確定聚類的數(shù)量和中心。在sklearn中,可以使用AffinityPropagation類來實現(xiàn)這一算法:fromsklearn.clusterimportAffinityPropagation

#創(chuàng)建AffinityPropagation模型

af=AffinityPropagation(damping=0.5,max_iter=200,convergence_iter=15,preference=None,affinity='euclidean',verbose=False)

#擬合數(shù)據(jù)

af.fit(data_selected)

#獲取聚類標簽

cluster_labels=af.labels_4.2.1參數(shù)解釋damping:阻尼系數(shù),用于防止消息傳遞過程中的振蕩,通常設(shè)置在0.5到1之間。max_iter:最大迭代次數(shù)。convergence_iter:連續(xù)迭代次數(shù),如果在此次數(shù)內(nèi)收斂,則停止迭代。preference:每個樣本的偏好值,用于確定樣本成為聚類中心的可能性。affinity:相似度度量方式,通常使用euclidean歐氏距離。verbose:是否輸出詳細信息。4.33、結(jié)果評估與可視化展示4.3.1結(jié)果評估評估聚類結(jié)果通常使用輪廓系數(shù)(SilhouetteCoefficient)和Calinski-Harabasz指數(shù)等指標。輪廓系數(shù)衡量樣本與其所在聚類的相似度,以及與其他聚類的不相似度:fromsklearn.metricsimportsilhouette_score

#計算輪廓系數(shù)

silhouette_avg=silhouette_score(data_selected,cluster_labels)

print("Theaveragesilhouette_scoreis:",silhouette_avg)4.3.2可視化展示使用matplotlib庫可以將聚類結(jié)果可視化,幫助直觀理解聚類效果:importmatplotlib.pyplotasplt

#可視化聚類結(jié)果

plt.scatter(data_selected[:,0],data_selected[:,1],c=cluster_labels,s=50,cmap='viridis')

plt.title('AffinityPropagationClustering')

plt.show()4.3.3代碼示例假設(shè)我們有一個包含多個特征的data.csv數(shù)據(jù)集,以下是一個完整的AffinityPropagation聚類示例:importpandasaspd

fromsklearn.preprocessingimportStandardScaler

fromsklearn.feature_selectionimportSelectKBest,f_classif

fromsklearn.clusterimportAffinityPropagation

fromsklearn.metricsimportsilhouette_score

importmatplotlib.pyplotasplt

#數(shù)據(jù)預處理

data=pd.read_csv('data.csv')

data=data.dropna()

scaler=StandardScaler()

data_scaled=scaler.fit_transform(data)

#特征選擇

selector=SelectKBest(score_func=f_classif,k=10)

data_selected=selector.fit_transform(data_scaled,data['target'])

#應用AffinityPropagation

af=AffinityPropagation(damping=0.5,max_iter=200,convergence_iter=15,preference=None,affinity='euclidean',verbose=False)

af.fit(data_selected)

cluster_labels=af.labels_

#結(jié)果評估

silhouette_avg=silhouette_score(data_selected,cluster_labels)

print("Theaveragesilhouette_scoreis:",silhouette_avg)

#可視化展示

plt.scatter(data_selected[:,0],data_selected[:,1],c=cluster_labels,s=50,cmap='viridis')

plt.title('AffinityPropagationClustering')

plt.show()通過上述步驟,我們可以有效地應用AffinityP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論