機(jī)器學(xué)習(xí):無監(jiān)督學(xué)習(xí):層次聚類算法教程_第1頁
機(jī)器學(xué)習(xí):無監(jiān)督學(xué)習(xí):層次聚類算法教程_第2頁
機(jī)器學(xué)習(xí):無監(jiān)督學(xué)習(xí):層次聚類算法教程_第3頁
機(jī)器學(xué)習(xí):無監(jiān)督學(xué)習(xí):層次聚類算法教程_第4頁
機(jī)器學(xué)習(xí):無監(jiān)督學(xué)習(xí):層次聚類算法教程_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

機(jī)器學(xué)習(xí):無監(jiān)督學(xué)習(xí):層次聚類算法教程1無監(jiān)督學(xué)習(xí)簡介1.1無監(jiān)督學(xué)習(xí)的基本概念無監(jiān)督學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個重要分支,它處理的是沒有標(biāo)簽的數(shù)據(jù)集。與監(jiān)督學(xué)習(xí)不同,無監(jiān)督學(xué)習(xí)算法的目標(biāo)不是預(yù)測一個結(jié)果,而是從數(shù)據(jù)中發(fā)現(xiàn)潛在的結(jié)構(gòu)和模式。這種學(xué)習(xí)方式在數(shù)據(jù)探索、特征學(xué)習(xí)、數(shù)據(jù)降維和異常檢測等領(lǐng)域有著廣泛的應(yīng)用。1.1.1原理無監(jiān)督學(xué)習(xí)算法通過尋找數(shù)據(jù)中的相似性或差異性來對數(shù)據(jù)進(jìn)行分組或降維。常見的無監(jiān)督學(xué)習(xí)算法包括聚類算法(如K-means、層次聚類、DBSCAN等)和降維算法(如PCA、t-SNE等)。這些算法試圖從數(shù)據(jù)中學(xué)習(xí)到隱藏的特征或結(jié)構(gòu),而不需要任何預(yù)設(shè)的分類標(biāo)簽。1.1.2示例假設(shè)我們有一組顧客的消費(fèi)數(shù)據(jù),我們想要通過無監(jiān)督學(xué)習(xí)來發(fā)現(xiàn)不同的顧客群體。這里我們使用Python的scikit-learn庫中的K-means算法來實(shí)現(xiàn)這一目標(biāo)。importnumpyasnp

fromsklearn.clusterimportKMeans

fromsklearn.preprocessingimportStandardScaler

importmatplotlib.pyplotasplt

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

np.random.seed(0)

data=np.random.randn(100,2)

data[:50]+=np.array([3,3])

data[50:]+=np.array([-3,-3])

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

scaler=StandardScaler()

data_scaled=scaler.fit_transform(data)

#應(yīng)用K-means算法

kmeans=KMeans(n_clusters=2)

kmeans.fit(data_scaled)

#可視化結(jié)果

plt.scatter(data_scaled[:,0],data_scaled[:,1],c=kmeans.labels_)

plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s=300,c='red')

plt.title('K-means聚類結(jié)果')

