人工智能和機(jī)器學(xué)習(xí)之聚類算法:層次聚類與K均值聚類的比較_第1頁(yè)
人工智能和機(jī)器學(xué)習(xí)之聚類算法:層次聚類與K均值聚類的比較_第2頁(yè)
人工智能和機(jī)器學(xué)習(xí)之聚類算法:層次聚類與K均值聚類的比較_第3頁(yè)
人工智能和機(jī)器學(xué)習(xí)之聚類算法:層次聚類與K均值聚類的比較_第4頁(yè)
人工智能和機(jī)器學(xué)習(xí)之聚類算法:層次聚類與K均值聚類的比較_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

人工智能和機(jī)器學(xué)習(xí)之聚類算法:層次聚類與K均值聚類的比較1引言1.1聚類算法在人工智能中的應(yīng)用聚類算法是無(wú)監(jiān)督學(xué)習(xí)的重要組成部分,廣泛應(yīng)用于人工智能領(lǐng)域,如圖像識(shí)別、文本分析、市場(chǎng)細(xì)分、生物信息學(xué)等。通過(guò)將數(shù)據(jù)集中的對(duì)象分組到不同的簇中,聚類算法幫助我們發(fā)現(xiàn)數(shù)據(jù)的內(nèi)在結(jié)構(gòu)和模式,為后續(xù)的分析和決策提供基礎(chǔ)。1.2層次聚類與K均值聚類的概述1.2.1層次聚類層次聚類是一種構(gòu)建數(shù)據(jù)點(diǎn)簇的算法,它不預(yù)先設(shè)定簇的數(shù)量,而是創(chuàng)建一個(gè)簇的層次結(jié)構(gòu),可以是自底向上(聚合)或自頂向下(分裂)。最終,用戶可以根據(jù)需要選擇層次結(jié)構(gòu)中的任意點(diǎn)作為最終的簇,提供了一種靈活的簇劃分方式。1.2.1.1示例代碼importnumpyasnp

fromscipy.cluster.hierarchyimportdendrogram,linkage

frommatplotlibimportpyplotasplt

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

X=np.array([[5,3],

[10,15],

[15,12],

[24,10],

[30,30],

[85,70],

[71,80],

[60,78],

[70,55],

[80,91],])

#使用ward方法進(jìn)行層次聚類

Z=linkage(X,'ward')

#繪制層次聚類樹

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

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

dendrogram(Z)

plt.show()1.2.2K均值聚類K均值聚類是一種迭代的聚類算法,它將數(shù)據(jù)集劃分為K個(gè)簇,其中K是預(yù)先確定的。算法通過(guò)最小化簇內(nèi)數(shù)據(jù)點(diǎn)到簇中心的距離平方和來(lái)優(yōu)化簇的劃分。K均值聚類簡(jiǎn)單且高效,但需要用戶事先知道簇的數(shù)量,且對(duì)初始中心點(diǎn)的選擇敏感。1.2.2.1示例代碼importnumpyasnp

fromsklearn.clusterimportKMeans

importmatplotlib.pyplotasplt

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

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

[1.5,1.8],

[5,8],

[8,8],

[1,0.6],

[9,11]])

#定義K均值聚類模型

kmeans=KMeans(n_clusters=2)

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

kmeans.fit(X)

#獲取聚類中心

centroids=kmeans.cluster_centers_

#獲取每個(gè)數(shù)據(jù)點(diǎn)的簇標(biāo)簽

labels=kmeans.labels_

#繪制數(shù)據(jù)點(diǎn)和聚類中心

colors=["g.","r.","c.","b.","k."]

foriinrange(len(X)):

plt.plot(X[i][0],X[i][1],colors[labels[i]],markersize=10)

plt.scatter(centroids[:,0],centroids[:,1],marker="x",s=150,linewidths=5,zorder=10)

