網(wǎng)站建設(shè)服務(wù)費(fèi)屬于站長(zhǎng)工具是什么
前言
提醒:
文章內(nèi)容為方便作者自己后日復(fù)習(xí)與查閱而進(jìn)行的書寫與發(fā)布,其中引用內(nèi)容都會(huì)使用鏈接表明出處(如有侵權(quán)問(wèn)題,請(qǐng)及時(shí)聯(lián)系)。
其中內(nèi)容多為一次書寫,缺少檢查與訂正,如有問(wèn)題或其他拓展及意見(jiàn)建議,歡迎評(píng)論區(qū)討論交流。
文章目錄
- 前言
- 聚類算法
- 經(jīng)典應(yīng)用場(chǎng)景
- K-Means 聚類
- 簡(jiǎn)單實(shí)例(函數(shù)庫(kù)實(shí)現(xiàn))
- 數(shù)學(xué)表達(dá)
- K-Means 算法步驟
- 數(shù)學(xué)優(yōu)化目標(biāo)
- 收斂性
- 優(yōu)點(diǎn)
- 缺點(diǎn)
- 手動(dòng)實(shí)現(xiàn)
- 代碼分析
聚類算法
聚類算法在各種領(lǐng)域中有廣泛的應(yīng)用,主要用于發(fā)現(xiàn)數(shù)據(jù)中的自然分組和模式。以下是一些常見(jiàn)的應(yīng)用場(chǎng)景以及每種算法的優(yōu)缺點(diǎn):
經(jīng)典應(yīng)用場(chǎng)景
-
市場(chǎng)細(xì)分:根據(jù)消費(fèi)者的行為和特征,將他們分成不同的群體,以便進(jìn)行有針對(duì)性的營(yíng)銷。
-
圖像分割: 將圖像劃分為多個(gè)區(qū)域或?qū)ο?#xff0c;以便進(jìn)行進(jìn)一步的分析或處理。
-
社交網(wǎng)絡(luò)分析:識(shí)別社交網(wǎng)絡(luò)中的社區(qū)結(jié)構(gòu)。
-
文檔分類:自動(dòng)將文檔分組到不同的主題或類別中。
-
異常檢測(cè)識(shí)別數(shù)據(jù)中的異常點(diǎn)或異常行為。
-
基因表達(dá)分析:在生物信息學(xué)中,根據(jù)基因表達(dá)模式對(duì)基因進(jìn)行聚類。
K-Means 聚類
- K-Means 聚類
- 優(yōu)點(diǎn):
- 算法簡(jiǎn)單,容易實(shí)現(xiàn)。
- 計(jì)算速度快,適用于大規(guī)模數(shù)據(jù)集。
- 缺點(diǎn):
- 需要預(yù)先指定簇的數(shù)量 K K K。
- 對(duì)于初始中心點(diǎn)選擇敏感。
- 只能找到球狀簇,無(wú)法處理非凸形狀的簇。
- 對(duì)噪聲和異常值敏感。
簡(jiǎn)單實(shí)例(函數(shù)庫(kù)實(shí)現(xiàn))
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成數(shù)據(jù)
X = np.random.rand(100, 2)
# K-Means 聚類
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
labels = kmeans.labels_
# 可視化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], color='red')
plt.title('K-Means Clustering')
plt.show()
X數(shù)據(jù)分布:
代碼運(yùn)行結(jié)果:
數(shù)學(xué)表達(dá)
K-Means 聚類是一種常用的無(wú)監(jiān)督學(xué)習(xí)算法,目的是將數(shù)據(jù)分為 K K K 個(gè)簇,以最小化簇內(nèi)數(shù)據(jù)點(diǎn)與簇中心的方差之和。下面是對(duì)
K-Means 聚類算法的詳細(xì)介紹,包括其數(shù)學(xué)公式和步驟。K-Means 算法步驟
初始化
從數(shù)據(jù)集中隨機(jī)選擇 K K K 個(gè)點(diǎn)作為初始簇中心(質(zhì)心),記作 { μ 1 , μ 2 , … , μ K } \{\mu_1, \mu_2, \ldots, \mu_K\} {μ1?,μ2?,…,μK?}。
分配數(shù)據(jù)點(diǎn)
對(duì)于每個(gè)數(shù)據(jù)點(diǎn) x i \mathbf{x}_i xi?,計(jì)算其與每個(gè)簇中心的距離,將其分配到距離最近的簇中。通常采用歐氏距離作為距離度量:
assign? x i to?cluster? j = arg ? min ? k ∥ x i ? μ k ∥ 2 \text{assign } \mathbf{x}_i \text{ to cluster } j = \arg\min_{k} \|\mathbf{x}_i - \mu_k\|^2 assign?xi??to?cluster?j=argkmin?∥xi??μk?∥2
更新簇中心
對(duì)于每個(gè)簇 j j j,計(jì)算簇中所有數(shù)據(jù)點(diǎn)的均值作為新的簇中心:
μ j = 1 N j ∑ x i ∈ C j x i \mu_j = \frac{1}{N_j} \sum_{\mathbf{x}_i \in C_j} \mathbf{x}_i μj?=Nj?1?xi?∈Cj?∑?xi?
其中 C j C_j Cj? 表示簇 j j j 中的所有數(shù)據(jù)點(diǎn), N j N_j Nj? 是簇 j j j 中的點(diǎn)的數(shù)量。
重復(fù)
重復(fù)步驟 2 和步驟 3,直到簇中心不再發(fā)生變化或達(dá)到預(yù)設(shè)的迭代次數(shù)。
數(shù)學(xué)優(yōu)化目標(biāo)
K-Means 聚類的目標(biāo)是最小化所有數(shù)據(jù)點(diǎn)到其所屬簇中心的距離平方和。其優(yōu)化目標(biāo)函數(shù)為:
J = ∑ j = 1 K ∑ x i ∈ C j ∥ x i ? μ j ∥ 2 J = \sum_{j=1}^{K} \sum_{\mathbf{x}_i \in C_j} \|\mathbf{x}_i - \mu_j\|^2 J=j=1∑K?xi?∈Cj?∑?∥xi??μj?∥2
這里, J J J 是代價(jià)函數(shù),表示簇內(nèi)平方誤差和。
收斂性
K-Means 算法通過(guò)交替優(yōu)化分配和更新步驟最終收斂,因?yàn)槊恳徊蕉际沟么鷥r(jià)函數(shù) J J J單調(diào)遞減。然而,算法可能收斂到局部最小值,因此初始化方式對(duì)最終結(jié)果有較大影響。
優(yōu)點(diǎn)
- 實(shí)現(xiàn)簡(jiǎn)單,計(jì)算速度快。
- 在簇形狀是凸的、簇的大小相似的情況下效果較好。
缺點(diǎn)
- 選擇 K K K 值比較困難,通常需要通過(guò)經(jīng)驗(yàn)或使用評(píng)估指標(biāo)(如肘部法則、輪廓系數(shù))來(lái)選擇。
- 對(duì)初始值敏感,可能導(dǎo)致收斂到局部最優(yōu)。
- 適用于凸形簇,對(duì)于不同大小和密度的簇效果不好。
- 對(duì)噪聲和孤立點(diǎn)敏感。
K-Means 聚類是一種簡(jiǎn)單有效的聚類方法,廣泛應(yīng)用于各種實(shí)際問(wèn)題,但在使用中需注意其局限性和對(duì)參數(shù)選擇的要求。
手動(dòng)實(shí)現(xiàn)
import numpy as npdef initialize_centroids(X, K):# 從數(shù)據(jù)集中隨機(jī)選擇K個(gè)樣本作為初始質(zhì)心indices = np.random.choice(X.shape[0], K, replace=False)centroids = X[indices]return centroidsdef assign_clusters(X, centroids):# 計(jì)算每個(gè)樣本到每個(gè)質(zhì)心的距離,并將樣本分配到最近的質(zhì)心distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))return np.argmin(distances, axis=0)def update_centroids(X, labels, K):# 根據(jù)分配結(jié)果更新質(zhì)心為每個(gè)簇中所有樣本的均值centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])return centroidsdef kmeans(X, K, max_iters=100, tol=1e-4):# 初始化質(zhì)心centroids = initialize_centroids(X, K)for i in range(max_iters):# 分配樣本到最近的質(zhì)心labels = assign_clusters(X, centroids)# 計(jì)算新的質(zhì)心new_centroids = update_centroids(X, labels, K)# 檢查質(zhì)心是否收斂if np.all(np.abs(new_centroids - centroids) < tol):breakcentroids = new_centroidsreturn labels, centroids
# 示例用法
if __name__ == "__main__":# 生成一些測(cè)試數(shù)據(jù)X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0],[8.0, 2.0], [10.0, 2.0], [9.0, 3.0]])# 設(shè)定簇的數(shù)量K = 3# 運(yùn)行K-Means算法labels, centroids = kmeans(X, K)print("Cluster labels:", labels)print("Centroids:", centroids)
代碼分析
1.
np.random.choice(X.shape[0], K, replace=False)
numpy.random.choice(a, size=None, replace=True, p=None)
np.random.choice
是 NumPy 庫(kù)中的一個(gè)函數(shù),用于從給定的一維數(shù)組中生成隨機(jī)樣本。它可以指定樣本的數(shù)量、是否允許重復(fù)選擇等參數(shù)。
2.np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
centroids[:, np.newaxis]
: 使用np.newaxis
將centroids
的形狀從(K, n_features)
變?yōu)?(K, 1, n_features)
,這樣做是為了實(shí)現(xiàn)廣播(broadcasting),以便在后續(xù)計(jì)算中能夠?qū)γ總€(gè)質(zhì)心與每個(gè)樣本進(jìn)行逐元素運(yùn)算。X - centroids[:, np.newaxis]
:這個(gè)操作會(huì)創(chuàng)建一個(gè)形狀為(K, n_samples, n_features)
的數(shù)組,表示每個(gè)質(zhì)心與每個(gè)樣本之間的差值。.sum(axis=2)
:這個(gè)操作會(huì)對(duì)最后一個(gè)維度(特征維度)進(jìn)行求和,結(jié)果是一個(gè)形狀為(K, n_samples)
的數(shù)組,表示每個(gè)樣本與每個(gè)質(zhì)心之間的特征平方和。
np.argmin(distances, axis=0)
np.argmin
是一個(gè)NumPy函數(shù),用于找到數(shù)組中最小值的索引。axis=0
表示沿著第一個(gè)軸(即行)查找最小值。這意味著對(duì)每個(gè)樣本(每列)比較所有質(zhì)心的距離,找到最小值對(duì)應(yīng)的質(zhì)心索引。