【scikit-learn基础】--『监督学习』之 谱聚类
譜聚類(lèi)算法基于圖論,它的起源可以追溯到早期的圖分割文獻(xiàn)。
不過(guò),直至近年來(lái),受益于計(jì)算機(jī)計(jì)算能力的提升,譜聚類(lèi)算法才得到了廣泛的研究和關(guān)注。
譜聚類(lèi)被廣泛應(yīng)用于圖像分割、社交網(wǎng)絡(luò)分析、推薦系統(tǒng)、文本聚類(lèi)等領(lǐng)域。
例如,在圖像分割中,譜聚類(lèi)可以有效地將圖像劃分為背景和前景;
在社交網(wǎng)絡(luò)分析中,它可以識(shí)別出不同的社區(qū)結(jié)構(gòu)。
1. 算法概述
譜聚類(lèi)的基本原理是將數(shù)據(jù)點(diǎn)視為圖中的頂點(diǎn),根據(jù)數(shù)據(jù)點(diǎn)之間的相似性構(gòu)建圖的邊。
它首先計(jì)算圖的拉普拉斯矩陣的特征向量,然后利用這些特征向量進(jìn)行聚類(lèi)。
這種方法能夠捕捉到數(shù)據(jù)的非線性結(jié)構(gòu),因此在許多應(yīng)用中表現(xiàn)優(yōu)異。
所謂拉普拉斯矩陣,是一種用于表示一個(gè)圖的矩陣形式。
對(duì)于給定的一個(gè)有\(n\)個(gè)頂點(diǎn)的圖\(G\),它的拉普拉斯矩陣定義為\(L=D-A\)。
其中\(D\)為圖的度矩陣,\(A\)為圖的鄰接矩陣。
2. 創(chuàng)建樣本數(shù)據(jù)
為驗(yàn)證譜聚類(lèi)的效果,用scikit-learn中的樣本生成器創(chuàng)建2個(gè)非線性結(jié)構(gòu)的數(shù)據(jù)集。
from sklearn.datasets import make_moons, make_circles
fig, axes = plt.subplots(nrows=1, ncols=2)
fig.set_size_inches((8, 4))
X_moon, y_moon = make_moons(noise=0.05, n_samples=1000)
axes[0].scatter(X_moon[:, 0], X_moon[:, 1], marker="o", c=y_moon, s=25, cmap=plt.cm.spring)
X_circle, y_circle = make_circles(noise=0.05, factor=0.5, n_samples=1000)
axes[1].scatter(X_circle[:, 0], X_circle[:, 1], marker="o", c=y_circle, s=25, cmap=plt.cm.winter)
plt.show()
一個(gè)交錯(cuò)的月牙形式,一個(gè)是同心圓形式,都是很難線性分割的數(shù)據(jù)集。
3. 模型訓(xùn)練
首先,用默認(rèn)的參數(shù)訓(xùn)練看看效果:
from sklearn.cluster import SpectralClustering
# 定義
regs = [
SpectralClustering(n_clusters=2),
SpectralClustering(n_clusters=2),
]
# 訓(xùn)練模型
regs[0].fit(X_moon, y_moon)
regs[1].fit(X_circle, y_circle)
fig, axes = plt.subplots(nrows=1, ncols=2)
fig.set_size_inches((8, 4))
# 繪制聚類(lèi)之后的結(jié)果
axes[0].scatter(
X_moon[:, 0], X_moon[:, 1], marker="o", c=regs[0].labels_, s=25, cmap=plt.cm.spring
)
axes[1].scatter(
X_circle[:, 0], X_circle[:, 1], marker="o", c=regs[1].labels_, s=25, cmap=plt.cm.winter
)
plt.show()
從圖中可以看出,聚類(lèi)的效果不是很好,從顏色上看,與原始數(shù)據(jù)的類(lèi)別相比差距較大。
接下來(lái),調(diào)整下SpectralClustering模型的affinity參數(shù),
這個(gè)參數(shù)的作用是定義數(shù)據(jù)點(diǎn)之間的相似度矩陣的計(jì)算方法。affinity參數(shù)的可選值常用的有兩個(gè):
- nearest_neighbors:通過(guò)計(jì)算最近鄰圖來(lái)構(gòu)建親和矩陣
- rbf:使用徑向基函數(shù) (RBF) 內(nèi)核構(gòu)建親和矩陣。
默認(rèn)的值是 rbf,下面我們?cè)囋?code>nearest_neighbors方式的聚類(lèi)效果。
將上面的代碼中 regs 的定義部分換成如下代碼:
regs = [
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
]
修改參數(shù)之后的聚類(lèi)效果與原始數(shù)據(jù)就非常接近了。
4. 總結(jié)
簡(jiǎn)而言之,譜聚類(lèi)是一個(gè)在圖上進(jìn)行聚類(lèi)的方法,它試圖找到圖的最佳切割,使得同一簇內(nèi)的邊的權(quán)重盡可能大,而不同簇之間的邊的權(quán)重盡可能小。
這種聚類(lèi)算法的優(yōu)勢(shì)有:
- 可以捕獲數(shù)據(jù)的非線性結(jié)構(gòu)
- 對(duì)噪聲和異常值相對(duì)魯棒
- 不需要明確的形狀假設(shè),適用于各種形狀的簇
它的局限性有:
- 計(jì)算復(fù)雜度相對(duì)較高,尤其是對(duì)于大規(guī)模數(shù)據(jù)
- 需要提前確定簇的數(shù)量,這在很多實(shí)際應(yīng)用中是一個(gè)挑戰(zhàn)
- 對(duì)于高維數(shù)據(jù),可能存在“維度詛咒”問(wèn)題,盡管可以通過(guò)降維緩解,但增加了計(jì)算復(fù)雜度
總結(jié)
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 谱聚类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql和redis库存扣减和优化
- 下一篇: STM32CubeMX教程17 DAC