【scikit-learn基础】--『监督学习』之 谱聚类
譜聚類算法基于圖論,它的起源可以追溯到早期的圖分割文獻。
不過,直至近年來,受益于計算機計算能力的提升,譜聚類算法才得到了廣泛的研究和關注。
譜聚類被廣泛應用于圖像分割、社交網絡分析、推薦系統、文本聚類等領域。
例如,在圖像分割中,譜聚類可以有效地將圖像劃分為背景和前景;
在社交網絡分析中,它可以識別出不同的社區結構。
1. 算法概述
譜聚類的基本原理是將數據點視為圖中的頂點,根據數據點之間的相似性構建圖的邊。
它首先計算圖的拉普拉斯矩陣的特征向量,然后利用這些特征向量進行聚類。
這種方法能夠捕捉到數據的非線性結構,因此在許多應用中表現優異。
所謂拉普拉斯矩陣,是一種用于表示一個圖的矩陣形式。
對于給定的一個有\(n\)個頂點的圖\(G\),它的拉普拉斯矩陣定義為\(L=D-A\)。
其中\(D\)為圖的度矩陣,\(A\)為圖的鄰接矩陣。
2. 創建樣本數據
為驗證譜聚類的效果,用scikit-learn中的樣本生成器創建2個非線性結構的數據集。
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()
一個交錯的月牙形式,一個是同心圓形式,都是很難線性分割的數據集。
3. 模型訓練
首先,用默認的參數訓練看看效果:
from sklearn.cluster import SpectralClustering
# 定義
regs = [
SpectralClustering(n_clusters=2),
SpectralClustering(n_clusters=2),
]
# 訓練模型
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))
# 繪制聚類之后的結果
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()
從圖中可以看出,聚類的效果不是很好,從顏色上看,與原始數據的類別相比差距較大。
接下來,調整下SpectralClustering模型的affinity參數,
這個參數的作用是定義數據點之間的相似度矩陣的計算方法。affinity參數的可選值常用的有兩個:
- nearest_neighbors:通過計算最近鄰圖來構建親和矩陣
- rbf:使用徑向基函數 (RBF) 內核構建親和矩陣。
默認的值是 rbf,下面我們試試nearest_neighbors方式的聚類效果。
將上面的代碼中 regs 的定義部分換成如下代碼:
regs = [
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
SpectralClustering(n_clusters=2, affinity="nearest_neighbors"),
]
修改參數之后的聚類效果與原始數據就非常接近了。
4. 總結
簡而言之,譜聚類是一個在圖上進行聚類的方法,它試圖找到圖的最佳切割,使得同一簇內的邊的權重盡可能大,而不同簇之間的邊的權重盡可能小。
這種聚類算法的優勢有:
- 可以捕獲數據的非線性結構
- 對噪聲和異常值相對魯棒
- 不需要明確的形狀假設,適用于各種形狀的簇
它的局限性有:
- 計算復雜度相對較高,尤其是對于大規模數據
- 需要提前確定簇的數量,這在很多實際應用中是一個挑戰
- 對于高維數據,可能存在“維度詛咒”問題,盡管可以通過降維緩解,但增加了計算復雜度
總結
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 谱聚类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql和redis库存扣减和优化
- 下一篇: requestmapping配置页面后_