1 前言
1.1 K-means的介紹
K均值(K-means)是一種基于距離度量的聚類算法,其主要思想是將數(shù)據(jù)集劃分為k個不同的簇,每個簇代表一個相似度較高的數(shù)據(jù)組。該算法通過迭代優(yōu)化來最小化所有數(shù)據(jù)點與其所屬簇的歐氏距離之和,從而找到最佳的簇劃分。
需要區(qū)分一下,K-means和KNN是兩種不同的機器學習算法,K-means和KNN都是基于距離度量的算法,但前者用于聚類問題,而后者用于分類問題
- K-means是一種聚類算法,它旨在將數(shù)據(jù)集分成k個不同的簇,每個簇代表一個相似度較高的數(shù)據(jù)組。該算法通過迭代優(yōu)化來最小化所有數(shù)據(jù)點與其所屬簇的歐氏距離之和,從而找到最佳的簇劃分。
- KNN(K-Nearest Neighbors)是一種分類算法,它將新樣本與訓練集中所有樣本進行比較,并將其歸為最接近的K個鄰居中出現(xiàn)最多的類別。KNN算法使用歐氏距離或曼哈頓距離等計算相似性,然后根據(jù)K值確定鄰居的數(shù)量。
優(yōu)點:
- 簡單易用:算法的實現(xiàn)十分簡單,也容易理解。
- 可擴展性:在處理大規(guī)模數(shù)據(jù)時表現(xiàn)優(yōu)秀,可以通過并行化等方法加速計算過程。
- 效率高:算法的迭代次數(shù)通常較少,因此計算速度很快。
缺點:
- 對初始值敏感:由于K-means算法是基于隨機初始值進行迭代的,因此其結(jié)果很大程度上取決于初始中心點的選擇。
- 容易陷入局部最優(yōu):容易陷入局部最優(yōu)解,無法保證找到全局最優(yōu)解。
- 簇數(shù)需要預先確定:需要預先確定簇的數(shù)量k,而實際應用中往往并不知道應該將數(shù)據(jù)劃分成多少個簇。
1.2 K-means的應用
-
自然語言處理:K-means算法可用于文本聚類、主題建模和情感分析等自然語言處理任務。例如,將大量新聞文章聚類成不同的主題簇。
-
圖像處理:K-means算法可用于圖像分割、圖像壓縮和特征提取等圖像處理任務。例如,使用K-means算法將圖像像素分類為具有相似顏色和紋理的區(qū)域。
-
生物信息學:K-means算法可用于DNA序列和蛋白質(zhì)序列的聚類和分類。例如,將蛋白質(zhì)序列聚類到具有相似結(jié)構或功能的族群中。
-
金融風險管理:K-means算法可用于檢測潛在的投資風險。例如,將投資組合分為不同的風險等級,并確定與每個等級相關的風險因素。
-
市場細分:K-means算法可用于市場細分和客戶細分。例如,將消費者分成具有相似需求和偏好的不同類別,以便制定更有效的市場營銷策略。
-
醫(yī)療診斷:K-means算法可用于分類和預測疾病。例如,將患有相似癥狀的患者分成具有類似病情的子組。
2 demo實戰(zhàn)演示
2.1 導入函數(shù)
import matplotlib.pyplot as plt
from kneed import KneeLocator
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
2.2 創(chuàng)建數(shù)據(jù)
#n_samples是要生成的樣本總數(shù),centers是要生成的中心數(shù),cluster_std是標準偏差
features, true_labels = make_blobs(
n_samples=200,
centers=3,
cluster_std=2.75,
random_state=42
)
查看數(shù)據(jù)
features[:5]
true_labels[:5]
縮放
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)
scaled_features[:5]
2.3 擬合聚類
kmeans = KMeans(
init="random",
n_clusters=3,
n_init=10,
max_iter=300,
random_state=42
)
kmeans.fit(scaled_features)
2.4 查看結(jié)果
# 最低的SSE值
kmeans.inertia_
# 質(zhì)心的最終位置
kmeans.cluster_centers_
# 收斂所需的迭代次數(shù)
kmeans.n_iter_
一般有兩種常見的方法評估聚類數(shù):
- 拐點法
- 輪廓系數(shù)
# 選擇合適的簇,注意這里把n_clusters改了,運行多個值并且記錄結(jié)果
kmeans_kwargs = {
"init": "random",
"n_init": 10,
"max_iter": 300,
"random_state": 42,
}
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, **kmeans_kwargs)
kmeans.fit(scaled_features)
sse.append(kmeans.inertia_)
# 可視化
plt.style.use("fivethirtyeight")
plt.plot(range(1, 11), sse)
plt.xticks(range(1, 11))
plt.xlabel("Number of Clusters")
plt.ylabel("SSE")
plt.show()
如圖,這里很明顯肉眼可見拐點是3,如果難以辨別可以通過kned
識別
查看輪廓系數(shù),輪廓系數(shù)是集群凝聚力和分離度的度量。它基于兩個因素量化數(shù)據(jù)點與其分配的集群的匹配程度:輪廓系數(shù)值介于-1和之間1。較大的數(shù)字表示樣本離它們的集群比離其他集群更近。
silhouette_coefficients = []
# 從輪廓系數(shù)的第2個集群開始
for k in range(2, 11):
kmeans = KMeans(n_clusters=k, **kmeans_kwargs)
kmeans.fit(scaled_features)
score = silhouette_score(scaled_features, kmeans.labels_)
silhouette_coefficients.append(score)
# 選最高分k值
plt.style.use("fivethirtyeight")
plt.plot(range(2, 11), silhouette_coefficients)
plt.xticks(range(2, 11))
plt.xlabel("Number of Clusters")
plt.ylabel("Silhouette Coefficient")
plt.show()
根據(jù)結(jié)果取最高分的點,這里依然是3
3 使用高級技術評估集群性能*
為了應付數(shù)據(jù)導致失真的情況,這是除了拐點法和輪廓系數(shù)外的一種高級方法
3.1 導入函數(shù)
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
from sklearn.metrics import adjusted_rand_score
3.2 整合數(shù)據(jù)
函數(shù)如其名,整合成新月數(shù)據(jù)
features, true_labels = make_moons(
n_samples=250, noise=0.05, random_state=42
)
scaled_features = scaler.fit_transform(features)
3.3 計算
分別用k均值
算法和DBSCAN
算法進行計算對比,
# Instantiate k-means and dbscan algorithms
kmeans = KMeans(n_clusters=2)
dbscan = DBSCAN(eps=0.3)
# Fit the algorithms to the features
kmeans.fit(scaled_features)
dbscan.fit(scaled_features)
# Compute the silhouette scores for each algorithm
kmeans_silhouette = silhouette_score(
scaled_features, kmeans.labels_
).round(2)
dbscan_silhouette = silhouette_score(
scaled_features, dbscan.labels_
).round (2)
kmeans_silhouette
dbscan_silhouette
可視化結(jié)果:
# 繪制數(shù)據(jù)和集群輪廓比較
fig, (ax1, ax2) = plt.subplots(
1, 2, figsize=(8, 6), sharex=True, sharey=True
)
fig.suptitle(f"Clustering Algorithm Comparison: Crescents", fontsize=16)
fte_colors = {
0: "#008fd5",
1: "#fc4f30",
}
# k-means
km_colors = [fte_colors[label] for label in kmeans.labels_]
ax1.scatter(scaled_features[:, 0], scaled_features[:, 1], c=km_colors)
ax1.set_title(
f"k-means\nSilhouette: {kmeans_silhouette}", fontdict={"fontsize": 12}
)
# dbscan
db_colors = [fte_colors[label] for label in dbscan.labels_]
ax2.scatter(scaled_features[:, 0], scaled_features[:, 1], c=db_colors)
ax2.set_title(
f"DBSCAN\nSilhouette: {dbscan_silhouette}", fontdict={"fontsize": 12}
)
plt.show()
也可以參考調(diào)整蘭特指數(shù) (ARI,adjusted rand index),ARI一般介于-1到1之間:
-
當ARI等于1時,表示兩個聚類結(jié)果完全一致,即兩個聚類結(jié)果中所有樣本都被分配到了同一個簇中,或者兩個聚類結(jié)果中所有的不同簇的元素都是相同的。因此,ARI等于1時,表示聚類結(jié)果非常好。
-
當ARI等于0時,表示兩個聚類結(jié)果之間的一致性與隨機模型的預期一致性相同。這意味著,兩個聚類結(jié)果沒有更多的關聯(lián)比隨機分配的情況要好,也就是說,聚類算法表現(xiàn)不佳。
-
當ARI小于0時,表示兩個聚類結(jié)果之間的一致性比隨機模型還差。這通常出現(xiàn)在聚類結(jié)果的標簽彼此之間毫無關系或者是完全相反的情況下,例如,兩個聚類結(jié)果之間的標簽是完全不同的情況下。
ari_kmeans = adjusted_rand_score(true_labels, kmeans.labels_)
ari_dbscan = adjusted_rand_score(true_labels, dbscan.labels_)
round(ari_kmeans, 2)
round(ari_dbscan, 2)
這里算到結(jié)果是0.47
和1.0
,ARI 表明,與k均值相比,DBSCAN 是合成新月示例的最佳選擇文章來源:http://www.zghlxwxcb.cn/news/detail-463722.html
4 討論
K-means總體來說不難,且有多個指標來衡量聚類的質(zhì)量。下次出一波番外篇,記錄如何構建Pineline處理TCGA的數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-463722.html
到了這里,關于【機器學習實戰(zhàn)】Python基于K均值K-means進行聚類(九)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!