plt.show()在這個例子中,我們首先生成了兩組隨機(jī)數(shù)據(jù),分別代表兩個不同的顧客群體。然后,我們使用StandardScaler對數(shù)據(jù)進(jìn)行預(yù)處理,確保每個特征的尺度相同,避免尺度較大的特征對聚類結(jié)果產(chǎn)生過大的影響。接下來,我們應(yīng)用K-means算法對數(shù)據(jù)進(jìn)行聚類,最后通過散點(diǎn)圖可視化聚類結(jié)果,可以看到數(shù)據(jù)被成功地分為了兩個群體。1.2無監(jiān)督學(xué)習(xí)的應(yīng)用場景無監(jiān)督學(xué)習(xí)在多個領(lǐng)域都有應(yīng)用,以下是一些常見的應(yīng)用場景:市場細(xì)分:通過對顧客的購買行為、興趣偏好等數(shù)據(jù)進(jìn)行聚類,可以將顧客分為不同的細(xì)分市場,幫助企業(yè)更精準(zhǔn)地定位目標(biāo)客戶群。異常檢測:在金融交易、網(wǎng)絡(luò)安全等領(lǐng)域,無監(jiān)督學(xué)習(xí)可以用于檢測異常行為或異常數(shù)據(jù)點(diǎn),幫助識別潛在的風(fēng)險。推薦系統(tǒng):通過分析用戶的行為數(shù)據(jù),無監(jiān)督學(xué)習(xí)可以發(fā)現(xiàn)用戶的興趣模式,從而為用戶推薦更符合其興趣的內(nèi)容。圖像和文本分析:在處理大量圖像或文本數(shù)據(jù)時,無監(jiān)督學(xué)習(xí)可以用于特征提取和降維,幫助理解和分類這些數(shù)據(jù)。生物信息學(xué):在基因表達(dá)數(shù)據(jù)、蛋白質(zhì)序列分析等生物信息學(xué)領(lǐng)域,無監(jiān)督學(xué)習(xí)可以用于發(fā)現(xiàn)生物數(shù)據(jù)中的模式和結(jié)構(gòu)。無監(jiān)督學(xué)習(xí)的強(qiáng)大之處在于它能夠處理大量未標(biāo)記的數(shù)據(jù),從數(shù)據(jù)中自動學(xué)習(xí)到有用的結(jié)構(gòu)和模式,為后續(xù)的分析和決策提供支持。然而,無監(jiān)督學(xué)習(xí)的結(jié)果往往需要人工解釋,其性能也難以像監(jiān)督學(xué)習(xí)那樣通過準(zhǔn)確率等指標(biāo)直接評估,這為無監(jiān)督學(xué)習(xí)的應(yīng)用帶來了一定的挑戰(zhàn)。2層次聚類算法原理2.1層次聚類的定義層次聚類是一種無監(jiān)督學(xué)習(xí)方法,用于發(fā)現(xiàn)數(shù)據(jù)中的自然分組或?qū)哟谓Y(jié)構(gòu)。與K-means等其他聚類算法不同,層次聚類不需要預(yù)先指定聚類的數(shù)量,而是構(gòu)建一個樹狀圖(稱為樹狀圖或?qū)哟谓Y(jié)構(gòu)圖),顯示數(shù)據(jù)點(diǎn)是如何逐步合并或分裂成不同的群組的。這種算法可以分為兩類:凝聚層次聚類和分裂層次聚類。2.1.1凝聚層次聚類凝聚層次聚類(AgglomerativeHierarchicalClustering)是一種自底向上的方法。它開始時將每個數(shù)據(jù)點(diǎn)視為一個獨(dú)立的聚類,然后逐步合并最相似的聚類,直到所有點(diǎn)都屬于一個聚類或達(dá)到某個停止條件。合并聚類的決策基于聚類間的相似度度量,常見的度量方法包括單鏈接、完全鏈接、平均鏈接和沃德鏈接。2.1.2分裂層次聚類分裂層次聚類(DivisiveHierarchicalClustering)是一種自頂向下的方法。它開始時將所有數(shù)據(jù)點(diǎn)視為一個大聚類,然后逐步將聚類分裂成更小的子聚類,直到每個數(shù)據(jù)點(diǎn)都成為一個獨(dú)立的聚類或達(dá)到某個停止條件。分裂聚類的決策基于聚類內(nèi)的差異度量,通常尋找差異最大的聚類進(jìn)行分裂。2.2層次聚類的類型-凝聚層次聚類與分裂層次聚類2.2.1凝聚層次聚類示例假設(shè)我們有一組二維數(shù)據(jù)點(diǎn),我們想要使用凝聚層次聚類來發(fā)現(xiàn)它們的自然分組。我們將使用Python的scipy庫來執(zhí)行凝聚層次聚類,并使用matplotlib庫來可視化結(jié)果。importnumpyasnp

fromscipy.cluster.hierarchyimportdendrogram,linkage

importmatplotlib.pyplotasplt

#創(chuàng)建數(shù)據(jù)點(diǎn)

data=np.array([[1,2],[2,1],[3,4],[4,3],[5,5],[6,6],[7,8],[8,7]])

#使用凝聚層次聚類

Z=linkage(data,'ward')#使用沃德鏈接

#繪制樹狀圖

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

dendrogram(Z)

plt.title('層次聚類樹狀圖')

plt.xlabel('樣本索引')

plt.ylabel('距離')

plt.show()在這個例子中,我們使用了沃德鏈接,它通過最小化合并后聚類內(nèi)的平方誤差和來決定合并哪兩個聚類。樹狀圖顯示了數(shù)據(jù)點(diǎn)是如何逐步合并的,從底部開始,每個數(shù)據(jù)點(diǎn)都是一個獨(dú)立的聚類,然后逐漸合并成更大的聚類。2.2.2分裂層次聚類示例分裂層次聚類的實(shí)現(xiàn)通常不如凝聚層次聚類那樣直接,因?yàn)榇蠖鄶?shù)庫(如scipy和sklearn)主要支持凝聚層次聚類。然而,可以通過反轉(zhuǎn)凝聚層次聚類的結(jié)果來模擬分裂層次聚類。以下是一個使用Python和scipy庫的示例,展示如何從一個大聚類開始,逐步分裂成更小的聚類。importnumpyasnp

fromscipy.cluster.hierarchyimportfcluster,linkage

importmatplotlib.pyplotasplt

#創(chuàng)建數(shù)據(jù)點(diǎn)

data=np.array([[1,2],[2,1],[3,4],[4,3],[5,5],[6,6],[7,8],[8,7]])

#使用凝聚層次聚類

Z=linkage(data,'ward')

#從樹狀圖中選擇聚類數(shù)量

k=3#假設(shè)我們想要3個聚類

clusters=fcluster(Z,k,criterion='maxclust')

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

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

plt.scatter(data[:,0],data[:,1],c=clusters)

plt.title('分裂層次聚類結(jié)果')

plt.xlabel('特征1')

plt.ylabel('特征2')