plt.show()2層次聚類與K均值聚類的比較層次聚類和K均值聚類在聚類任務(wù)中各有優(yōu)勢(shì)和局限性。層次聚類提供了簇的層次結(jié)構(gòu),允許用戶根據(jù)需要選擇不同的簇?cái)?shù)量,但計(jì)算成本較高,尤其是在大數(shù)據(jù)集上。K均值聚類則計(jì)算效率高,適用于大規(guī)模數(shù)據(jù)集,但需要用戶事先確定簇的數(shù)量,且對(duì)初始中心點(diǎn)的選擇敏感,可能陷入局部最優(yōu)解。在選擇聚類算法時(shí),應(yīng)考慮數(shù)據(jù)的特性、聚類任務(wù)的需求以及計(jì)算資源的限制。例如,如果數(shù)據(jù)集較小,且希望探索不同數(shù)量的簇,層次聚類可能是一個(gè)更好的選擇。相反,如果數(shù)據(jù)集非常大,且對(duì)計(jì)算效率有較高要求,K均值聚類可能更合適。3結(jié)論通過(guò)上述介紹和示例,我們了解了層次聚類和K均值聚類的基本原理和應(yīng)用。在實(shí)際項(xiàng)目中,根據(jù)具體需求選擇合適的聚類算法是關(guān)鍵。層次聚類提供了靈活性,而K均值聚類則在大規(guī)模數(shù)據(jù)集上表現(xiàn)出色。理解這兩種算法的差異和適用場(chǎng)景,將有助于在數(shù)據(jù)分析和人工智能項(xiàng)目中做出更明智的決策。4聚類算法基礎(chǔ)4.1數(shù)據(jù)預(yù)處理數(shù)據(jù)預(yù)處理是聚類分析中至關(guān)重要的一步,它直接影響聚類結(jié)果的準(zhǔn)確性和有效性。在進(jìn)行聚類之前,數(shù)據(jù)通常需要經(jīng)過(guò)清洗、標(biāo)準(zhǔn)化、缺失值處理等步驟。4.1.1清洗數(shù)據(jù)清洗數(shù)據(jù)包括去除重復(fù)值、異常值和無(wú)關(guān)特征。例如,如果數(shù)據(jù)集中存在重復(fù)記錄,聚類算法可能會(huì)被誤導(dǎo),因?yàn)橄嗤臉颖緯?huì)被視為不同的個(gè)體。4.1.2標(biāo)準(zhǔn)化數(shù)據(jù)標(biāo)準(zhǔn)化(或歸一化)是將數(shù)據(jù)轉(zhuǎn)換為統(tǒng)一尺度的過(guò)程,以避免數(shù)值范圍較大的特征主導(dǎo)聚類結(jié)果。常用的方法有最小-最大標(biāo)準(zhǔn)化和Z-score標(biāo)準(zhǔn)化。4.1.2.1示例代碼:Z-score標(biāo)準(zhǔn)化importnumpyasnp

fromsklearn.preprocessingimportStandardScaler

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

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

#創(chuàng)建標(biāo)準(zhǔn)化器

scaler=StandardScaler()

#擬合數(shù)據(jù)并進(jìn)行轉(zhuǎn)換

data_scaled=scaler.fit_transform(data)

#輸出標(biāo)準(zhǔn)化后的數(shù)據(jù)

print(data_scaled)4.1.3處理缺失值數(shù)據(jù)中可能包含缺失值,這些值需要被填充或刪除,以避免影響聚類結(jié)果。填充方法包括使用平均值、中位數(shù)或眾數(shù)等。4.1.3.1示例代碼:使用平均值填充缺失值importpandasaspd

fromsklearn.imputeimportSimpleImputer

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

data=pd.DataFrame({'A':[1,2,np.nan,4],'B':[5,np.nan,np.nan,8]})

#創(chuàng)建缺失值填充器

imputer=SimpleImputer(strategy='mean')

#擬合數(shù)據(jù)并進(jìn)行填充

data_imputed=imputer.fit_transform(data)

#輸出填充后的數(shù)據(jù)

