網(wǎng)站優(yōu)化軟件免費(fèi)入駐的跨境電商平臺
目錄
一、聚類的原理與實(shí)現(xiàn)
1.1 聚類的概念和類型
1.2 如何度量距離
1.2.1 數(shù)據(jù)的類型
1.2.2 連續(xù)型數(shù)據(jù)的距離度量方法
1.2.3 離散型數(shù)據(jù)的距離度量方法
1.3 聚類的基本步驟
二、層次聚類算法
2.1 算法原理和實(shí)例
2.2 算法的Sklearn實(shí)現(xiàn)
2.2.1 層次聚類法的可視化實(shí)例
2.2.2 繪制層次聚類的樹狀圖
2.2.3 DataFrame數(shù)據(jù)結(jié)構(gòu)
三、k-means聚類算法
3.1?算法原理和實(shí)例
3.1.1?k-means聚類算法原理
3.1.2?k-means聚類算法舉例
3.1.3?k-means聚類算法的優(yōu)缺點(diǎn)
3.2 算法中k值的確定
3.3 算法的Sklearn實(shí)現(xiàn)
一、聚類的原理與實(shí)現(xiàn)
1.1 聚類的概念和類型
聚類是一種無監(jiān)督學(xué)習(xí)的方法,用于將數(shù)據(jù)集中的對象按照它們的相似性分組。聚類的目標(biāo)是使得同一組內(nèi)的對象之間的相似性盡可能地高,而不同組之間的相似性盡可能地低。
聚類的類型包括:
-
劃分聚類(Partitioning Clustering):將數(shù)據(jù)集劃分成不重疊的子集,每個子集代表一個聚類。常見的劃分聚類算法包括K均值聚類和K均值++聚類。
-
層次聚類(Hierarchical Clustering):將數(shù)據(jù)集組織成一個層次結(jié)構(gòu),每個層次上的節(jié)點(diǎn)代表一個聚類。層次聚類可分為自底向上的凝聚聚類和自頂向下的分裂聚類。
-
密度聚類(Density-based Clustering):根據(jù)數(shù)據(jù)點(diǎn)的密度將數(shù)據(jù)集劃分為聚類。具有相對較高密度的數(shù)據(jù)點(diǎn)將組成聚類,而低密度區(qū)域?qū)⒈徽J(rèn)為是噪聲。DBSCAN是一種常用的密度聚類算法。
-
基于模型的聚類(Model-based Clustering):假設(shè)數(shù)據(jù)集由多個潛在的概率模型組成,每個模型代表一個聚類。常見的基于模型的聚類算法包括高斯混合模型聚類(GMM)和期望最大化(EM)算法。
-
網(wǎng)絡(luò)聚類(Network Clustering):用于處理圖數(shù)據(jù)的聚類方法。它將圖中的節(jié)點(diǎn)分組成聚類,使得聚類內(nèi)部的節(jié)點(diǎn)緊密相連,而不同聚類之間的連接較少。社區(qū)發(fā)現(xiàn)是網(wǎng)絡(luò)聚類的一種典型應(yīng)用。
1.2 如何度量距離
1.2.1 數(shù)據(jù)的類型
數(shù)據(jù)可以根據(jù)其類型進(jìn)行分類,主要分為離散型數(shù)據(jù)和連續(xù)型數(shù)據(jù)。
離散型數(shù)據(jù)是指在一定范圍內(nèi),只能取有限個或者可數(shù)個數(shù)值的數(shù)據(jù)。離散型數(shù)據(jù)通常代表了非可度量的特征或者屬性。例如,一個學(xué)生的成績可以用A、B、C等等來表示,或者一個人的血型可以用A、B、O、AB來表示。
離散型數(shù)據(jù)還可以分為定類數(shù)據(jù)、定序數(shù)據(jù)、定距數(shù)據(jù)。
- 定類數(shù)據(jù)是指數(shù)據(jù)按照某種特征或?qū)傩赃M(jìn)行分類,但不存在相對大小的關(guān)系,例如性別(男、女)、民族(漢族、藏族、維吾爾族等)。
- 定序數(shù)據(jù)是指數(shù)據(jù)可以按照某種特征或?qū)傩赃M(jìn)行分類,并且存在相對大小的關(guān)系,例如教育程度(小學(xué)、初中、高中、大學(xué))或榮譽(yù)等級(一等獎、二等獎、三等獎)。
- 定距數(shù)據(jù)是指數(shù)據(jù)可以按照某種特征或?qū)傩赃M(jìn)行分類,存在相對大小的關(guān)系,并且可以進(jìn)行加減運(yùn)算,但沒有絕對零點(diǎn),例如溫度(攝氏度、華氏度)或年齡。
連續(xù)型數(shù)據(jù)是指在一定范圍內(nèi)可以取任意值的數(shù)據(jù)。連續(xù)型數(shù)據(jù)通常代表了可度量的特征或者屬性。例如,一個人的身高可以是任意的數(shù)值,例如160cm、165.5cm、170cm等等。
對于離散型數(shù)據(jù),通常使用頻數(shù)和百分比來描述和分析數(shù)據(jù)的分布情況;對于連續(xù)型數(shù)據(jù),可以使用平均值、中位數(shù)、標(biāo)準(zhǔn)差等統(tǒng)計指標(biāo)來描述和分析數(shù)據(jù)的分布情況。
1.2.2 連續(xù)型數(shù)據(jù)的距離度量方法
在連續(xù)型數(shù)據(jù)的距離度量方法中,常用的方法有以下幾種:
-
歐氏距離(Euclidean distance):歐氏距離是最常用的距離度量方法,它計算兩個樣本之間的直線距離。對于兩個樣本點(diǎn) (x1, y1) 和 (x2, y2),歐氏距離可以表示為:d = sqrt((x2 - x1)^2 + (y2 - y1)^2)
-
曼哈頓距離(Manhattan distance):曼哈頓距離是計算兩點(diǎn)之間的距離,沿著網(wǎng)格線的距離,而不是直線距離。對于兩個樣本點(diǎn) (x1, y1) 和 (x2, y2),曼哈頓距離可以表示為:d = |x2 - x1| + |y2 - y1|
-
切比雪夫距離(Chebyshev distance):切比雪夫距離是計算兩點(diǎn)之間的最大差距,即兩點(diǎn)坐標(biāo)軸方向上差值的最大值。對于兩個樣本點(diǎn) (x1, y1) 和 (x2, y2),切比雪夫距離可以表示為:d = max(|x2 - x1|, |y2 - y1|)
-
閔可夫斯基距離(Minkowski distance):閔可夫斯基距離是歐氏距離和曼哈頓距離的推廣,可以根據(jù)需要選擇不同的參數(shù)。對于兩個樣本點(diǎn) (x1, y1) 和 (x2, y2),閔可夫斯基距離可以表示為:d = (|x2 - x1|^p + |y2 - y1|^p)^(1/p),其中 p 是一個參數(shù),當(dāng) p=1 時為曼哈頓距離,當(dāng) p=2 時為歐氏距離。
-
馬氏距離(Mahalanobis distance):馬氏距離是一種考慮各個維度之間相關(guān)性的距離度量方法,它通過協(xié)方差矩陣來衡量變量之間的相關(guān)性。對于兩個樣本點(diǎn) x 和 y,馬氏距離可以表示為:d = sqrt((x - y)^T Σ^(-1) (x - y)),其中 Σ 是樣本的協(xié)方差矩陣。
1.2.3 離散型數(shù)據(jù)的距離度量方法
對于離散型數(shù)據(jù)的距離度量方法:
-
簡單匹配系數(shù)(Simple Matching Coefficient):適用于兩個等長的二進(jìn)制字符串,定義為兩個字符串中相同位置上相同字符的個數(shù)除以字符串的長度。
-
杰卡德相似系數(shù)(Jaccard Similarity Coefficient):適用于表示集合的離散型數(shù)據(jù),定義為兩個集合交集的大小除以并集的大小。
這兩種方法主要適用于二進(jìn)制字符串和集合類型的離散型數(shù)據(jù),用于度量不同數(shù)據(jù)之間的相似性或距離。
1.3 聚類的基本步驟
對案例進(jìn)行聚類分析的基本步驟可以如下:
-
收集數(shù)據(jù):收集相關(guān)的案例數(shù)據(jù),這些數(shù)據(jù)可以是文本、數(shù)字或其他形式的信息。
-
數(shù)據(jù)預(yù)處理:對收集到的數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)清洗、特征選擇、特征縮放等。確保數(shù)據(jù)的準(zhǔn)確性和一致性。
-
選擇聚類算法:根據(jù)案例的特征和目標(biāo),選擇適合的聚類算法。常見的聚類算法包括K均值聚類、層次聚類、DBSCAN等。
-
確定聚類的數(shù)量:如果聚類的數(shù)量未知,需要通過一些方法來確定合適的聚類數(shù)量。常用的方法包括肘部法則、輪廓系數(shù)等。
-
運(yùn)行聚類算法:根據(jù)選定的聚類算法和確定的聚類數(shù)量,運(yùn)行聚類算法對案例數(shù)據(jù)進(jìn)行聚類分析。
-
評估聚類結(jié)果:使用合適的指標(biāo)評估聚類結(jié)果的質(zhì)量和準(zhǔn)確性。常用的評估指標(biāo)包括輪廓系數(shù)、DBI指數(shù)等。
-
可視化和解釋結(jié)果:將聚類結(jié)果可視化,幫助理解和解釋聚類結(jié)果??梢允褂蒙Ⅻc(diǎn)圖、熱力圖等方式展示聚類效果,并根據(jù)結(jié)果解釋案例分組的特征和關(guān)系。
使用Python進(jìn)行聚類分析簡單示例:
# 導(dǎo)入必要的庫
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 生成示例數(shù)據(jù)
data = {'age': [23, 30, 45, 18, 50, 28, 35, 40, 20, 33],'score': [85, 92, 78, 88, 95, 83, 87, 80, 85, 89]
}df = pd.DataFrame(data)# 數(shù)據(jù)預(yù)處理
X = df[['age', 'score']]# 設(shè)置聚類數(shù)量為2
k = 2# 運(yùn)行K均值聚類算法
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)# 獲取聚類結(jié)果
labels = kmeans.labels_
centroids = kmeans.cluster_centers_# 可視化聚類結(jié)果
fig, ax = plt.subplots()
for i in range(k):cluster_points = X[labels == i]ax.scatter(cluster_points['age'], cluster_points['score'], label='Cluster {}'.format(i+1))ax.scatter(centroids[:, 0], centroids[:, 1], marker='x', color='black', label='Centroids')
ax.set_xlabel('Age')
ax.set_ylabel('Score')
ax.legend()
plt.show()
運(yùn)行結(jié)果:
我們使用了pandas
庫來處理數(shù)據(jù),sklearn
庫中的KMeans
類來進(jìn)行聚類分析,matplotlib
庫用于可視化聚類結(jié)果。
我們首先生成了一個包含年齡和成績的示例數(shù)據(jù)集,并進(jìn)行了數(shù)據(jù)預(yù)處理。然后設(shè)置聚類數(shù)量為2,并運(yùn)行K均值聚類算法。最后,通過散點(diǎn)圖可視化聚類結(jié)果,其中每個群組用不同的顏色表示,并用“x”表示質(zhì)心。
二、層次聚類算法
層次聚類法(Hierarchical Clustering)是一種將數(shù)據(jù)分層次進(jìn)行聚類的方法。它通過不斷合并或劃分?jǐn)?shù)據(jù)來構(gòu)建一個層次化的聚類結(jié)構(gòu)。層次聚類法可以分為凝聚法(自底向上)和分裂法(自頂向下)兩種類型。
凝聚層次聚類是自底向上的方法,它從每個樣本作為一個獨(dú)立的簇開始,然后迭代地將最相似的簇合并在一起,直到所有樣本都屬于同一個簇。
分裂層次聚類是自頂向下的方法,它從所有樣本作為一個簇開始,然后迭代地將最不相似的簇分裂為更小的簇,直到每個樣本都作為一個獨(dú)立的簇。
2.1 算法原理和實(shí)例
目前,常見的層次聚類法是凝聚法。凝聚法的原理基于以下幾個步驟:
-
初始化每個樣本為一個獨(dú)立的簇:將每個樣本視為一個獨(dú)立的簇,并計算它們之間的距離或相似度。
-
計算簇之間的相似度/距離:對于每一對簇,計算它們之間的距離或相似度。常用的距離度量有歐氏距離、曼哈頓距離等,常用的相似度度量有余弦相似度、相關(guān)系數(shù)等。
-
合并最相似的簇:選擇相似度/距離最小的兩個簇進(jìn)行合并,形成一個新的簇。合并的方式可以是簡單地將兩個簇合并為一個新的簇,也可以是采用更復(fù)雜的方法,如加權(quán)平均。
-
更新簇之間的相似度/距離:更新合并后的簇與其他簇之間的距離或相似度。常用的更新方式有單連接、完全連接和平均連接。
-
重復(fù)步驟3和4:重復(fù)進(jìn)行步驟3和4,直到滿足停止條件。停止條件可以是指定的簇的數(shù)量,或者是某個相似度/距離的閾值。
-
得到最終的聚類結(jié)果:最終的聚類結(jié)果可以通過截取聚類樹狀圖(樹狀圖中的橫軸表示樣本,縱軸表示距離/相似度),或者根據(jù)停止條件在聚類樹中截取簇。
2.2 算法的Sklearn實(shí)現(xiàn)
Scikit-learn的聚類模塊sklearn.cluster中提供了AgglomerativeClustering類,用來實(shí)現(xiàn)層次聚類。該類基于自底向上的聚合策略,先將每個樣本視為一個初始單獨(dú)的簇,然后反復(fù)將最相似的兩個簇合并,直到滿足指定的聚類數(shù)量。
AgglomerativeClustering類有多個參數(shù)可以調(diào)整,包括:
- n_clusters:指定聚類的數(shù)量。
- affinity:指定計算樣本間距離的度量方法,如歐氏距離、曼哈頓距離等。
- linkage:指定計算合并簇的方式,如單鏈接(single linkage)、完全鏈接(complete linkage)等。
AgglomerativeClustering類提供了以下主要方法:
- fit(X):用于對給定的數(shù)據(jù)集X進(jìn)行聚類。
- fit_predict(X):先對數(shù)據(jù)集X進(jìn)行聚類,然后返回每個樣本所屬的簇標(biāo)簽。
- fit_transform(X):先對數(shù)據(jù)集X進(jìn)行聚類,然后返回每個樣本與其他簇的距離。
示例代碼如下所示:
from sklearn.cluster import AgglomerativeClustering# 創(chuàng)建一個AgglomerativeClustering對象
clustering = AgglomerativeClustering(n_clusters=2)# 對數(shù)據(jù)集進(jìn)行聚類
clustering.fit(X)# 返回每個樣本所屬的簇標(biāo)簽
labels = clustering.labels_
2.2.1 層次聚類法的可視化實(shí)例
使用層次聚類法將樣本數(shù)據(jù)聚成3類,其中樣本數(shù)據(jù)保存在文件km.txt中。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
X1,X2=[],[]
fr=open('Sklearn\km.txt') # 打開數(shù)據(jù)文件for line in fr.readlines():lineArr=line.strip().split()X1.append([int(lineArr[0])]) # 第1列讀取到X1中X2.append([int(lineArr[1])])# 把X1和X2合成一個有兩列的數(shù)組X并調(diào)整維度,此處X的維度為[10,2]
X=np.array(list(zip(X1, X2))).reshape (len(X1), 2)
# print(X) # X的值為[[21][1 2] [2 2]…[5 3]]
# model=AgglomerativeClustering(3).fit(X)model=AgglomerativeClustering(n_clusters=3) # 設(shè)置聚類數(shù)目為3
labels=model.fit_predict(X)
print(labels)colors=['b','g','r','c']
markers=['o','s','<','v']
plt.axis([0,6,0,6])
for i,l in enumerate (model.labels_):plt.plot(X1[i],X2[i],color=colors[1],marker=markers[1],ls='None')
plt.show()
運(yùn)行結(jié)果:
[2221111000]
2.2.2 繪制層次聚類的樹狀圖
scipy.cluster.hierarchy是SciPy中用于聚類分析的層次聚類方法的模塊。它提供了一些功能來計算層次聚類和繪制聚類樹狀圖。
scipy.cluster.hierarchy模塊提供了以下方法:
-
linkage:計算聚類算法中的連結(jié)矩陣。它接受一個距離矩陣作為輸入,并返回一個連結(jié)矩陣,用于層次聚類。
-
fcluster:根據(jù)層次聚類的結(jié)果和給定的閾值,對樣本進(jìn)行聚類標(biāo)記。它接受一個連結(jié)矩陣和一個閾值作為輸入,并返回一個數(shù)組,其中包含每個樣本的聚類標(biāo)記。
-
dendrogram:繪制層次聚類的樹狀圖。它接受一個連結(jié)矩陣作為輸入,并根據(jù)層次聚類的結(jié)果繪制樹形圖。
除了這些方法之外,scipy.cluster.hierarchy模塊還提供了一些用于計算距離矩陣和配對距離的函數(shù),如pdist和cophenet。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
from scipy.spatial.distance import pdist # 引入pdist計算距離X1,X2=[],[]
fr=open('Sklearn\km.txt')
for line in fr.readlines():lineArr=line.strip().split()X1.append([int(lineArr[0])])X2.append([int(lineArr[1])])
X=np.array(list(zip(X1,X2))).reshape(len(X1),2)
model=AgglomerativeClustering(n_clusters=3)
labels=model.fit_predict(X)# print(labels)# 繪制層次聚類樹
variables=['X','Y']
df=pd.DataFrame (X,columns=variables,index=labels)
# print (df) # df保存了樣本點(diǎn)的坐標(biāo)值和類別值,可打印出來看# 使用完全距離矩陣
row_clusters=linkage(pdist(df,metric='euclidean'),method='complete')
print(pd.DataFrame(row_clusters,columns=['row labell','row label2','distance','no. of items in clust.'],index=['cluster %d'%(i+1) for i in range (row_clusters.shape[0])]))row_dendr=dendrogram(row_clusters,labels=labels) # 繪制層次聚類樹
plt.tight_layout()
plt.ylabel('Euclidean distance')
plt.show()
運(yùn)行結(jié)果:
2.2.3 DataFrame數(shù)據(jù)結(jié)構(gòu)
DataFrame是Pandas庫中的一個數(shù)據(jù)結(jié)構(gòu),它類似于Excel中的二維表格,可以存儲和操作二維數(shù)據(jù)。DataFrame由行索引和列索引組成,可以通過行索引和列索引來訪問和操作數(shù)據(jù)。
DataFrame既可以從csv、excel等文件中讀取數(shù)據(jù),也可以從字典、列表等數(shù)據(jù)結(jié)構(gòu)中創(chuàng)建。
下面是一個創(chuàng)建DataFrame的例子:
import pandas as pddata = {'Name': ['Tom', 'John', 'Emily'],'Age': [23, 25, 27],'Country': ['USA', 'UK', 'Canada']}df = pd.DataFrame(data)
print(df)
輸出結(jié)果:
Name Age Country
0 Tom 23 USA
1 John 25 UK
2 Emily 27 Canada
注意:
- DataFrame的每一列都可以是不同的數(shù)據(jù)類型,例如上面的Name列是字符串類型,Age列是整數(shù)類型,Country列是字符串類型。
三、k-means聚類算法
k-means聚類算法最早由J.B. MacQueen于1967年提出,被廣泛應(yīng)用于數(shù)據(jù)分析和機(jī)器學(xué)習(xí)領(lǐng)域。k-means聚類算法是一種無監(jiān)督學(xué)習(xí)算法,用于將數(shù)據(jù)集分為k個不重疊的簇,每個簇都具有相似的特征。它是一種迭代算法,以最小化簇內(nèi)平方誤差(SSE)為目標(biāo)函數(shù)。
3.1?算法原理和實(shí)例
3.1.1?k-means聚類算法原理
k-means聚類算法是一種迭代的優(yōu)化算法,通過不斷更新簇的中心點(diǎn)來劃分?jǐn)?shù)據(jù)集。其主要步驟如下:
-
隨機(jī)初始化:從數(shù)據(jù)集中隨機(jī)選擇K個樣本作為初始的簇中心點(diǎn)。
-
分配樣本:對于每個樣本,計算其與各個簇中心點(diǎn)的距離,將樣本分配給距離最近的簇中心點(diǎn)所對應(yīng)的簇。
-
更新簇中心點(diǎn):對于每個簇,計算該簇內(nèi)所有樣本的平均值,將其作為新的簇中心點(diǎn)。
-
重復(fù)步驟2和步驟3,直到滿足停止條件。停止條件可以是簇中心點(diǎn)不再變化或者迭代次數(shù)達(dá)到預(yù)定的值。
3.1.2?k-means聚類算法舉例
假設(shè)有如下10個樣本點(diǎn)的二維數(shù)據(jù):(1, 2), (2, 1), (2, 3), (3, 2), (4, 4), (5, 5), (6, 6), (7, 7), (8, 7), (9, 9)
- 首先,我們隨機(jī)選擇兩個初始聚類中心點(diǎn),如選擇(2, 1)和(6, 6)作為初始聚類中心。
- 接下來,對于每個樣本點(diǎn),計算其與兩個聚類中心的歐幾里得距離,然后將其歸為距離較近的聚類中心所在的類別。
- 計算完成后,我們可以得到兩個類別:
- 類別1:(1, 2), (2, 1), (2, 3), (3, 2)
- 類別2:(4, 4), (5, 5), (6, 6), (7, 7), (8, 7), (9, 9)
- 接下來,我們更新聚類中心,將每個類別中所有樣本的坐標(biāo)的平均值作為新的聚類中心。
- 類別1的新聚類中心:(2.0, 2.0)
- 類別2的新聚類中心:(6.5, 6.5)
- 然后,重復(fù)前面的步驟,計算每個樣本與新的聚類中心的歐幾里得距離,重新分配樣本到類別中。
- 然后再次更新聚類中心,如此往復(fù),直到聚類中心不再發(fā)生變化,滿足終止條件。
- 最終,經(jīng)過多次迭代后,我們可以得到如下的聚類結(jié)果:
- 類別1:(1, 2), (2, 1), (2, 3), (3, 2)
- 類別2:(4, 4), (5, 5), (6, 6), (7, 7), (8, 7), (9, 9)
- 其中,類別1的聚類中心為(2.0, 2.0),類別2的聚類中心為(6.5, 6.5)
3.1.3?k-means聚類算法的優(yōu)缺點(diǎn)
k-means聚類算法的優(yōu)點(diǎn):
-
簡單易實(shí)現(xiàn):k-means算法是一種經(jīng)典的聚類算法,實(shí)現(xiàn)起來相對簡單。
-
可解釋性強(qiáng):聚類結(jié)果直觀明了,每個樣本點(diǎn)都被分配到最近的聚類中心所在的類別中。
-
可擴(kuò)展性好:對于大規(guī)模的數(shù)據(jù)集,k-means算法可以通過并行計算來提高效率。
-
對于凸形狀的類別效果較好:k-means算法對于具有明顯凸形狀的類別,效果較好。
k-means聚類算法的缺點(diǎn):
-
需要預(yù)先確定聚類數(shù)量k:k-means算法需要提前指定聚類的數(shù)量,但在實(shí)際應(yīng)用中,聚類數(shù)量往往是未知的。
-
對初始聚類中心敏感:k-means算法的結(jié)果可能會受到初始聚類中心的選擇影響,不同的初始聚類中心可能得到不同的最終結(jié)果。
-
對異常值敏感:k-means算法對異常值比較敏感,異常值可能會對聚類結(jié)果產(chǎn)生較大的干擾。
-
只適用于數(shù)值型數(shù)據(jù):k-means算法只適用于數(shù)值型數(shù)據(jù),對于包含非數(shù)值型特征的數(shù)據(jù)集,需要進(jìn)行預(yù)處理或選擇其他算法。
3.2 算法中k值的確定
k-Means算法中的k值是指聚類的簇數(shù),也就是將數(shù)據(jù)集劃分為多少個簇。確定k值是k-Means算法中的一個關(guān)鍵問題,一般可以使用以下方法來確定k值:
-
觀察數(shù)據(jù)集:直觀上觀察數(shù)據(jù)集的分布情況,根據(jù)數(shù)據(jù)的特點(diǎn)和目標(biāo)來選擇合適的k值。例如,如果數(shù)據(jù)集呈現(xiàn)出明顯的分群特征,可以根據(jù)分群的數(shù)量確定k值。
-
手肘法(Elbow Method):通過計算不同k值下的簇內(nèi)平方誤差(SSE)來確定k值。在每個k值下,計算各個簇與其質(zhì)心的距離平方之和,然后選擇一個合適的k值,使得簇內(nèi)平方誤差開始顯著下降而后趨于平緩。
-
輪廓系數(shù)(Silhouette Coefficient):通過計算各個樣本的輪廓系數(shù)來評估聚類的質(zhì)量,然后選擇一個合適的k值。輪廓系數(shù)介于-1到1之間,值越大表示聚類效果越好。計算輪廓系數(shù)時,需要計算樣本與同簇其他樣本的平均距離(a)和樣本與其他簇的最小平均距離(b),然后計算輪廓系數(shù)為(b-a)/max(a,b)。選擇一個k值,使得整體的輪廓系數(shù)最大。
-
Gap統(tǒng)計量:通過計算數(shù)據(jù)集在不同k值下的Gap統(tǒng)計量來確定k值。Gap統(tǒng)計量是一種比較聚類結(jié)果與隨機(jī)數(shù)據(jù)集的聚類結(jié)果的統(tǒng)計方法,選擇一個k值,使得Gap統(tǒng)計量達(dá)到峰值。
3.3 算法的Sklearn實(shí)現(xiàn)
在Sklearn中,提供了兩個k-means的算法,分別是K-Means和Mini Batch K-Means。
K-Means是傳統(tǒng)的k-means算法,它使用了Lloyd's算法來進(jìn)行聚類。該算法的原理是,首先隨機(jī)選擇k個樣本點(diǎn)作為初始的聚類中心,然后將每個樣本點(diǎn)分配到距離最近的聚類中心,再根據(jù)分配結(jié)果更新聚類中心的位置,重復(fù)以上步驟直到聚類中心的位置不再變化或者達(dá)到最大迭代次數(shù)。
Mini Batch K-Means是一種優(yōu)化的k-means算法(MiniBatchKMeans),它使用了小批量隨機(jī)梯度下降的方法來進(jìn)行迭代。相比于傳統(tǒng)的k-means算法,MiniBatchKMeans使用了一個小批量的樣本點(diǎn)來更新聚類中心,從而減少了計算量和內(nèi)存消耗。
利用python的sklearn庫實(shí)現(xiàn)kmeans聚類算法并繪制散點(diǎn)圖:
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 隨機(jī)生成一些樣本數(shù)據(jù)
X = np.random.rand(100, 2)# 創(chuàng)建KMeans對象,并指定聚類個數(shù)為3
kmeans = KMeans(n_clusters=3)# 使用KMeans對象對樣本數(shù)據(jù)進(jìn)行聚類
kmeans.fit(X)# 獲取聚類結(jié)果
labels = kmeans.labels_# 獲取聚類中心點(diǎn)坐標(biāo)
centers = kmeans.cluster_centers_# 繪制散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', color='red')plt.show()
運(yùn)行結(jié)果:
首先使用numpy
庫生成了一些隨機(jī)樣本數(shù)據(jù),然后創(chuàng)建了KMeans
對象,并指定聚類個數(shù)為3。接著使用fit
方法對樣本數(shù)據(jù)進(jìn)行聚類,得到聚類結(jié)果。再使用matplotlib
庫繪制散點(diǎn)圖,其中散點(diǎn)的顏色由labels
數(shù)組決定,聚類中心點(diǎn)用紅色的x
標(biāo)記出來。最后調(diào)用plt.show()
顯示圖像。