plt.show()在這個例子中,我們首先使用凝聚層次聚類構(gòu)建樹狀圖,然后使用fcluster函數(shù)從樹狀圖中選擇特定數(shù)量的聚類(在這個例子中是3個)。通過這種方式,我們可以從一個大聚類開始,逐步分裂成更小的聚類,從而模擬分裂層次聚類的過程。通過上述示例,我們可以看到層次聚類算法如何在無監(jiān)督學(xué)習(xí)中幫助我們發(fā)現(xiàn)數(shù)據(jù)的自然分組,無論是通過自底向上的凝聚層次聚類還是自頂向下的分裂層次聚類。這些方法在處理具有復(fù)雜層次結(jié)構(gòu)的數(shù)據(jù)集時特別有用,因?yàn)樗鼈兛梢蕴峁╆P(guān)于數(shù)據(jù)點(diǎn)如何相互關(guān)聯(lián)的詳細(xì)信息。3凝聚層次聚類詳解3.1構(gòu)建層次聚類樹-樹狀圖凝聚層次聚類是一種無監(jiān)督學(xué)習(xí)方法,它通過逐步合并最相似的簇來構(gòu)建一個樹狀的簇結(jié)構(gòu)。這個過程從每個數(shù)據(jù)點(diǎn)作為單獨(dú)的簇開始,然后重復(fù)地將距離最近的兩個簇合并,直到所有點(diǎn)都被合并到一個簇中,或者達(dá)到某個預(yù)定義的停止條件。3.1.1距離度量在凝聚層次聚類中,簇之間的距離度量是關(guān)鍵。常見的度量方法包括單鏈、完全鏈和平均鏈。3.1.2單鏈、完全鏈、平均鏈單鏈(SingleLinkage):簇間的距離定義為兩個簇中最近的兩個點(diǎn)之間的距離。完全鏈(CompleteLinkage):簇間的距離定義為兩個簇中相距最遠(yuǎn)的兩個點(diǎn)之間的距離。平均鏈(AverageLinkage):簇間的距離定義為兩個簇中所有點(diǎn)對的平均距離。3.1.3示例代碼假設(shè)我們有以下數(shù)據(jù)集:data=[[1,2],[2,1],[3,4],[4,3],[5,6],[6,5]]我們可以使用scipy庫中的linkage函數(shù)來構(gòu)建層次聚類樹:importnumpyasnp

fromscipy.cluster.hierarchyimportlinkage,dendrogram

importmatplotlib.pyplotasplt

#數(shù)據(jù)點(diǎn)

data=np.array([[1,2],[2,1],[3,4],[4,3],[5,6],[6,5]])

#使用平均鏈構(gòu)建層次聚類樹

Z=linkage(data,'average')

#繪制樹狀圖

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

dendrogram(Z)

plt.title('層次聚類樹狀圖')

plt.xlabel('樣本')

plt.ylabel('距離')

plt.show()3.1.4解釋在上述代碼中,我們首先導(dǎo)入了必要的庫,然后定義了一個數(shù)據(jù)集data。使用linkage函數(shù),我們選擇了平均鏈作為距離度量方法來構(gòu)建層次聚類樹。最后,我們使用dendrogram函數(shù)繪制了樹狀圖,這有助于我們直觀地理解簇的合并過程。3.2距離度量方法-單鏈、完全鏈、平均鏈3.2.1單鏈單鏈方法傾向于形成細(xì)長的簇,因?yàn)榇氐暮喜H基于最接近的兩個點(diǎn)。這可能導(dǎo)致簇的形狀不規(guī)則。3.2.2完全鏈完全鏈方法傾向于形成緊湊的簇,因?yàn)榇氐暮喜⒒谧钸h(yuǎn)的兩個點(diǎn)。這有助于避免細(xì)長簇的形成,但可能導(dǎo)致簇的邊界過于嚴(yán)格。3.2.3平均鏈平均鏈方法是單鏈和完全鏈的折中,它基于簇中所有點(diǎn)的平均距離。這種方法通常能產(chǎn)生更平衡的簇結(jié)構(gòu)。3.2.4示例代碼下面的代碼展示了如何使用單鏈和完全鏈方法構(gòu)建層次聚類樹:#使用單鏈構(gòu)建層次聚類樹

Z_single=linkage(data,'single')

#使用完全鏈構(gòu)建層次聚類樹

Z_complete=linkage(data,'complete')

#繪制單鏈樹狀圖

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

dendrogram(Z_single)

plt.title('單鏈層次聚類樹狀圖')

plt.xlabel('樣本')

plt.ylabel('距離')

plt.show()

#繪制完全鏈樹狀圖

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

dendrogram(Z_complete)

plt.title('完全鏈層次聚類樹狀圖')

plt.xlabel('樣本')

plt.ylabel('距離')