print(data_imputed)4.2距離度量與相似性計(jì)算在聚類算法中,距離度量是評(píng)估樣本間相似性的關(guān)鍵。不同的距離度量方法適用于不同類型的數(shù)據(jù)和聚類需求。4.2.1歐氏距離歐氏距離是最常用的距離度量方法,適用于數(shù)值型數(shù)據(jù)。它計(jì)算兩個(gè)點(diǎn)在多維空間中的直線距離。4.2.1.1示例代碼:計(jì)算歐氏距離fromscipy.spatialimportdistance

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

point1=np.array([1,2])

point2=np.array([4,6])

#計(jì)算歐氏距離

euclidean_distance=distance.euclidean(point1,point2)

#輸出距離

print(euclidean_distance)4.2.2曼哈頓距離曼哈頓距離,也稱為城市街區(qū)距離,適用于高維空間中的數(shù)據(jù)。它計(jì)算兩個(gè)點(diǎn)在多維空間中沿軸方向的總距離。4.2.2.1示例代碼:計(jì)算曼哈頓距離#使用同一數(shù)據(jù)點(diǎn)

manhattan_distance=distance.cityblock(point1,point2)

#輸出距離

print(manhattan_distance)4.2.3余弦相似度余弦相似度適用于文本或向量數(shù)據(jù),它衡量?jī)蓚€(gè)向量之間的角度,而不是距離。角度越小,相似度越高。4.2.3.1示例代碼:計(jì)算余弦相似度f(wàn)romsklearn.metrics.pairwiseimportcosine_similarity

#示例向量

vector1=np.array([1,2,3])

vector2=np.array([4,5,6])

#計(jì)算余弦相似度

cosine_sim=cosine_similarity(vector1.reshape(1,-1),vector2.reshape(1,-1))

#輸出相似度

print(cosine_sim)4.2.4Jaccard相似度Jaccard相似度適用于二元數(shù)據(jù),如文檔中的詞頻。它計(jì)算兩個(gè)集合的交集與并集的比值。4.2.4.1示例代碼:計(jì)算Jaccard相似度f(wàn)romsklearn.metricsimportjaccard_score

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

set1=np.array([1,1,0,1])

set2=np.array([1,0,1,1])

#計(jì)算Jaccard相似度

jaccard_sim=jaccard_score(set1,set2)

#輸出相似度

print(jaccard_sim)通過(guò)上述數(shù)據(jù)預(yù)處理和距離度量方法,可以為聚類算法提供更準(zhǔn)確、更一致的數(shù)據(jù)輸入,從而提高聚類效果。在實(shí)際應(yīng)用中,選擇合適的數(shù)據(jù)預(yù)處理方法和距離度量是根據(jù)數(shù)據(jù)特性和聚類目標(biāo)來(lái)決定的。5層次聚類詳解5.1層次聚類的基本概念層次聚類是一種聚類方法,它創(chuàng)建一個(gè)層次結(jié)構(gòu)的聚類樹,稱為樹狀圖(Dendrogram),以表示數(shù)據(jù)點(diǎn)之間的相似性。這種聚類技術(shù)不需要預(yù)先指定聚類的數(shù)量,而是通過(guò)樹狀圖展示不同層次的聚類結(jié)果,用戶可以根據(jù)需要選擇合適的聚類數(shù)目。層次聚類分為兩種主要類型:凝聚層次聚類和分裂層次聚類。5.1.1凝聚層次聚類凝聚層次聚類(AgglomerativeHierarchicalClustering)從每個(gè)數(shù)據(jù)點(diǎn)作為一個(gè)獨(dú)立的聚類開始,然后逐步合并最相似的聚類,直到所有數(shù)據(jù)點(diǎn)合并為一個(gè)聚類或達(dá)到某個(gè)停止條件。合并聚類的策略通常基于距離度量,如單鏈接、完全鏈接、平均鏈接或沃德鏈接。5.1.1.1示例代碼importnumpyasnp

fromscipy.cluster.hierarchyimportlinkage,dendrogram

importmatplotlib.pyplotasplt

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

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

[4,2],[4,4],[4,0]])

#使用凝聚層次聚類

Z=linkage(data,'ward')

#繪制樹狀圖

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

dendrogram(Z)

