聚類算法按照算法原理,可以大致劃分為以下幾類,
基于距離的聚類算法 :
– K-Means :將數(shù)據(jù)點(diǎn)劃分為 K 個簇,使得每個點(diǎn)到其對應(yīng)簇中心的距離最小。
k-Medoids :類似于 K-Means,但使用簇內(nèi)最近點(diǎn)(medoids)作為簇中心,對噪聲和異常值有更好的魯棒性。
Fuzzy C-Means (FCM) :基于模糊 C-均值算法,每個數(shù)據(jù)點(diǎn)屬于每個簇的模糊程度。
C-Means :與 FCM 類似,但更加關(guān)注數(shù)據(jù)點(diǎn)的硬歸屬。
層次聚類算法 :
– Hierarchical Clustering :根據(jù)數(shù)據(jù)點(diǎn)之間的距離構(gòu)建一個層次結(jié)構(gòu),可以是樹形結(jié)構(gòu)。
Agglomerative Clustering :自底向上合并相似的數(shù)據(jù)點(diǎn)形成簇。
BIRCH (Balanced Iterative Reducing and Clustering using Hierarchies) :先對數(shù)據(jù)進(jìn)行初步聚類,然后進(jìn)行層次聚類。
基于密度的聚類算法 :
– DBSCAN (Density-Based Spatial Clustering of Applications with Noise) :基于密度的聚類算法,可以檢測到任意形狀的簇。
OPTICS (Ordering Points To Identify the Clustering Structure) :類似于 DBSCAN,但可以更好地處理噪聲和異常值。
Density-Based Clustering :一個更通用的類別,包括 DBSCAN 和 OPTICS。
基于模型的聚類算法 :
– Gaussian Mixture Models (GMM) :假設(shè)數(shù)據(jù)由多個高斯分布組成,每個分布對應(yīng)一個簇。
Gaussian Mixture Clustering :類似于 GMM,但更關(guān)注聚類。
基于模型的聚類算法(文本聚類) :
– Latent Dirichlet Allocation (LDA) :用于文檔聚類,將文檔表示為單詞的主題分布。
Latent Semantic Analysis (LSA) :用于文檔聚類,通過潛在語義分析找到文檔之間的相似性。
Factor Analysis :用于數(shù)據(jù)降維,也可以用于聚類。
其他聚類算法 :
– Mean-Shift Clustering :基于密度的聚類算法,尋找局部密度峰值作為簇中心。
Affinity Propagation :基于相似度的聚類算法,通過傳播相似度信息來識別簇。
MiniBatchKMeans :K-Means 的一個變種,用于大規(guī)模數(shù)據(jù)集。
Spectral Clustering :基于圖論的聚類算法,通過譜分解數(shù)據(jù)點(diǎn)的相似度矩陣。
X-Means :類似于 K-Means,但可以動態(tài)地調(diào)整簇的數(shù)量。
Self-Organizing Maps (SOM) :通過競爭學(xué)習(xí)算法將數(shù)據(jù)映射到一個低維空間,用于可視化和高維數(shù)據(jù)的聚類。
k-Prototypes :類似于 k-Means,但用于文本數(shù)據(jù),考慮單詞的頻率和共現(xiàn)性。
Clustering Ensembles :結(jié)合多個聚類算法的結(jié)果,以提高聚類性能。
聚類算法 K-Means
背景介紹
K-Means 是一種無監(jiān)督學(xué)習(xí) 算法,主要用于將相似的數(shù)據(jù)點(diǎn)分到同一個組或簇中。它廣泛應(yīng)用于數(shù)據(jù)挖掘、模式識別和機(jī)器學(xué)習(xí)等領(lǐng)域。K-Means 算法 假設(shè)數(shù)據(jù)空間是凸的,并且簇是球形的。
一句話通俗概括原理
K-Means 算法通過迭代計算來將數(shù)據(jù)點(diǎn)分配到 K 個簇中,使得每個簇內(nèi)的數(shù)據(jù)點(diǎn)距離簇中心最近。
算法原理及核心公式
核心思想 :選擇 K 個初始中心點(diǎn)(通常是隨機(jī)選擇),然后迭代更新這些中心點(diǎn),直到中心點(diǎn)不再顯著變化。
步驟 :
1. 隨機(jī)選擇 K 個數(shù)據(jù)點(diǎn)作為初始聚類中心。
將每個數(shù)據(jù)點(diǎn)分配到最近的聚類中心,形成 K 個簇。
計算每個簇的中心點(diǎn),即該簇所有數(shù)據(jù)點(diǎn)的均值。
重復(fù)步驟 2 和 3,直到聚類中心不再改變。
核心公式 :
– 聚類分配:對于每個數(shù)據(jù)點(diǎn)(x),計算其到每個聚類中心的距離,將其分配到距離最近的聚類中心所代表的簇。
簇中心更新:對于每個簇,計算該簇所有數(shù)據(jù)點(diǎn)的均值,作為新的聚類中心。
模型訓(xùn)練過程
初始化:隨機(jī)選擇 K 個數(shù)據(jù)點(diǎn)作為初始聚類中心。
分配:將所有數(shù)據(jù)點(diǎn)分配到最近的聚類中心。
更新:計算每個簇的中心點(diǎn)。
重復(fù):重復(fù)步驟 2 和 3,直到聚類中心變化很小或達(dá)到最大迭代次數(shù)。
模型調(diào)優(yōu)經(jīng)驗(yàn)
選擇 K 值 :可以使用肘部法則或輪廓系數(shù)來選擇合適的 K 值。
初始化中心 :使用 K-means++算法來選擇初始中心,可以減少陷入局部最優(yōu)的風(fēng)險。
處理異常值 :異常值可能會影響聚類結(jié)果,因此在聚類之前可以考慮去除或處理異常值。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
– 簡單易懂,實(shí)現(xiàn)簡單。
運(yùn)算速度快,適用于大規(guī)模數(shù)據(jù)集。
對輸入數(shù)據(jù)的規(guī)模和維度沒有嚴(yán)格要求。
缺點(diǎn) :
– 對異常值敏感。
需要預(yù)先指定簇的數(shù)量 K。
可能陷入局部最優(yōu)解。
應(yīng)用場景
文本聚類:將文檔分組為相似主題。
圖像聚類:將圖像分組為相似風(fēng)格或內(nèi)容。
社交網(wǎng)絡(luò)分析:將用戶分組為相似興趣或特征。
Python 示例代碼
from sklearn.cluster import KMeans
import numpy as np
# 示例數(shù)據(jù)
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
# 創(chuàng)建KMeans對象
kmeans = KMeans(n_clusters=2, random_state=0)
# 擬合模型
kmeans.fit(data)
# 輸出聚類中心
print(kmeans.cluster_centers_)
# 對數(shù)據(jù)進(jìn)行聚類
labels = kmeans.predict(data)
# 輸出每個數(shù)據(jù)點(diǎn)的簇標(biāo)簽
print(labels)
這段代碼使用sklearn
庫中的KMeans
類來對示例數(shù)據(jù)進(jìn)行聚類,并輸出聚類中心和每個數(shù)據(jù)點(diǎn)的簇標(biāo)簽。
Hierarchical Clustering
背景介紹
Hierarchical Clustering(層次聚類)是一種非監(jiān)督機(jī)器學(xué)習(xí) 算法,它通過將數(shù)據(jù)點(diǎn)逐步合并成簇,或者將簇逐步分裂成更小的簇,來發(fā)現(xiàn)數(shù)據(jù)中的層次結(jié)構(gòu)。這種方法不依賴于預(yù)先指定的簇數(shù),而是根據(jù)數(shù)據(jù)本身的結(jié)構(gòu)來形成簇。
一句話通俗概括原理
“就像拼圖一樣,層次聚類將相似的數(shù)據(jù)點(diǎn)像拼圖一樣拼接在一起,形成不同的層級。”
算法原理及核心公式
層次聚類主要有兩種類型:自下而上的凝聚式(Agglomerative)和自上而下的分裂式(Divisive)。這里以凝聚式為例進(jìn)行說明:
初始化 :將每個數(shù)據(jù)點(diǎn)視為一個簇。
合并 :計算最近距離的簇,并將它們合并成一個簇。
重復(fù) :繼續(xù)上述過程,直到滿足停止條件(如達(dá)到指定層數(shù)或簇數(shù))。
核心公式:
距離計算 :可以使用不同的距離度量,如歐氏距離、曼哈頓距離等。
簇合并 :常用的方法有單鏈接(最近距離)、完全鏈接(最遠(yuǎn)距離)、平均鏈接(簇內(nèi)點(diǎn)的平均值)等。
模型訓(xùn)練過程
選擇距離度量方法。
選擇簇合并方法。
初始化每個數(shù)據(jù)點(diǎn)為單獨(dú)的簇。
計算簇間的距離。
根據(jù)選擇的合并方法合并最近的簇。
重復(fù)步驟 4 和 5,直到達(dá)到停止條件。
模型調(diào)優(yōu)經(jīng)驗(yàn)
距離度量 :根據(jù)數(shù)據(jù)特征選擇合適的距離度量方法。
簇合并方法 :不同的合并方法會影響聚類結(jié)果,可以嘗試不同的方法比較效果。
停止條件 :根據(jù)數(shù)據(jù)量和業(yè)務(wù)需求設(shè)置合適的停止條件。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
不需要預(yù)先指定簇的數(shù)量。
能夠發(fā)現(xiàn)數(shù)據(jù)的層次結(jié)構(gòu)。
缺點(diǎn) :
聚類結(jié)果受距離度量方法和簇合并方法的影響較大。
對于大規(guī)模數(shù)據(jù)集,計算成本較高。
應(yīng)用場景
社交網(wǎng)絡(luò)分析,發(fā)現(xiàn)朋友之間的關(guān)系。
市場細(xì)分,識別潛在客戶群體。
文本聚類,分析文檔主題。
Python 示例代碼
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 示例數(shù)據(jù)
data = [[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]]
# 使用凝聚式層次聚類
linked = linkage(data, method='ward', metric='euclidean')
# 繪制樹狀圖
dendrogram(linked)
plt.show()
這段代碼使用了scipy
庫中的linkage
和dendrogram
函數(shù)來執(zhí)行層次聚類并繪制樹狀圖。data
是示例數(shù)據(jù),method='ward'
指定了簇合并方法為 Ward 方法,metric='euclidean'
指定了距離度量方法為歐氏距離。
DBSCAN
背景介紹
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法。它通過分析數(shù)據(jù)點(diǎn)之間的密度分布來進(jìn)行聚類,能夠發(fā)現(xiàn)任意形狀的簇,并且可以處理噪聲和異常值。
一句話通俗概括原理
DBSCAN 通過尋找高密度區(qū)域來定義簇,并以此將數(shù)據(jù)點(diǎn)劃分到簇中。
算法原理及核心公式
核心概念:
核心點(diǎn) :一個點(diǎn)如果至少有 MinPts 個鄰居,那么它就是一個核心點(diǎn)。
邊界點(diǎn) :如果一個點(diǎn)不是核心點(diǎn),但至少有 MinPts 個鄰居中的部分是核心點(diǎn),那么它是一個邊界點(diǎn)。
噪聲點(diǎn) :如果一個點(diǎn)不是核心點(diǎn),且其鄰居數(shù)量小于 MinPts,那么它是一個噪聲點(diǎn)。
核心公式:
DBSCAN 不需要預(yù)先指定簇的數(shù)量,它通過以下公式來計算:
Eps :鄰域半徑
MinPts :鄰域內(nèi)的最小點(diǎn)數(shù)
模型訓(xùn)練過程
初始化 :設(shè)置鄰域半徑 Eps 和最小點(diǎn)數(shù) MinPts。
核心點(diǎn)檢測 :對于數(shù)據(jù)集中的每個點(diǎn),檢查其 Eps 鄰域內(nèi)是否有 MinPts 個點(diǎn)。如果是,則該點(diǎn)為核心點(diǎn)。
簇擴(kuò)展 :從核心點(diǎn)開始,遞歸地將其鄰居加入簇中。
重復(fù) :重復(fù)步驟 2 和 3,直到所有點(diǎn)都被處理。
模型調(diào)優(yōu)經(jīng)驗(yàn)
MinPts :通常需要根據(jù)數(shù)據(jù)的分布來設(shè)定。如果簇的大小變化較大,可以嘗試多個 MinPts 值。
Eps :可以手動設(shè)定,或者使用 KNN 算法來估計。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
能夠發(fā)現(xiàn)任意形狀的簇。
對噪聲和異常值有很好的魯棒性。
不需要預(yù)先指定簇的數(shù)量。
缺點(diǎn):
需要設(shè)定參數(shù) MinPts 和 Eps,這可能會很困難。
對于高維數(shù)據(jù),性能可能會下降。
應(yīng)用場景
數(shù)據(jù)挖掘
生物信息學(xué)
圖像分割
地理信息系統(tǒng)
Python 示例代碼
from sklearn.cluster import DBSCAN
import numpy as np
# 生成一些示例數(shù)據(jù)
X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
# 創(chuàng)建DBSCAN對象
db = DBSCAN(eps=0.3, min_samples=2)
# 擬合模型
db.fit(X)
# 獲取簇標(biāo)簽
labels = db.labels_
# 打印簇標(biāo)簽
print(labels)
在這個示例中,我們使用sklearn
庫中的DBSCAN
類來聚類數(shù)據(jù)。eps
參數(shù)設(shè)置為 0.3,min_samples
參數(shù)設(shè)置為 2。運(yùn)行代碼后,我們可以看到每個點(diǎn)的簇標(biāo)簽。
Gaussian Mixture Models (GMM)
背景介紹
Gaussian Mixture Models(GMM)是一種概率模型,它將數(shù)據(jù)集視為由多個高斯分布組成的混合體。這種模型在機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘中廣泛應(yīng)用于無監(jiān)督學(xué)習(xí) ,特別是在聚類分析中。它通過將數(shù)據(jù)集劃分為不同的簇,幫助用戶發(fā)現(xiàn)數(shù)據(jù)中的潛在結(jié)構(gòu)。
一句話通俗概括原理
GMM 是一種假設(shè)數(shù)據(jù)由多個高斯分布混合而成的模型,通過最大化似然函數(shù)來估計這些高斯分布的參數(shù),從而對數(shù)據(jù)進(jìn)行聚類。
算法原理及核心公式
核心公式
GMM 的核心公式是高斯分布的概率密度函數(shù)(PDF)和最大化似然函數(shù)。
高斯分布 PDF :
其中:
( x ) 是數(shù)據(jù)點(diǎn)。
( \mu ) 是均值向量。
( \sigma^2 ) 是協(xié)方差矩陣。
似然函數(shù) :
其中:
( \theta ) 是模型參數(shù),包括均值向量、協(xié)方差矩陣和每個高斯分布的權(quán)重。
( N ) 是數(shù)據(jù)點(diǎn)的總數(shù)。
( P(x_i|\mu, \sigma^2, \pi) ) 是每個數(shù)據(jù)點(diǎn)的高斯分布 PDF。
算法流程
初始化:隨機(jī)選擇 K 個均值向量作為初始均值。
計算權(quán)重:對于每個數(shù)據(jù)點(diǎn),計算其屬于每個高斯分布的概率,并歸一化。
更新均值和協(xié)方差:使用最大似然估計法更新每個高斯分布的均值和協(xié)方差。
迭代:重復(fù)步驟 2 和 3,直到收斂。
模型訓(xùn)練過程
選擇合適的 K 值(簇的數(shù)量)。
使用 EM 算法進(jìn)行訓(xùn)練,包括以下步驟:
– E 步:計算每個數(shù)據(jù)點(diǎn)屬于每個簇的概率。
M 步:使用這些概率更新均值、協(xié)方差和權(quán)重。
模型調(diào)優(yōu)經(jīng)驗(yàn)
選擇合適的 K 值:可以使用肘部法則或輪廓系數(shù)等方法確定最佳的 K 值。
初始化:嘗試不同的初始化方法,如 K-means 初始化。
選擇合適的算法:使用快速 GMM 或 Gaussian Processes 等算法。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
可以處理非球形簇。
可以處理混合分布的數(shù)據(jù)。
易于解釋。
缺點(diǎn)
需要選擇 K 值。
對于小樣本數(shù)據(jù),性能可能較差。
需要計算協(xié)方差矩陣。
應(yīng)用場景
聚類分析。
數(shù)據(jù)降維。
異常檢測。
Python 示例代碼
from sklearn.mixture import GaussianMixture
import numpy as np
# 生成樣本數(shù)據(jù)
data = np.random.randn(100, 2)
# 創(chuàng)建GMM模型,設(shè)置簇的數(shù)量為2
gmm = GaussianMixture(n_components=2)
# 訓(xùn)練模型
gmm.fit(data)
# 預(yù)測簇標(biāo)簽
labels = gmm.predict(data)
請注意,在實(shí)際應(yīng)用中,您可能需要調(diào)整 GMM 模型的參數(shù),如權(quán)重、協(xié)方差矩陣等。
Fuzzy C-Means
背景介紹
Fuzzy C-Means (FCM) 是一種用于數(shù)據(jù)聚類的算法,由 Bezdek 在 1981 年提出。與傳統(tǒng)的硬聚類算法(如 K-means)不同,F(xiàn)CM 允許一個樣本可以同時屬于多個類別,即所謂的模糊聚類。這種模糊性使得 FCM 在處理邊界模糊的數(shù)據(jù)時更加有效。
一句話通俗概括原理
FCM 通過調(diào)整樣本到各個類別的隸屬度,尋找一個能夠使樣本之間的差異最小化、類別內(nèi)距離最小化的聚類中心。
算法原理及核心公式
FCM 的核心思想是通過優(yōu)化隸屬度矩陣和聚類中心,使得樣本之間的差異最小化。以下是核心公式:
隸屬度矩陣 (U \in R^{n \times c}),其中 (n) 是樣本數(shù)量,(c) 是聚類數(shù)。(U_{ij}) 表示第 (i) 個樣本屬于第 (j) 個聚類的隸屬度。
聚類中心 (V \in R^{c \times m}),其中 (m) 是特征維度。(V_{jk}) 表示第 (j) 個聚類在第 (k) 個特征上的值。
參數(shù) (m) :稱為模糊指數(shù),控制聚類的緊密度。
核心公式如下:
隸屬度矩陣 (U) 的更新公式:[ U{ij} = \left(\frac{\sum {k=1}^m (V{jk} – V {ik})^{2-m}}{\sum{k=1}^m (V {jk} – V_{ik})^{2-m}}\right)^{\frac{1}{m-1}} ]
聚類中心 (V) 的更新公式:[ V{jk} = \frac{\sum {i=1}^n U{ij}^m x_i}{\sum {i=1}^n U_{ij}^m} ]
模型訓(xùn)練過程
初始化隸屬度矩陣 (U) 和聚類中心 (V)。
使用上述公式更新 (U) 和 (V)。
重復(fù)步驟 2,直到滿足停止條件(如迭代次數(shù)或目標(biāo)函數(shù)變化小于閾值)。
模型調(diào)優(yōu)經(jīng)驗(yàn)
選擇合適的聚類數(shù) (c)。
選擇合適的模糊指數(shù) (m),通常在 1.5 到 2.5 之間。
迭代次數(shù)或目標(biāo)函數(shù)變化閾值。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
能夠處理模糊聚類問題。
對噪聲和異常值有較好的魯棒性。
缺點(diǎn) :
對于聚類數(shù) (c) 的選擇敏感。
需要確定模糊指數(shù) (m)。
應(yīng)用場景
Python 示例代碼
import numpy as np
from sklearn.cluster import FuzzyCMeans
# 假設(shè)X是數(shù)據(jù)集,c是聚類數(shù),m是模糊指數(shù)
X = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
c = 2
m = 2.5
fcm = FuzzyCMeans(n_clusters=c, init='cmeans++', max_iter=100, m=m)
fcm.fit(X)
# 輸出聚類結(jié)果
labels = fcm.labels_
centers = fcm.cluster_centers_
以上是對 Fuzzy C-Means 算法的詳細(xì)介紹,希望對初學(xué)者有所幫助。
Mean-Shift Clustering
背景介紹
Mean-Shift Clustering 是一種基于密度度的聚類算法,主要用于數(shù)據(jù)挖掘和圖像分析領(lǐng)域。它通過迭代移動聚類中心到高密度區(qū)域,從而將相似的數(shù)據(jù)點(diǎn)聚在一起。
一句話通俗概括原理
Mean-Shift Clustering 算法就像一個移動的“平均器”,它會不斷移動到數(shù)據(jù)集中密度最高的地方,直到?jīng)]有更多的移動空間。
算法原理及核心公式
核心思想 :將聚類中心移動到鄰域內(nèi)具有最高密度的位置。
核心公式 :[ \text{new_center} = \frac{\sum{i \in \text{neighborhood}} \text{data}[i]}{\sum {i \in \text{neighborhood}} w(i)} ]其中,neighborhood
是聚類中心當(dāng)前鄰域,w(i)
是基于高斯核的權(quán)重函數(shù)。
模型訓(xùn)練過程
初始化聚類中心。
對每個聚類中心,計算其鄰域內(nèi)所有點(diǎn)的加權(quán)平均。
將聚類中心移動到新的位置。
重復(fù)步驟 2 和 3,直到聚類中心不再移動或達(dá)到預(yù)設(shè)的迭代次數(shù)。
模型調(diào)優(yōu)經(jīng)驗(yàn)
鄰域大小 :鄰域大小對聚類結(jié)果影響很大。通常,鄰域大小需要根據(jù)數(shù)據(jù)集的特性進(jìn)行調(diào)整。
帶寬 :帶寬決定了高斯核的形狀。較小的帶寬會導(dǎo)致更緊密的聚類,而較大的帶寬會導(dǎo)致更松散的聚類。
初始化聚類中心 :聚類中心的初始化方法對聚類結(jié)果有較大影響。可以采用隨機(jī)初始化或基于某種分布的初始化。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
對噪聲數(shù)據(jù)魯棒性強(qiáng)。
對數(shù)據(jù)分布沒有嚴(yán)格的假設(shè)。
可以處理高維數(shù)據(jù)。
缺點(diǎn) :
計算量大,特別是對于大數(shù)據(jù)集。
鄰域大小和帶寬的選擇對聚類結(jié)果有較大影響。
應(yīng)用場景
圖像分割。
時間序列分析。
文本聚類。
Python 示例代碼
import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth
# 生成一些示例數(shù)據(jù)
data = np.random.rand(100, 2)
# 估計帶寬
bandwidth = estimate_bandwidth(data, quantile=0.3, n_samples=data.shape[0])
# 創(chuàng)建MeanShift聚類器
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
# 擬合數(shù)據(jù)
ms.fit(data)
# 獲取聚類標(biāo)簽
labels = ms.labels_
# 獲取聚類中心
centers = ms.cluster_centers_
以上代碼演示了如何使用sklearn
庫中的MeanShift
函數(shù)對數(shù)據(jù)進(jìn)行聚類。注意,這里使用了estimate_bandwidth
函數(shù)來自動估計帶寬,你也可以手動設(shè)置帶寬。
Spectral Clustering
背景介紹
Spectral Clustering 是一種基于圖論和譜分解的聚類算法。它起源于圖像處理領(lǐng)域,后來被廣泛應(yīng)用于數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)等多個領(lǐng)域。該算法的基本思想是通過將數(shù)據(jù)點(diǎn)視為圖上的節(jié)點(diǎn),通過構(gòu)建相似度矩陣,然后將相似度矩陣進(jìn)行譜分解,最后根據(jù)分解得到的特征向量進(jìn)行聚類。
一句話通俗概括原理
Spectral Clustering 通過將數(shù)據(jù)映射到一個低維空間,然后在這個空間中根據(jù)數(shù)據(jù)的相似性進(jìn)行聚類。
算法原理及核心公式
相似度矩陣構(gòu)建 :首先,根據(jù)數(shù)據(jù)點(diǎn)之間的相似度構(gòu)建一個相似度矩陣 ( W )。如果 ( W{ij} ) 表示第 ( i ) 個點(diǎn)和第 ( j ) 個點(diǎn)的相似度,則 ( W {ij} ) 的取值范圍通常在 0 到 1 之間。
歸一化 :對相似度矩陣進(jìn)行歸一化處理,得到歸一化矩陣 ( D ),其中 ( D{ii} = 0 ),( D {ij} = \frac{1}{\sqrt{D{ii} + D {jj}}} )。
拉普拉斯矩陣構(gòu)建 :構(gòu)建拉普拉斯矩陣 ( L = D – W )。
譜分解 :對拉普拉斯矩陣進(jìn)行譜分解,得到特征值和特征向量。( L = UDU^T ),其中 ( D ) 是對角矩陣,( U ) 是特征向量矩陣。
聚類 :根據(jù)特征向量進(jìn)行聚類。通常取前 ( k ) 個最大的特征值對應(yīng)的特征向量,然后將這些向量進(jìn)行降維,最后根據(jù)這些降維后的向量進(jìn)行 K-means 聚類。
模型訓(xùn)練過程
構(gòu)建相似度矩陣。
歸一化相似度矩陣。
構(gòu)建拉普拉斯矩陣。
進(jìn)行譜分解。
根據(jù)特征向量進(jìn)行聚類。
模型調(diào)優(yōu)經(jīng)驗(yàn)
相似度度量 :選擇合適的相似度度量方法,如余弦相似度、高斯核等。
鄰域大小 :根據(jù)數(shù)據(jù)的分布調(diào)整鄰域大小。
特征選擇 :根據(jù)領(lǐng)域知識或?qū)嶒?yàn)結(jié)果選擇合適的特征向量數(shù)量。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
對于非凸數(shù)據(jù)集也能有效聚類。
對初始聚類中心的選擇不敏感。
缺點(diǎn) :
需要事先指定聚類數(shù)量 ( k )。
對噪聲數(shù)據(jù)敏感。
應(yīng)用場景
圖像分割
文本聚類
生物信息學(xué)中的基因表達(dá)數(shù)據(jù)分析
Python 示例代碼
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import SpectralClustering
from sklearn.preprocessing import StandardScaler
# 生成示例數(shù)據(jù)
np.random.seed(42)
X = np.random.rand(100, 2)
X[0:10, 0] += 1
X[20:30, 1] += 1
X[40:50, 0] -= 2
X[60:70, 1] -= 1
# 歸一化數(shù)據(jù)
X = StandardScaler().fit_transform(X)
# 譜聚類
sc = SpectralClustering(n_clusters=4, affinity='nearest_neighbors', random_state=42)
sc.fit(X)
# 繪制聚類結(jié)果
plt.scatter(X[:, 0], X[:, 1], c=sc.labels_)
plt.title('Spectral Clustering')
plt.show()
這段代碼使用sklearn
庫中的SpectralClustering
類進(jìn)行譜聚類,并使用StandardScaler
對數(shù)據(jù)進(jìn)行歸一化處理。最后,使用matplotlib
繪制聚類結(jié)果。
Agglomerative Clustering
背景介紹
聚類算法是數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)領(lǐng)域的重要方法之一,旨在將相似的數(shù)據(jù)點(diǎn)歸為一組。Agglomerative Clustering(層次聚類)是一種自底向上的聚類算法,通過合并相似度高的數(shù)據(jù)點(diǎn),逐步形成樹狀結(jié)構(gòu)(稱為聚類樹或 Dendrogram)。
一句話通俗概括原理
層次聚類就像將相似的小球逐漸合并成更大的球,最終形成一個大球團(tuán)。
算法原理及核心公式
原理 :從每個數(shù)據(jù)點(diǎn)開始,逐步合并距離最近的數(shù)據(jù)點(diǎn),直到達(dá)到設(shè)定的聚類數(shù)。
核心公式 :
初始時,每個數(shù)據(jù)點(diǎn)都是一個單獨(dú)的簇。
計算所有簇之間的距離,選擇最近的兩個簇合并成一個簇。
重復(fù)步驟 2,直到達(dá)到設(shè)定的聚類數(shù)。
模型訓(xùn)練過程
初始化:每個數(shù)據(jù)點(diǎn)為一個簇。
計算距離:計算當(dāng)前簇之間的距離。
合并簇:選擇距離最近的兩個簇合并成一個簇。
重復(fù)步驟 2 和 3,直到達(dá)到設(shè)定的聚類數(shù)。
模型調(diào)優(yōu)經(jīng)驗(yàn)
聚類數(shù)的選擇:可以通過觀察 Dendrogram 來確定合適的聚類數(shù)。
距離度量:可以選擇不同的距離度量方法,如歐氏距離、曼哈頓距離等。
聚類方法:可以選擇不同的聚類方法,如單鏈接、完全鏈接、平均鏈接等。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
不需要預(yù)先指定聚類數(shù)。
可以直觀地通過 Dendrogram 觀察聚類過程。
缺點(diǎn) :
計算復(fù)雜度較高。
對噪聲數(shù)據(jù)敏感。
應(yīng)用場景
市場細(xì)分。
社交網(wǎng)絡(luò)分析。
文本聚類。
Python 示例代碼
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 生成示例數(shù)據(jù)
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
# 計算距離
Z = linkage(data, 'ward')
# 繪制Dendrogram
dendrogram(Z)
plt.show()
在這個示例中,我們首先生成了一個包含三個簇的數(shù)據(jù)集,然后使用 Ward 方法進(jìn)行層次聚類,并繪制了 Dendrogram。
MiniBatch K-Means
背景介紹
K-Means 聚類算法是一種經(jīng)典的聚類算法,它通過將數(shù)據(jù)集劃分成 K 個簇來發(fā)現(xiàn)數(shù)據(jù)中的隱含結(jié)構(gòu)。MiniBatch K-Means 是 K-Means 的一個變種,它在每次迭代時只使用一小部分?jǐn)?shù)據(jù)(稱為 mini-batch)來更新簇中心,從而提高算法的效率。
一句話通俗概括原理
MiniBatch K-Means 算法 通過不斷迭代優(yōu)化簇中心,將數(shù)據(jù)劃分成 K 個簇,使得每個簇內(nèi)的數(shù)據(jù)點(diǎn)彼此相似,而簇與簇之間的數(shù)據(jù)點(diǎn)彼此不同。
算法原理及核心公式
初始化 :隨機(jī)選擇 K 個數(shù)據(jù)點(diǎn)作為初始簇中心。
分配簇 :將每個數(shù)據(jù)點(diǎn)分配到最近的簇中心。
更新簇中心 :計算每個簇內(nèi)所有數(shù)據(jù)點(diǎn)的均值,作為新的簇中心。
重復(fù)步驟 2 和 3 ,直到簇中心不再顯著變化。
核心公式:
簇中心更新:c_new = (1/n) * Σ(x_i)
其中,c_new 是新的簇中心,x_i 是簇內(nèi)的數(shù)據(jù)點(diǎn),n 是簇內(nèi)數(shù)據(jù)點(diǎn)的數(shù)量。
模型訓(xùn)練過程
初始化簇中心。
將數(shù)據(jù)點(diǎn)分配到最近的簇中心。
更新簇中心。
重復(fù)步驟 2 和 3,直到收斂。
模型調(diào)優(yōu)經(jīng)驗(yàn)
選擇合適的 K 值:可以使用肘部法則或輪廓系數(shù)來確定最佳 K 值。
使用較大的 mini-batch 大小:可以提高算法的穩(wěn)定性,但過大的 mini-batch 大小可能導(dǎo)致過擬合。
調(diào)整學(xué)習(xí)率:適當(dāng)?shù)恼{(diào)整學(xué)習(xí)率可以提高算法的收斂速度。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
簡單易實(shí)現(xiàn),計算效率高。
對噪聲和異常值不敏感。
缺點(diǎn) :
對 K 值的選擇敏感。
可能陷入局部最優(yōu)解。
應(yīng)用場景
數(shù)據(jù)挖掘:如客戶細(xì)分、文本聚類等。
圖像處理:如圖像分割、目標(biāo)檢測等。
Python 示例代碼
import numpy as np
def kmeans(data, k):
# 初始化簇中心
centroids = data[np.random.choice(data.shape[0], k, replace=False)]
# 訓(xùn)練模型
for _ in range(100):
# 分配簇
clusters = []
for i in range(k):
cluster = []
for j in range(data.shape[0]):
if np.linalg.norm(data[j] - centroids[i]) < np.linalg.norm(data[j] - centroids[(i+1)%k]):
cluster.append(j)
clusters.append(cluster)
# 更新簇中心
new_centroids = []
for i in range(k):
new_centroids.append(np.mean(data[clusters[i]], axis=0))
centroids = np.array(new_centroids)
return centroids
# 示例數(shù)據(jù)
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
# 訓(xùn)練模型
k = 2
centroids = kmeans(data, k)
# 打印結(jié)果
print("簇中心:", centroids)
這個示例代碼使用了簡單的 K-Means 算法 ,將數(shù)據(jù)劃分為 2 個簇。在實(shí)際應(yīng)用中,您可能需要根據(jù)具體問題調(diào)整算法參數(shù)和實(shí)現(xiàn)細(xì)節(jié)。
DBSCAN variants
背景介紹
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法,它通過分析數(shù)據(jù)點(diǎn)之間的密度關(guān)系來進(jìn)行聚類。DBSCAN 變種是在 DBSCAN 基礎(chǔ)上進(jìn)行改進(jìn)的算法,以解決其在處理高維數(shù)據(jù)和噪聲數(shù)據(jù)時的局限性。
一句話通俗概括原理
DBSCAN 通過尋找密度較高的區(qū)域來識別聚類,將低密度區(qū)域視為噪聲。
算法原理及核心公式
原理
核心點(diǎn) :如果一個點(diǎn)周圍存在足夠多的點(diǎn)(至少為 MinPts),則該點(diǎn)為核心點(diǎn)。
鄰域 :以核心點(diǎn)為中心,以 ε 為半徑的球體內(nèi)包含的點(diǎn)集合為鄰域。
聚類 :連接核心點(diǎn)形成聚類。
核心公式
MinPts :最小鄰域點(diǎn)數(shù)。
ε :鄰域半徑。
模型訓(xùn)練過程
初始化 :設(shè)置 MinPts 和 ε。
遍歷數(shù)據(jù)點(diǎn) :
– 如果是核心點(diǎn),則創(chuàng)建新的聚類。
如果不是核心點(diǎn),則將其歸入最近的核心點(diǎn)所屬的聚類。
處理噪聲點(diǎn) :將沒有歸入任何聚類的點(diǎn)視為噪聲。
模型調(diào)優(yōu)經(jīng)驗(yàn)
MinPts :根據(jù)數(shù)據(jù)集的特點(diǎn)進(jìn)行調(diào)整,通常從較小的數(shù)值開始,逐漸增加。
ε :根據(jù)數(shù)據(jù)集的維度和分布進(jìn)行調(diào)整,可以使用肘部法則進(jìn)行選擇。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
對噪聲和異常值不敏感。
可以發(fā)現(xiàn)任意形狀的聚類。
不需要預(yù)先指定聚類數(shù)量。
缺點(diǎn)
調(diào)參較為復(fù)雜。
在高維數(shù)據(jù)上性能可能下降。
應(yīng)用場景
數(shù)據(jù)挖掘:識別數(shù)據(jù)集中的異常值和聚類。
機(jī)器學(xué)習(xí) :特征選擇和降維。
圖像處理:圖像分割和目標(biāo)檢測。
Python 示例代碼
from sklearn.cluster import DBSCAN
import numpy as np
# 創(chuàng)建示例數(shù)據(jù)
data = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
# 創(chuàng)建DBSCAN對象
dbscan = DBSCAN(eps=0.3, min_samples=2)
# 模型訓(xùn)練
dbscan.fit(data)
# 輸出聚類結(jié)果
print("Cluster labels:", dbscan.labels_)
文章轉(zhuǎn)自微信公眾號@算法進(jìn)階
我們有何不同?
API服務(wù)商零注冊
多API并行試用
數(shù)據(jù)驅(qū)動選型,提升決策效率
查看全部API→