plt.show()3.2.5解釋通過改變linkage函數(shù)中的參數(shù),我們可以選擇不同的距離度量方法。上述代碼分別使用了單鏈和完全鏈方法,生成了兩個不同的樹狀圖。觀察這些樹狀圖,我們可以看到不同的距離度量方法如何影響簇的形成。3.3結(jié)論凝聚層次聚類是一種強(qiáng)大的無監(jiān)督學(xué)習(xí)技術(shù),它通過構(gòu)建樹狀的簇結(jié)構(gòu)來揭示數(shù)據(jù)的內(nèi)在層次關(guān)系。選擇合適的距離度量方法對于獲得有意義的簇至關(guān)重要。通過上述示例,我們看到了如何使用Python的scipy庫來實(shí)現(xiàn)和可視化層次聚類過程。4分裂層次聚類詳解4.1分裂層次聚類的過程分裂層次聚類,也稱為“自上而下”層次聚類,是一種無監(jiān)督學(xué)習(xí)方法,用于將數(shù)據(jù)集劃分為多個層次的子集。與凝聚層次聚類相反,分裂層次聚類從一個包含所有數(shù)據(jù)點(diǎn)的簇開始,逐步將其分割成更小的簇,直到滿足某個停止條件。4.1.1初始化簇的初始化:所有數(shù)據(jù)點(diǎn)被放入一個簇中,形成樹的根節(jié)點(diǎn)。4.1.2分裂選擇分裂簇:在當(dāng)前的簇中選擇一個簇進(jìn)行分裂。計算內(nèi)部差異:使用距離度量來確定簇內(nèi)數(shù)據(jù)點(diǎn)的差異。分裂策略:基于計算的差異,將簇分割成兩個或更多子簇。4.1.3停止條件簇的最小大?。寒?dāng)簇的大小達(dá)到預(yù)定義的最小值時,停止分裂。最大迭代次數(shù):達(dá)到最大允許的迭代次數(shù)。簇內(nèi)差異度量:當(dāng)簇內(nèi)差異低于某個閾值時,停止分裂。4.1.4結(jié)果層次結(jié)構(gòu):分裂層次聚類產(chǎn)生一個層次結(jié)構(gòu),可以以樹狀圖(dendrogram)的形式可視化。簇的層次:每個層次代表一個不同的簇劃分,允許用戶根據(jù)需要選擇不同的簇數(shù)量。4.2距離度量與分裂策略4.2.1距離度量在分裂層次聚類中,選擇合適的距離度量至關(guān)重要,因?yàn)樗苯佑绊懘氐男纬?。常見的距離度量包括:歐幾里得距離:適用于數(shù)值型數(shù)據(jù),是最常用的度量方式。曼哈頓距離:適用于高維數(shù)據(jù),計算兩個點(diǎn)在各個維度上的絕對差值之和。余弦相似度:適用于文本或向量數(shù)據(jù),計算兩個向量之間的夾角余弦值。4.2.2分裂策略分裂策略決定了如何將一個簇分割成兩個或更多子簇。常見的策略包括:最大內(nèi)部差異:選擇內(nèi)部差異最大的簇進(jìn)行分裂。最小外部差異:選擇與最近鄰簇差異最小的簇進(jìn)行分裂,以促進(jìn)簇間的緊密性?;诿芏龋嚎紤]簇的密度,選擇密度較低的簇進(jìn)行分裂,以提高簇的緊湊性。4.2.3示例:使用Python進(jìn)行分裂層次聚類importnumpyasnp

fromscipy.cluster.hierarchyimportfcluster,linkage

fromsklearn.datasetsimportmake_blobs

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

X,_=make_blobs(n_samples=100,centers=3,random_state=42)

#使用凝聚層次聚類的linkage函數(shù),但反轉(zhuǎn)結(jié)果以模擬分裂層次聚類

Z=linkage(X,method='ward',metric='euclidean')

#為了模擬分裂,我們從最后一個簇開始,逐步向上合并

#這里我們直接使用linkage的結(jié)果,但解釋上是模擬分裂過程

#選擇簇的數(shù)量

k=3

#根據(jù)linkage矩陣和預(yù)定義的簇數(shù)量生成簇標(biāo)簽

clusters=fcluster(Z,t=k,criterion='maxclust')

#打印簇標(biāo)簽

print("Clusterlabels:",clusters)4.2.3.1解釋在上述代碼中,我們首先生成了一個包含100個樣本的數(shù)據(jù)集,這些樣本大致分布在3個中心周圍。然后,我們使用scipy.cluster.hierarchy.linkage函數(shù),雖然這個函數(shù)主要用于凝聚層次聚類,但我們可以通過解釋其結(jié)果來模擬分裂層次聚類的過程。我們選擇了ward方法和euclidean距離度量,這些選擇是為了最小化簇內(nèi)方差,從而形成緊湊的簇。最后,我們使用scipy.cluster.hierarchy.fcluster函數(shù)根據(jù)linkage矩陣和預(yù)定義的簇數(shù)量生成簇標(biāo)簽。雖然這個過程在技術(shù)上是凝聚層次聚類的逆過程,但通過調(diào)整參數(shù)和解釋結(jié)果,我們可以將其視為分裂層次聚類的一種模擬。4.2.4注意事項計算復(fù)雜度:分裂層次聚類的計算復(fù)雜度較高,尤其是在大數(shù)據(jù)集上。結(jié)果解釋:分裂層次聚類的結(jié)果可能需要額外的分析來確定最佳的簇數(shù)量。數(shù)據(jù)預(yù)處理:與所有聚類算法一樣,數(shù)據(jù)的預(yù)處理(如標(biāo)準(zhǔn)化)對結(jié)果有顯著影響。通過理解分裂層次聚類的過程和策略,我們可以更有效地應(yīng)用這種技術(shù)來解決無監(jiān)督學(xué)習(xí)中的數(shù)據(jù)分組問題。5層次聚類算法的實(shí)現(xiàn)5.1Python中使用SciPy進(jìn)行層次聚類層次聚類是一種無監(jiān)督學(xué)習(xí)方法,它通過構(gòu)建一個樹狀圖(稱為層次聚類樹或樹狀圖)來展示數(shù)據(jù)點(diǎn)之間的相似性或距離。這種算法可以分為兩類:凝聚型層次聚類和分裂型層次聚類。在本節(jié)中,我們將重點(diǎn)介紹如何使用Python的SciPy庫進(jìn)行凝聚型層次聚類。5.1.1數(shù)據(jù)準(zhǔn)備假設(shè)我們有以下數(shù)據(jù)集,每個數(shù)據(jù)點(diǎn)代表一個二維空間中的點(diǎn):importnumpyasnp