plt.show()5.1.2分裂層次聚類分裂層次聚類(DivisiveHierarchicalClustering)則相反,它從所有數(shù)據(jù)點(diǎn)作為一個(gè)單一聚類開始,然后逐步將聚類分割成更小的子聚類,直到每個(gè)數(shù)據(jù)點(diǎn)成為一個(gè)獨(dú)立的聚類或達(dá)到某個(gè)停止條件。分裂層次聚類在實(shí)際應(yīng)用中較少使用,因?yàn)樗?jì)算復(fù)雜度較高。5.2層次聚類的算法流程5.2.1凝聚層次聚類流程初始化:每個(gè)數(shù)據(jù)點(diǎn)作為一個(gè)獨(dú)立的聚類。計(jì)算距離:計(jì)算所有聚類對(duì)之間的距離。合并聚類:選擇距離最近的兩個(gè)聚類進(jìn)行合并。更新距離:重新計(jì)算合并后的新聚類與其他聚類之間的距離。重復(fù)步驟2-4:直到所有數(shù)據(jù)點(diǎn)合并為一個(gè)聚類或達(dá)到預(yù)設(shè)的停止條件。5.2.2分裂層次聚類流程初始化:所有數(shù)據(jù)點(diǎn)作為一個(gè)單一聚類。計(jì)算距離:計(jì)算聚類內(nèi)部數(shù)據(jù)點(diǎn)之間的距離。分割聚類:選擇內(nèi)部距離最大的聚類進(jìn)行分割。更新距離:重新計(jì)算分割后的新聚類與其他聚類之間的距離。重復(fù)步驟2-4:直到每個(gè)數(shù)據(jù)點(diǎn)成為一個(gè)獨(dú)立的聚類或達(dá)到預(yù)設(shè)的停止條件。5.3凝聚層次聚類與分裂層次聚類5.3.1凝聚層次聚類優(yōu)點(diǎn):易于理解和實(shí)現(xiàn),不需要預(yù)先指定聚類數(shù)目。缺點(diǎn):合并決策是不可逆的,一旦兩個(gè)聚類被合并,就不能再分開。5.3.2分裂層次聚類優(yōu)點(diǎn):分割決策是可逆的,可以重新合并分割的聚類。缺點(diǎn):計(jì)算復(fù)雜度高,通常比凝聚層次聚類慢。5.3.3示例代碼:凝聚層次聚類與分裂層次聚類的比較importnumpyasnp

fromscipy.cluster.hierarchyimportlinkage,fcluster

fromsklearn.datasetsimportmake_blobs

importmatplotlib.pyplotasplt

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

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

#凝聚層次聚類

Z=linkage(X,'ward')

k=3#選擇聚類數(shù)目

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

#繪制凝聚層次聚類結(jié)果

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

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

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

plt.show()

#分裂層次聚類的實(shí)現(xiàn)較為復(fù)雜,通常不直接使用,這里僅展示凝聚層次聚類

#分裂層次聚類在實(shí)際應(yīng)用中較少,因?yàn)槠溆?jì)算復(fù)雜度較高,且實(shí)現(xiàn)較為復(fù)雜5.3.4結(jié)論層次聚類提供了數(shù)據(jù)點(diǎn)之間關(guān)系的可視化表示,特別適合于探索性數(shù)據(jù)分析。凝聚層次聚類因其簡(jiǎn)單性和直觀性而更常見,而分裂層次聚類則在特定場(chǎng)景下使用,如需要可逆的聚類決策時(shí)。選擇哪種層次聚類方法取決于具體的應(yīng)用場(chǎng)景和數(shù)據(jù)特性。6人工智能和機(jī)器學(xué)習(xí)之聚類算法:K均值聚類詳解6.1K均值聚類的基本概念K均值聚類是一種無(wú)監(jiān)督學(xué)習(xí)算法,主要用于數(shù)據(jù)的分組或聚類。其核心思想是將數(shù)據(jù)集劃分為K個(gè)簇,每個(gè)簇由一個(gè)中心點(diǎn)(質(zhì)心)表示,數(shù)據(jù)點(diǎn)被分配到距離其最近的質(zhì)心所在的簇中。K均值算法的目標(biāo)是最小化簇內(nèi)數(shù)據(jù)點(diǎn)與質(zhì)心之間的距離平方和,從而形成緊湊且分離的簇。6.1.1適用場(chǎng)景客戶細(xì)分:基于購(gòu)買行為或偏好將客戶分組。文檔分類:對(duì)大量文檔進(jìn)行主題分類。圖像分割:在圖像處理中,用于分割圖像的不同區(qū)域。6.2K均值聚類的算法流程K均值聚類的步驟如下:初始化質(zhì)心:隨機(jī)選擇K個(gè)數(shù)據(jù)點(diǎn)作為初始質(zhì)心。分配數(shù)據(jù)點(diǎn):將每個(gè)數(shù)據(jù)點(diǎn)分配給最近的質(zhì)心,形成K個(gè)簇。更新質(zhì)心:重新計(jì)算每個(gè)簇的質(zhì)心,即簇內(nèi)所有點(diǎn)的平均位置。迭代優(yōu)化:重復(fù)步驟2和3,直到質(zhì)心不再發(fā)生顯著變化或達(dá)到最大迭代次數(shù)。6.2.1示例代碼importnumpyasnp

