柚子快報(bào)邀請(qǐng)碼778899分享:聚類算法-Kmeans聚類
柚子快報(bào)邀請(qǐng)碼778899分享:聚類算法-Kmeans聚類
一、K-means 聚類介紹
1.含義
K-means 聚類是一種非常流行的基于距離的無監(jiān)督學(xué)習(xí)算法,用于將數(shù)據(jù)點(diǎn)劃分為預(yù)定義的 K 個(gè)簇(或組),其中每個(gè)簇由其質(zhì)心(即簇中所有點(diǎn)的均值)定義。K-means 算法的目標(biāo)是使簇內(nèi)的點(diǎn)盡可能緊密地聚集在一起,同時(shí)使不同簇之間的點(diǎn)盡可能遠(yuǎn)離。
2.基本步驟:
選擇 K 值:首先,你需要決定將數(shù)據(jù)分成多少個(gè)簇,即 K 的值。K 的選擇通常是基于問題的上下文或通過一些啟發(fā)式方法(如肘部法則)來確定。初始化質(zhì)心:隨機(jī)選擇 K 個(gè)數(shù)據(jù)點(diǎn)作為初始的簇質(zhì)心。質(zhì)心可以是數(shù)據(jù)集中的任意點(diǎn),但通常選擇相距較遠(yuǎn)的點(diǎn)作為起始點(diǎn),以避免局部最優(yōu)解。分配簇:對(duì)于數(shù)據(jù)集中的每個(gè)點(diǎn),將其分配到最近的質(zhì)心所在的簇。通常使用歐幾里得距離來測(cè)量點(diǎn)與質(zhì)心之間的距離。更新質(zhì)心:對(duì)于每個(gè)簇,重新計(jì)算其質(zhì)心(即簇內(nèi)所有點(diǎn)的均值)。重復(fù)迭代:重復(fù)步驟 3 和 4,直到質(zhì)心的位置不再顯著變化或達(dá)到預(yù)設(shè)的迭代次數(shù)。輸出結(jié)果:最終,算法會(huì)輸出 K 個(gè)簇和它們的質(zhì)心。
二、代碼實(shí)現(xiàn)
1.數(shù)據(jù)預(yù)處理
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics
# 讀取文件
beer = pd.read_table('data.txt', sep=' ', encoding='utf8', engine='python')
# 傳入變量
X = beer.drop(columns=beer.columns[0])
使用pandas的read_table函數(shù)讀取名為data.txt的文本文件,該文件中的數(shù)據(jù)通過空格分隔,并指定編碼為utf8。通過drop(columns=beer.columns[0])刪除數(shù)據(jù)框beer的第一列,因?yàn)檫@一列不包含用于聚類的特征。剩下的列(特征)被存儲(chǔ)在X中。
2.交叉驗(yàn)證
# 交叉驗(yàn)證
scores = []
max_range = np.arange(2,10)
for k in max_range:
labels = KMeans(n_clusters=k).fit(X).labels_
score = metrics.silhouette_score(X, labels) # 輪廓系數(shù)
scores.append(score)
K = max_range[np.argmax(scores)]
print(K)
print(scores)
使用一個(gè)循環(huán)來嘗試不同的K值(從2到9),對(duì)于每個(gè)K值,使用KMeans類進(jìn)行聚類,并計(jì)算聚類結(jié)果的輪廓系數(shù)得分。輪廓系數(shù)得分范圍從-1到1,得分越高表示聚類效果越好。將每個(gè)K值對(duì)應(yīng)的輪廓系數(shù)得分存儲(chǔ)在scores列表中。使用np.argmax(scores)找到scores列表中的最大值索引,該索引對(duì)應(yīng)的K值即為最優(yōu)的聚類數(shù)。打印出最優(yōu)的K值和對(duì)應(yīng)的輪廓系數(shù)得分列表。
3.繪制得分結(jié)果
import matplotlib.pyplot as plt
plt.plot(list(range(2, 10)), scores)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
使用matplotlib庫繪制輪廓系數(shù)得分隨K值變化的折線圖,以便直觀地觀察不同K值下的聚類效果。
4.最終聚類
# 聚類
km = KMeans(n_clusters=K).fit(X)
beer['cluster'] = km.labels_
score = metrics.silhouette_score(X, beer.cluster)
print(score)
使用選定的最優(yōu)K值對(duì)原始數(shù)據(jù)進(jìn)行K-means聚類。將聚類標(biāo)簽添加到原始數(shù)據(jù)框beer中,作為新列cluster。再次計(jì)算并打印使用最優(yōu)K值聚類后的輪廓系數(shù)得分,以驗(yàn)證聚類效果。
5.全部代碼
這段代碼主要執(zhí)行了以下幾個(gè)步驟,用于對(duì)啤酒數(shù)據(jù)集(存儲(chǔ)在data.txt文件中)進(jìn)行K-means聚類,并通過輪廓系數(shù)(Silhouette Score)來評(píng)估不同聚類數(shù)(K值)下的聚類效果,最終選擇最優(yōu)的K值進(jìn)行聚類,并展示聚類結(jié)果和對(duì)應(yīng)的輪廓系數(shù)得分。
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics
# 讀取文件
beer = pd.read_table('data.txt', sep=' ', encoding='utf8', engine='python')
# 傳入變量
X = beer.drop(columns=beer.columns[0])
"""
根據(jù)分成不同的族,自動(dòng)計(jì)算輪廓系數(shù)得分
"""
# 交叉驗(yàn)證
scores = []
max_range = np.arange(2,10)
for k in max_range:
labels = KMeans(n_clusters=k).fit(X).labels_
score = metrics.silhouette_score(X, labels) # 輪廓系數(shù)
scores.append(score)
K = max_range[np.argmax(scores)]
print(K)
print(scores)
# 繪制得分結(jié)果
import matplotlib.pyplot as plt
plt.plot(list(range(2, 10)), scores)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
# 聚類
km = KMeans(n_clusters=K).fit(X)
beer['cluster'] = km.labels_
score = metrics.silhouette_score(X, beer.cluster)
print(score)
三、總結(jié)
K-means 聚類廣泛應(yīng)用于市場(chǎng)細(xì)分、圖像分割、文檔聚類等領(lǐng)域。例如,在市場(chǎng)營(yíng)銷中,可以將客戶劃分為不同的群體,以便進(jìn)行更針對(duì)性的推廣策略;在圖像處理中,可以將圖像分割成多個(gè)區(qū)域,以便進(jìn)一步分析或壓縮。但同時(shí)也擁有自己的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):
簡(jiǎn)單易實(shí)現(xiàn)。對(duì)大數(shù)據(jù)集具有較好的可擴(kuò)展性。當(dāng)簇的密度大致相同且簇間分離良好時(shí),效果非常好。 缺點(diǎn):
需要預(yù)先指定 K 值,而 K 的選擇通常不直觀。結(jié)果可能受到初始質(zhì)心選擇的影響,可能導(dǎo)致局部最優(yōu)解。對(duì)異常值(噪聲)和簇的形狀(非球形)敏感。
柚子快報(bào)邀請(qǐng)碼778899分享:聚類算法-Kmeans聚類
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。