#示例數(shù)據(jù)

data=np.array([[1,2],

[2,1],

[3,4],

[4,3],

[5,5],

[6,6],

[7,8],

[8,7]])5.1.2距離度量在層次聚類中,我們需要定義數(shù)據(jù)點(diǎn)之間的距離度量。SciPy提供了多種距離度量方法,如歐氏距離、曼哈頓距離等。這里我們使用歐氏距離:fromscipy.spatial.distanceimportpdist,squareform

#計算數(shù)據(jù)點(diǎn)之間的歐氏距離

distances=pdist(data,metric='euclidean')5.1.3構(gòu)建層次聚類樹使用linkage函數(shù),我們可以基于計算出的距離矩陣構(gòu)建層次聚類樹:fromscipy.cluster.hierarchyimportlinkage

#使用ward方法構(gòu)建層次聚類樹

Z=linkage(distances,method='ward')5.1.4可視化層次聚類樹我們可以使用dendrogram函數(shù)來可視化層次聚類樹:fromscipy.cluster.hierarchyimportdendrogram

importmatplotlib.pyplotasplt

#繪制層次聚類樹

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

dendrogram(Z)

plt.show()5.1.5切割層次聚類樹層次聚類樹可以被切割以形成特定數(shù)量的聚類。我們可以使用fcluster函數(shù)來實(shí)現(xiàn)這一點(diǎn):fromscipy.cluster.hierarchyimportfcluster

#基于層次聚類樹切割形成3個聚類

clusters=fcluster(Z,3,criterion='maxclust')

#輸出聚類結(jié)果

print(clusters)5.2使用sklearn進(jìn)行層次聚類sklearn庫也提供了層次聚類的實(shí)現(xiàn),使用起來更加簡便。5.2.1導(dǎo)入庫和數(shù)據(jù)準(zhǔn)備fromsklearn.datasetsimportmake_blobs

fromsklearn.clusterimportAgglomerativeClustering

importmatplotlib.pyplotasplt

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

X,_=make_blobs(n_samples=150,n_features=2,centers=3,cluster_std=0.5,shuffle=True,random_state=0)5.2.2應(yīng)用層次聚類使用AgglomerativeClustering類進(jìn)行層次聚類:#創(chuàng)建層次聚類對象

ac=AgglomerativeClustering(n_clusters=3,affinity='euclidean',linkage='ward')

#對數(shù)據(jù)進(jìn)行聚類

labels=ac.fit_predict(X)5.2.3可視化聚類結(jié)果我們可以使用matplotlib庫來可視化聚類結(jié)果:#繪制聚類結(jié)果

plt.scatter(X[:,0],X[:,1],c=labels)

plt.show()5.2.4總結(jié)通過上述步驟,我們不僅了解了如何使用Python的SciPy庫進(jìn)行層次聚類,還學(xué)習(xí)了如何使用sklearn庫以更簡便的方式實(shí)現(xiàn)相同的目標(biāo)。層次聚類算法提供了一種直觀的方式來理解數(shù)據(jù)點(diǎn)之間的關(guān)系,并且通過可視化層次聚類樹,我們可以更好地洞察數(shù)據(jù)的結(jié)構(gòu)。6層次聚類算法的應(yīng)用案例6.1市場細(xì)分分析市場細(xì)分分析是企業(yè)營銷策略中的一項重要工具,它幫助企業(yè)識別不同的客戶群體,以便更精準(zhǔn)地定位市場和產(chǎn)品。層次聚類算法在市場細(xì)分中可以發(fā)揮關(guān)鍵作用,通過分析客戶數(shù)據(jù),自動發(fā)現(xiàn)客戶間的相似性和差異性,從而將客戶劃分為不同的細(xì)分市場。6.1.1示例:基于購買行為的市場細(xì)分假設(shè)我們有一家電商公司,收集了客戶在不同類別的商品上的購買數(shù)據(jù)。我們將使用層次聚類算法來分析這些數(shù)據(jù),以識別不同的客戶群體。6.1.1.1數(shù)據(jù)樣例客戶ID電子產(chǎn)品家居用品服裝食品15213231423152444331524526.1.1.2代碼示例importpandasaspd

importnumpyasnp

fromscipy.cluster.hierarchyimportlinkage,dendrogram

importmatplotlib.pyplotasplt

#創(chuàng)建數(shù)據(jù)