fromsklearn.clusterimportKMeans

fromsklearn.datasetsimportmake_blobs

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

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

#初始化KMeans模型

kmeans=KMeans(n_clusters=4)

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

kmeans.fit(X)

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

labels=kmeans.predict(X)

#獲取質(zhì)心

centroids=kmeans.cluster_centers_

#打印質(zhì)心

print("質(zhì)心:",centroids)

#打印簇標(biāo)簽

print("簇標(biāo)簽:",labels)6.2.2代碼解釋使用make_blobs生成了300個(gè)數(shù)據(jù)點(diǎn),分為4個(gè)簇。初始化KMeans模型,設(shè)置簇的數(shù)量為4。通過(guò)fit方法擬合數(shù)據(jù),自動(dòng)進(jìn)行質(zhì)心初始化和迭代優(yōu)化。predict方法用于預(yù)測(cè)數(shù)據(jù)點(diǎn)的簇標(biāo)簽。cluster_centers_屬性返回最終的質(zhì)心位置。6.3K值的選擇與初始化方法6.3.1K值的選擇選擇K值是K均值聚類中的一個(gè)關(guān)鍵步驟,常用的方法有:肘部法則:通過(guò)計(jì)算不同K值下的簇內(nèi)平方誤差和,選擇使誤差和下降速度顯著減緩的K值。輪廓系數(shù):評(píng)估簇的緊密度和分離度,選擇輪廓系數(shù)最大的K值。6.3.2初始化方法初始化質(zhì)心的方法對(duì)K均值聚類的結(jié)果有重要影響:隨機(jī)初始化:簡(jiǎn)單但可能導(dǎo)致算法陷入局部最優(yōu)。K-means++:通過(guò)特定的策略選擇初始質(zhì)心,可以提高算法的收斂速度和結(jié)果質(zhì)量。6.3.3示例代碼#使用肘部法則選擇K值

wcss=[]

foriinrange(1,11):

kmeans=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)

kmeans.fit(X)

wcss.append(kmeans.inertia_)

importmatplotlib.pyplotasplt

plt.plot(range(1,11),wcss)

plt.title('肘部法則')

plt.xlabel('簇?cái)?shù)量')

plt.ylabel('WCSS')

plt.show()

#使用K-means++初始化

kmeans=KMeans(n_clusters=4,init='k-means++')

