網(wǎng)站建設(shè)服務(wù)費(fèi)屬于站長工具是什么
前言
提醒:
文章內(nèi)容為方便作者自己后日復(fù)習(xí)與查閱而進(jìn)行的書寫與發(fā)布,其中引用內(nèi)容都會使用鏈接表明出處(如有侵權(quán)問題,請及時聯(lián)系)。
其中內(nèi)容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展及意見建議,歡迎評論區(qū)討論交流。
文章目錄
- 前言
- 聚類算法
- 經(jīng)典應(yīng)用場景
- K-Means 聚類
- 簡單實(shí)例(函數(shù)庫實(shí)現(xiàn))
- 數(shù)學(xué)表達(dá)
- K-Means 算法步驟
- 數(shù)學(xué)優(yōu)化目標(biāo)
- 收斂性
- 優(yōu)點(diǎn)
- 缺點(diǎn)
- 手動實(shí)現(xiàn)
- 代碼分析
聚類算法
聚類算法在各種領(lǐng)域中有廣泛的應(yīng)用,主要用于發(fā)現(xiàn)數(shù)據(jù)中的自然分組和模式。以下是一些常見的應(yīng)用場景以及每種算法的優(yōu)缺點(diǎn):
經(jīng)典應(yīng)用場景
-
市場細(xì)分:根據(jù)消費(fèi)者的行為和特征,將他們分成不同的群體,以便進(jìn)行有針對性的營銷。
-
圖像分割: 將圖像劃分為多個區(qū)域或?qū)ο?#xff0c;以便進(jìn)行進(jìn)一步的分析或處理。
-
社交網(wǎng)絡(luò)分析:識別社交網(wǎng)絡(luò)中的社區(qū)結(jié)構(gòu)。
-
文檔分類:自動將文檔分組到不同的主題或類別中。
-
異常檢測識別數(shù)據(jù)中的異常點(diǎn)或異常行為。
-
基因表達(dá)分析:在生物信息學(xué)中,根據(jù)基因表達(dá)模式對基因進(jìn)行聚類。
K-Means 聚類
- K-Means 聚類
- 優(yōu)點(diǎn):
- 算法簡單,容易實(shí)現(xiàn)。
- 計(jì)算速度快,適用于大規(guī)模數(shù)據(jù)集。
- 缺點(diǎn):
- 需要預(yù)先指定簇的數(shù)量 K K K。
- 對于初始中心點(diǎn)選擇敏感。
- 只能找到球狀簇,無法處理非凸形狀的簇。
- 對噪聲和異常值敏感。
簡單實(shí)例(函數(shù)庫實(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 聚類是一種常用的無監(jiān)督學(xué)習(xí)算法,目的是將數(shù)據(jù)分為 K K K 個簇,以最小化簇內(nèi)數(shù)據(jù)點(diǎn)與簇中心的方差之和。下面是對
K-Means 聚類算法的詳細(xì)介紹,包括其數(shù)學(xué)公式和步驟。K-Means 算法步驟
初始化
從數(shù)據(jù)集中隨機(jī)選擇 K K K 個點(diǎn)作為初始簇中心(質(zhì)心),記作 { μ 1 , μ 2 , … , μ K } \{\mu_1, \mu_2, \ldots, \mu_K\} {μ1?,μ2?,…,μK?}。
分配數(shù)據(jù)點(diǎn)
對于每個數(shù)據(jù)點(diǎn) x i \mathbf{x}_i xi?,計(jì)算其與每個簇中心的距離,將其分配到距離最近的簇中。通常采用歐氏距離作為距離度量:
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
更新簇中心
對于每個簇 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 是代價函數(shù),表示簇內(nèi)平方誤差和。
收斂性
K-Means 算法通過交替優(yōu)化分配和更新步驟最終收斂,因?yàn)槊恳徊蕉际沟么鷥r函數(shù) J J J單調(diào)遞減。然而,算法可能收斂到局部最小值,因此初始化方式對最終結(jié)果有較大影響。
優(yōu)點(diǎn)
- 實(shí)現(xiàn)簡單,計(jì)算速度快。
- 在簇形狀是凸的、簇的大小相似的情況下效果較好。
缺點(diǎn)
- 選擇 K K K 值比較困難,通常需要通過經(jīng)驗(yàn)或使用評估指標(biāo)(如肘部法則、輪廓系數(shù))來選擇。
- 對初始值敏感,可能導(dǎo)致收斂到局部最優(yōu)。
- 適用于凸形簇,對于不同大小和密度的簇效果不好。
- 對噪聲和孤立點(diǎn)敏感。
K-Means 聚類是一種簡單有效的聚類方法,廣泛應(yīng)用于各種實(shí)際問題,但在使用中需注意其局限性和對參數(shù)選擇的要求。
手動實(shí)現(xiàn)
import numpy as npdef initialize_centroids(X, K):# 從數(shù)據(jù)集中隨機(jī)選擇K個樣本作為初始質(zhì)心indices = np.random.choice(X.shape[0], K, replace=False)centroids = X[indices]return centroidsdef assign_clusters(X, centroids):# 計(jì)算每個樣本到每個質(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ì)心為每個簇中所有樣本的均值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__":# 生成一些測試數(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 庫中的一個函數(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ū)γ總€質(zhì)心與每個樣本進(jìn)行逐元素運(yùn)算。X - centroids[:, np.newaxis]
:這個操作會創(chuàng)建一個形狀為(K, n_samples, n_features)
的數(shù)組,表示每個質(zhì)心與每個樣本之間的差值。.sum(axis=2)
:這個操作會對最后一個維度(特征維度)進(jìn)行求和,結(jié)果是一個形狀為(K, n_samples)
的數(shù)組,表示每個樣本與每個質(zhì)心之間的特征平方和。
np.argmin(distances, axis=0)
np.argmin
是一個NumPy函數(shù),用于找到數(shù)組中最小值的索引。axis=0
表示沿著第一個軸(即行)查找最小值。這意味著對每個樣本(每列)比較所有質(zhì)心的距離,找到最小值對應(yīng)的質(zhì)心索引。