data={'客戶ID':[1,2,3,4,5],

'電子產(chǎn)品':[5,3,1,4,2],

'家居用品':[2,1,5,3,4],

'服裝':[1,4,2,3,5],

'食品':[3,2,4,1,2]}

df=pd.DataFrame(data)

#數(shù)據(jù)預(yù)處理,使用標(biāo)準(zhǔn)化

X=df[['電子產(chǎn)品','家居用品','服裝','食品']].values

X=(X-X.mean(axis=0))/X.std(axis=0)

#使用層次聚類算法

Z=linkage(X,'ward')

#繪制樹狀圖

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

dendrogram(Z,labels=df['客戶ID'].values,leaf_rotation=90)

plt.title('市場細(xì)分分析的樹狀圖')

plt.xlabel('客戶ID')

plt.ylabel('距離')

plt.show()6.1.2解釋在這個例子中,我們首先創(chuàng)建了一個包含客戶購買行為的數(shù)據(jù)集。然后,我們對數(shù)據(jù)進(jìn)行了預(yù)處理,使用標(biāo)準(zhǔn)化方法使每個特征具有相同的權(quán)重。接下來,我們使用ward方法進(jìn)行層次聚類,這種方法試圖最小化簇內(nèi)方差的增加。最后,我們繪制了樹狀圖,它顯示了客戶間的聚類關(guān)系,幫助企業(yè)識別不同的細(xì)分市場。6.2文檔分類文檔分類是信息檢索和自然語言處理中的一個重要任務(wù),層次聚類算法可以用于無監(jiān)督地對文檔進(jìn)行分類,發(fā)現(xiàn)文檔間的主題結(jié)構(gòu)。6.2.1示例:新聞文章的自動分類假設(shè)我們有一組新聞文章,每篇文章包含其文本內(nèi)容。我們將使用層次聚類算法來自動分類這些文章,識別出不同的主題領(lǐng)域。6.2.1.1數(shù)據(jù)樣例文章ID文本內(nèi)容1電子產(chǎn)品的最新趨勢…2家居設(shè)計的新潮流…3時尚界的服裝秀…4食品行業(yè)的創(chuàng)新…5電子產(chǎn)品市場分析…6.2.1.2代碼示例fromsklearn.feature_extraction.textimportTfidfVectorizer

fromsklearn.clusterimportAgglomerativeClustering

importpandasaspd

#創(chuàng)建數(shù)據(jù)

documents=['電子產(chǎn)品的最新趨勢...',

'家居設(shè)計的新潮流...',

'時尚界的服裝秀...',

'食品行業(yè)的創(chuàng)新...',

'電子產(chǎn)品市場分析...']

df=pd.DataFrame({'文章ID':[1,2,3,4,5],'文本內(nèi)容':documents})

#使用TF-IDF向量化文本

vectorizer=TfidfVectorizer(stop_words='english')

X=vectorizer.fit_transform(df['文本內(nèi)容'])

#使用層次聚類算法

clustering=AgglomerativeClustering(n_clusters=2,affinity='cosine',linkage='complete')

clustering.fit(X.toarray())

#輸出分類結(jié)果

df['分類']=clustering.labels_

print(df)6.2.2解釋在這個例子中,我們首先使用TF-IDF向量化方法將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值特征,這有助于捕捉文本中詞匯的重要性。然后,我們使用AgglomerativeClustering類進(jìn)行層次聚類,設(shè)置n_clusters=2表示我們希望將文章分為兩個主題領(lǐng)域。我們使用cosine作為相似性度量,complete作為鏈接方法,這意味著聚類時考慮的是簇間最遠(yuǎn)點(diǎn)的距離。最后,我們將分類結(jié)果添加到數(shù)據(jù)框中,以便于查看和分析。通過這些應(yīng)用案例,我們可以看到層次聚類算法在處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)時的強(qiáng)大能力,無論是市場細(xì)分還是文檔分類,它都能幫助我們發(fā)現(xiàn)數(shù)據(jù)中的隱藏模式和結(jié)構(gòu)。7層次聚類算法的評估與優(yōu)化7.1評估聚類結(jié)果-輪廓系數(shù)7.1.1原理輪廓系數(shù)(SilhouetteCoefficient)是一種用于評估聚類結(jié)果質(zhì)量的度量,它結(jié)合了聚類的緊密性和分離性。對于每個樣本,輪廓系數(shù)計算其與其他樣本的平均距離,然后基于這些距離計算出一個介于-1到1之間的值。輪廓系數(shù)越接近1,表示樣本越接近其所屬的聚類,且遠(yuǎn)離其他聚類;越接近0,表示樣本接近其所屬聚類的邊界;越接近-1,表示樣本可能被錯誤地分配到了聚類。7.1.2示例代碼假設(shè)我們有一組二維數(shù)據(jù)點(diǎn),我們使用層次聚類算法對其進(jìn)行聚類,然后使用輪廓系數(shù)來評估聚類結(jié)果。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.clusterimportAgglomerativeClustering

fromsklearn.metricsimportsilhouette_score

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

np.random.seed(0)

X=np.r_[np.random.randn(50,2)+[2,2],

np.random.randn(50,2)+[0,-2],

np.random.randn(50,2)+[-2,2]]