kmeans.fit(X)6.3.4代碼解釋wcss列表用于存儲(chǔ)不同K值下的簇內(nèi)平方誤差和。通過(guò)循環(huán),對(duì)K值從1到10進(jìn)行測(cè)試,擬合數(shù)據(jù)并計(jì)算WCSS。使用plt.plot繪制K值與WCSS的關(guān)系圖,幫助選擇K值。在K均值模型中設(shè)置init='k-means++',使用K-means++方法初始化質(zhì)心。7人工智能和機(jī)器學(xué)習(xí)之聚類算法:層次聚類與K均值聚類的比較7.1算法復(fù)雜度與效率7.1.1層次聚類層次聚類算法構(gòu)建一個(gè)樹狀的聚類結(jié)構(gòu),這種結(jié)構(gòu)可以是自底向上(聚合)或自頂向下(分裂)。在聚合層次聚類中,每個(gè)數(shù)據(jù)點(diǎn)最初被視為一個(gè)獨(dú)立的聚類,然后算法逐步合并最相似的聚類,直到達(dá)到預(yù)定的聚類數(shù)量或滿足某個(gè)停止條件。7.1.1.1復(fù)雜度分析時(shí)間復(fù)雜度:層次聚類的時(shí)間復(fù)雜度通常為O(n^2logn)或O(n^3),取決于使用的相似度計(jì)算方法和合并策略??臻g復(fù)雜度:需要存儲(chǔ)所有數(shù)據(jù)點(diǎn)之間的距離矩陣,空間復(fù)雜度為O(n^2)。7.1.1.2效率討論層次聚類在小到中等規(guī)模的數(shù)據(jù)集上表現(xiàn)良好,但在大規(guī)模數(shù)據(jù)集上效率較低,因?yàn)樾枰?jì)算所有數(shù)據(jù)點(diǎn)之間的距離。7.1.2K均值聚類K均值聚類算法通過(guò)迭代過(guò)程將數(shù)據(jù)點(diǎn)劃分為K個(gè)聚類,每個(gè)聚類由一個(gè)中心點(diǎn)(質(zhì)心)表示。算法首先隨機(jī)選擇K個(gè)中心點(diǎn),然后將每個(gè)數(shù)據(jù)點(diǎn)分配給最近的中心點(diǎn),形成K個(gè)聚類。之后,算法重新計(jì)算每個(gè)聚類的中心點(diǎn),重復(fù)這一過(guò)程直到聚類中心不再變化或達(dá)到最大迭代次數(shù)。7.1.2.1復(fù)雜度分析時(shí)間復(fù)雜度:K均值聚類的時(shí)間復(fù)雜度為O(nkt),其中n是數(shù)據(jù)點(diǎn)數(shù)量,k是聚類數(shù)量,t是迭代次數(shù)??臻g復(fù)雜度:K均值聚類的空間復(fù)雜度為O(kn),因?yàn)橹恍枰鎯?chǔ)K個(gè)中心點(diǎn)和每個(gè)數(shù)據(jù)點(diǎn)的聚類分配。7.1.2.2效率討論K均值聚類在大規(guī)模數(shù)據(jù)集上效率較高,因?yàn)樗恍枰?jì)算所有數(shù)據(jù)點(diǎn)之間的距離,而是基于中心點(diǎn)進(jìn)行聚類。然而,算法的效率受迭代次數(shù)和初始中心點(diǎn)選擇的影響。7.2聚類結(jié)果的穩(wěn)定性7.2.1層次聚類層次聚類的結(jié)果是穩(wěn)定的,因?yàn)樗跀?shù)據(jù)點(diǎn)之間的距離進(jìn)行聚類,這一過(guò)程是確定性的。一旦數(shù)據(jù)點(diǎn)之間的距離矩陣被計(jì)算出來(lái),聚類過(guò)程將始終產(chǎn)生相同的結(jié)果,除非距離度量或合并策略發(fā)生變化。7.2.2K均值聚類K均值聚類的結(jié)果可能不穩(wěn)定,因?yàn)樗惴ㄒ蕾囉陔S機(jī)選擇的初始中心點(diǎn)。不同的初始中心點(diǎn)可能導(dǎo)致不同的聚類結(jié)果。為了提高穩(wěn)定性,通常會(huì)進(jìn)行多次運(yùn)行,選擇具有最低誤差平方和的聚類結(jié)果。7.2.2.1示例代碼fromsklearn.clusterimportKMeans

fromsklearn.datasetsimportmake_blobs

importnumpyasnp

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

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

#K均值聚類

kmeans=KMeans(n_clusters=4,random_state=0)

kmeans.fit(X)

#獲取聚類中心

centers=kmeans.cluster_centers_