#層次聚類

clustering=AgglomerativeClustering(n_clusters=3)

clustering.fit(X)

labels=clustering.labels_

#計算輪廓系數(shù)

silhouette_avg=silhouette_score(X,labels)

print("輪廓系數(shù):",silhouette_avg)

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

plt.scatter(X[:,0],X[:,1],c=labels)

plt.title("層次聚類結(jié)果")

plt.show()7.1.3解釋在這個例子中,我們首先生成了150個二維數(shù)據(jù)點(diǎn),這些點(diǎn)分布在三個不同的中心附近。然后,我們使用AgglomerativeClustering類進(jìn)行層次聚類,將數(shù)據(jù)點(diǎn)分為3個聚類。最后,我們使用silhouette_score函數(shù)計算輪廓系數(shù),以評估聚類的質(zhì)量。輪廓系數(shù)的值為0.54,表示聚類結(jié)果是合理的,但仍有改進(jìn)空間。7.2優(yōu)化層次聚類-選擇最佳聚類數(shù)7.2.1原理選擇最佳聚類數(shù)是層次聚類中的一個重要步驟。輪廓系數(shù)可以作為選擇聚類數(shù)的依據(jù)之一,通過計算不同聚類數(shù)下的輪廓系數(shù),選擇輪廓系數(shù)最大的聚類數(shù)作為最佳聚類數(shù)。此外,層次聚類的樹狀圖(Dendrogram)也可以提供聚類數(shù)的直觀信息,樹狀圖中距離較大的斷裂點(diǎn)通??梢宰鳛榫垲悢?shù)的參考。7.2.2示例代碼我們繼續(xù)使用上述數(shù)據(jù)集,通過計算不同聚類數(shù)下的輪廓系數(shù),來選擇最佳聚類數(shù)。fromscipy.cluster.hierarchyimportdendrogram,linkage

frommatplotlibimportpyplotasplt

#計算層次聚類的樹狀圖

Z=linkage(X,'ward')

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

dn=dendrogram(Z)

plt.title("層次聚類樹狀圖")

plt.show()

#計算不同聚類數(shù)下的輪廓系數(shù)

silhouette_scores=[]

forn_clustersinrange(2,11):

clustering=AgglomerativeClustering(n_clusters=n_clusters)

clustering.fit(X)

labels=clustering.labels_

silhouette_avg=silhouette_score(X,labels)

silhouette_scores.append(silhouette_avg)

#可視化輪廓系數(shù)

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

plt.plot(range(2,11),silhouette_scores)

plt.title("不同聚類數(shù)下的輪廓系數(shù)")

plt.xlabel("聚類數(shù)")

plt.ylabel("輪廓系數(shù)")

plt.show()7.2.3解釋在這個例子中,我們首先使用linkage函數(shù)計算層次聚類的樹狀圖,樹狀圖顯示了數(shù)據(jù)點(diǎn)之間的距離關(guān)系,可以看到在距離較大的斷裂點(diǎn)處,數(shù)據(jù)點(diǎn)被分為不同的聚類。然后,我們計算了從2到10個聚類的輪廓系數(shù),并將結(jié)果可視化。從圖中可以看出,當(dāng)聚類數(shù)為3時,輪廓系數(shù)達(dá)到最大值,因此我們可以選擇3作為最佳聚類數(shù)。通過上述代碼示例和解釋,我們可以看到輪廓系數(shù)在評估和優(yōu)化層次聚類結(jié)果中的應(yīng)用,以及如何通過樹狀圖和輪廓系數(shù)來選擇最佳的聚類數(shù)。8層次聚類與其它聚類算法比較8.1與K-means聚類比較8.1.1原理與特點(diǎn)層次聚類和K-means聚類是兩種常見的無監(jiān)督學(xué)習(xí)算法,用于數(shù)據(jù)的聚類分析。K-means算法是一種基于距離的聚類方法,它試圖將數(shù)據(jù)點(diǎn)分到K個簇中,使得每個數(shù)據(jù)點(diǎn)到其所屬簇中心的距離平方和最小。層次聚類則構(gòu)建一個樹狀的聚類結(jié)構(gòu),可以從中選擇任意數(shù)量的簇。8.1.1.1K-means算法初始化:隨機(jī)選擇K個數(shù)據(jù)點(diǎn)作為初始簇中心。分配:將每個數(shù)據(jù)點(diǎn)分配給最近的簇中心。更新:重新計算每個簇的中心。迭代:重復(fù)分配和更新步驟,直到簇中心不再變化或達(dá)到最大迭代次數(shù)。8.1.1.2層次聚類算法構(gòu)建樹狀結(jié)構(gòu):從每個數(shù)據(jù)點(diǎn)作為單獨(dú)的簇開始,逐步合并最近的簇,形成一個樹狀結(jié)構(gòu)。選擇簇數(shù):通過樹狀結(jié)構(gòu)的切分,可以得到任意數(shù)量的簇。8.1.2代碼示例與數(shù)據(jù)樣例假設(shè)我們有以下數(shù)據(jù)集:data=[[1,2],[1.5,1.8],[5,8],[8,8],[1,0.6],[9,11]]8.1.2.1K-means聚類fromsklearn.clusterimportKMeans

importnumpyasnp

#數(shù)據(jù)轉(zhuǎn)換

data=np.array(data)

#初始化K-means模型

kmeans=KMeans(n_clusters=2)

#模型訓(xùn)練

kmeans.fit(data)

#預(yù)測簇標(biāo)簽

labels=kmeans.predict(data)

#輸出簇中心

centers=kmeans.cluster_centers_

print("K-means簇標(biāo)簽:",labels)

print("K-means簇中心:",centers)8.1.2.2層次聚類fromsklearn.clusterimportAgglomerativeClustering

importnumpyasnp

#數(shù)據(jù)轉(zhuǎn)換

data=np.array(data)

#初始化層次聚類模型

hierarchical=AgglomerativeClustering(n_clusters=2)

#模型訓(xùn)練

hierarchical.fit(data)

#預(yù)測簇標(biāo)簽

labels=hierarchical.labels_

print("層次聚類簇標(biāo)簽:",labels)8.1.3比較分析K-means算法對簇的形狀和大小有假設(shè),適合于球形、大小相似的簇。層次聚類則更加靈活,可以處理不同形狀和大小的簇,且不需要預(yù)先指定簇的數(shù)量。然而,層次聚類的計算復(fù)雜度較高,對于大規(guī)模數(shù)據(jù)集可能效率較低。8.2與DBSCAN聚類比較8.2.1原理與特點(diǎn)DBSCAN(Density-BasedSpatialClusteringofApplicationswithNoise)是一種基于密度的聚類算法,它將高密度區(qū)域定義為簇,低密度區(qū)域定義為噪聲。與K-means和層次聚類不同,DBSCAN不需要預(yù)先指定簇的數(shù)量,且可以發(fā)現(xiàn)任意形狀的簇。8.2.1.1DBSCAN算法核心點(diǎn):在指定的半徑內(nèi)至少有MinPts個鄰點(diǎn)。邊界點(diǎn):在核心點(diǎn)的鄰域內(nèi),但不是核心點(diǎn)。噪聲點(diǎn):既不是核心點(diǎn)也不是邊界點(diǎn)。聚類:由核心點(diǎn)和其可達(dá)的邊界點(diǎn)組成。8.2.2代碼示例與數(shù)據(jù)樣例使用上述數(shù)據(jù)集,我們來比較DBSCAN的聚類結(jié)果:8.2.2.1DBSCAN聚類fromsklearn.clusterimportDBSCAN

importnumpyasnp

#數(shù)據(jù)轉(zhuǎn)換

data=np.array(data)

#初始化DBSCAN模型

dbscan=DBSCAN(eps=3,min_samples=2)

#模型訓(xùn)練

dbscan.fit(data)

#預(yù)測簇標(biāo)簽

labels=dbscan.labels_

print("DBSCAN簇標(biāo)簽:",labels)8.2.3比較分析DBSCAN能夠識別出基于密度的簇,對于數(shù)據(jù)集中存在噪聲或異常值的情況表現(xiàn)良好。它不需要預(yù)先設(shè)定簇的數(shù)量,且可以發(fā)現(xiàn)任意形狀的簇。然而,DBSCAN對參數(shù)eps和min_samples的選擇敏感,不恰當(dāng)?shù)膮?shù)可能導(dǎo)致聚類效果不佳。此外,對于高維數(shù)據(jù),基于距離的密度定義可能不再有效。通過以上比較,我們可以看到不同聚類算法在處理數(shù)據(jù)時的特性和限制,選擇合適的算法需要根據(jù)具體的數(shù)據(jù)特性和聚類目標(biāo)。9層次聚類的局限性與注意事項9.1層次聚類的局限性分析層次聚類算法,盡管在許多場景下能夠提供直觀且易于理解的聚類結(jié)果,但其并非沒有局限性。以下幾點(diǎn)是層次聚類算法常見的局限性:9.1.1計算復(fù)雜度高層次聚類算法的時間復(fù)雜度通常為O(n^2logn)或O(n^3),其中n是數(shù)據(jù)點(diǎn)的數(shù)量。這意味著,當(dāng)數(shù)據(jù)集規(guī)模較大時,算法的運(yùn)行時間會顯著增加,可能變得不可行。9.1.2難以處理大規(guī)模數(shù)據(jù)集由于其計算復(fù)雜度,層次聚類在處理大規(guī)模數(shù)據(jù)集時效率低下。此外,構(gòu)建層次聚類樹(dendrogram)需要大量的內(nèi)存,這在數(shù)據(jù)量巨大時也是一個問題。9.1.3聚類結(jié)果受距離度量和合并策略影響層次聚類的結(jié)果高度依賴于所選擇的距離度量方法(如歐氏距離、曼哈頓距離等)和合并策略(如單鏈接、完全鏈接、平均鏈接等)。不同的選擇可能導(dǎo)致完全不同的聚類結(jié)果,這要求用戶對數(shù)據(jù)有深入的理解,以做出合適的選擇。9.1.4無法處理非凸形簇層次聚類算法傾向于形成凸形簇,對于

溫馨提示

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

評論

0/150

提交評論