#獲取每個(gè)數(shù)據(jù)點(diǎn)的聚類標(biāo)簽

labels=kmeans.labels_

#打印聚類中心

print("聚類中心:\n",centers)

#打印數(shù)據(jù)點(diǎn)的聚類標(biāo)簽

print("數(shù)據(jù)點(diǎn)的聚類標(biāo)簽:\n",labels)7.3適用場(chǎng)景與數(shù)據(jù)類型7.3.1層次聚類層次聚類適用于以下場(chǎng)景:-數(shù)據(jù)集較小或中等規(guī)模。-需要了解數(shù)據(jù)點(diǎn)之間的層次關(guān)系。-數(shù)據(jù)點(diǎn)的聚類數(shù)量未知。層次聚類可以處理數(shù)值型和類別型數(shù)據(jù),但需要選擇合適的距離度量。7.3.2K均值聚類K均值聚類適用于以下場(chǎng)景:-數(shù)據(jù)集較大。-數(shù)據(jù)點(diǎn)的聚類數(shù)量已知。-需要快速聚類結(jié)果。K均值聚類主要適用于數(shù)值型數(shù)據(jù),因?yàn)樗跉W幾里得距離進(jìn)行聚類。對(duì)于類別型數(shù)據(jù),需要進(jìn)行編碼轉(zhuǎn)換。7.3.2.1示例代碼importnumpyasnp

fromsklearn.clusterimportKMeans

#創(chuàng)建一個(gè)簡(jiǎn)單的數(shù)值型數(shù)據(jù)集

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

[4,2],[4,4],[4,0]])

#應(yīng)用K均值聚類

kmeans=KMeans(n_clusters=2,random_state=0).fit(data)

#輸出聚類中心

print("聚類中心:",kmeans.cluster_centers_)

#輸出每個(gè)數(shù)據(jù)點(diǎn)的聚類標(biāo)簽

print("數(shù)據(jù)點(diǎn)的聚類標(biāo)簽:",kmeans.labels_)通過(guò)以上分析,我們可以看到層次聚類和K均值聚類在算法復(fù)雜度、聚類結(jié)果穩(wěn)定性和適用場(chǎng)景上存在顯著差異。選擇合適的聚類算法取決于具體的數(shù)據(jù)集規(guī)模、數(shù)據(jù)類型和聚類需求。8案例分析8.1層次聚類的實(shí)際應(yīng)用案例層次聚類是一種在數(shù)據(jù)點(diǎn)之間建立層次結(jié)構(gòu)的聚類方法,它不需要預(yù)先指定聚類的數(shù)量,而是通過(guò)構(gòu)建樹狀圖(dendrogram)來(lái)展示數(shù)據(jù)點(diǎn)之間的相似性。下面,我們將通過(guò)一個(gè)具體的案例來(lái)分析層次聚類的應(yīng)用,案例涉及客戶細(xì)分,使用的是Iris數(shù)據(jù)集,這是一個(gè)經(jīng)典的用于分類和聚類的數(shù)據(jù)集。8.1.1數(shù)據(jù)準(zhǔn)備首先,我們需要導(dǎo)入必要的庫(kù),并加載Iris數(shù)據(jù)集。importnumpyasnp

importpandasaspd

fromsklearnimportdatasets

importmatplotlib.pyplotasplt

fromscipy.cluster.hierarchyimportdendrogram,linkage

fromsklearn.clusterimportAgglomerativeClustering

#加載Iris數(shù)據(jù)集

iris=datasets.load_iris()

X=iris.data8.1.2層次聚類分析接下來(lái),我們使用層次聚類算法對(duì)數(shù)據(jù)進(jìn)行分析。這里我們使用scipy庫(kù)中的linkage函數(shù),它使用不同的鏈接方法(如ward,single,complete等)來(lái)計(jì)算數(shù)據(jù)點(diǎn)之間的距離。#使用ward鏈接方法進(jìn)行層次聚類

Z=linkage(X,'ward')

#繪制樹狀圖

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

dendrogram(Z)

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

plt.xlabel('樣本')

plt.ylabel('距離')

plt.show()8.1.3聚類結(jié)果通過(guò)觀察樹狀圖,我們可以選擇一個(gè)合適的距離閾值來(lái)切割樹狀圖,從而得到聚類結(jié)果。在這個(gè)例子中,我們選擇閾值為50。#使用AgglomerativeClustering進(jìn)行聚類

cluster=AgglomerativeClustering(n_clusters=None,distance_threshold=50)

y_hc=cluster.fit_predict(X)

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

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

plt.scatter(X[y_hc==0,0],X[y_hc==0,1],s=100,c='red',label='Cluster1')

plt.scatter(X[y_hc==1,0],X[y_hc==1,1],s=100,c='blue',label='Cluster2')

plt.scatter(X[y_hc==2,0],X[y_hc==2,1],s=100,c='green',label='Cluster3')

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

plt.legend()

plt.show()8.2K均值聚類的實(shí)際應(yīng)用案例K均值聚類是一種迭代的聚類算法,它將數(shù)據(jù)集劃分為K個(gè)簇,每個(gè)簇由一個(gè)中心點(diǎn)(質(zhì)心)表示。與層次聚類不同,K均值聚類需要預(yù)先指定聚類的數(shù)量。下面,我們將使用同樣的Iris數(shù)據(jù)集來(lái)展示K均值聚類的應(yīng)用。8.2.1數(shù)據(jù)準(zhǔn)備我們已經(jīng)加載了Iris數(shù)據(jù)集,所以可以直接進(jìn)入聚類分析。8.2.2K均值聚類分析首先,我們需要確定K的值。這可以通過(guò)肘部法則(ElbowMethod)來(lái)實(shí)現(xiàn),即計(jì)算不同K值下的聚類誤差平方和(WSS),選擇WSS下降速度明顯減緩的K值。#計(jì)算WSS

wss=[]

foriinrange(1,11):

kmeans=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)

kmeans.fit(X)

wss.append(kmeans.inertia_)

#繪制WSS曲線

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

plt.plot(range(1,11),wss)

plt.title('肘部法則')

plt.xlabel('聚類數(shù)量')

plt.ylabel('WSS')

plt.show()從WSS曲線中,我們可以看到當(dāng)K=3時(shí),WSS的下降速度明顯減緩,因此我們選擇K=3。#使用KMeans進(jìn)行聚類

kmeans=KMeans(n_clusters=3,init='k-means++',max_iter=300,n_init=10,random_state=0)

y_kmeans=kmeans.fit_predict(X)

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

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

plt.scatter(X[y_kmeans==0,0],X[y_kmeans==0,1],s=100,c='red',label='Cluster1')

plt.scatter(X[y_kmeans==1,0],X[y_kmeans==1,1],s=100,c='blue',label='Cluster2')

plt.scatter(X[y_kmeans==2,0],X[y_kmeans==2,1],s=100,c='green',label='Cluster3')

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

plt.title('K均值聚類結(jié)果')

plt.legend()

plt.show()8.2.3結(jié)果比較通過(guò)對(duì)比層次聚類和K均值聚類的結(jié)果,我們可以觀察到兩者在聚類效果上的差異。層次聚類提供了數(shù)據(jù)點(diǎn)之間相似性的直觀展示,而K均值聚類則更側(cè)重于找到數(shù)據(jù)集中的質(zhì)心,從而進(jìn)行聚類。在實(shí)際應(yīng)用中,選擇哪種聚類方法取決于具體問(wèn)題和數(shù)據(jù)的特性。例如,如果數(shù)據(jù)集中的簇具有不規(guī)則形狀,層次聚類可能更合適;而如果簇形狀較為規(guī)則,且需要快速聚類結(jié)果,K均值聚類則是一個(gè)更好的選擇。9總結(jié)與展望9.1聚類算法的選擇策略在選擇聚類算法時(shí),考慮以下關(guān)鍵因素至關(guān)重要:9.1.1數(shù)據(jù)特性形狀和大?。簲?shù)據(jù)集的形狀和大小會(huì)影響算法的性能。例如,層

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論