【scikit-learn基础】--『监督学习』之 空间聚类
空間聚類算法是數據挖掘和機器學習領域中的一種重要技術。
本篇介紹的基于密度的空間聚類算法的概念可以追溯到1990年代初期。
隨著數據量的增長和數據維度的增加,基于密度的算法逐漸引起了研究者的關注。
其中,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是最具代表性的算法之一。
基于密度的空間聚類算法在許多領域都有應用,例如圖像處理、生物信息學、社交網絡分析等。
在圖像處理中,該算法可以用于檢測圖像中的密集區域,用于識別物體或形狀。
1. 算法概述
DBSCAN算法的基本思想是,對于給定的數據集,基于數據點的密度進行聚類。
在密度高的區域,數據點更為集中,而密度低的區域數據點較為稀疏。
基于密度的算法能夠發現任意形狀的簇,并且對噪聲有較好的魯棒性。
算法的核心在于:
- 定義鄰域:對于數據集中的每個點,其鄰域是由距離該點在一定半徑(通常稱為Eps)內的所有點組成的
- 定義密度:一個點的密度是其鄰域內的點的數量。如果一個點的密度超過某個閾值(通常稱為MinPts),則該點被視為核心點
- 尋找簇:從每個核心點出發,找到所有密度可達的點,即這些點通過一系列核心點可以與該核心點相連,這些點形成一個簇
- 標記噪聲點:不屬于任何簇的點被標記為噪聲點
2. 創建樣本數據
下面,創建三種不同的樣本數據,來測試DBSCAN的聚類效果。
from sklearn.datasets import make_blobs, make_moons, make_circles
fig, axes = plt.subplots(nrows=1, ncols=3)
fig.set_size_inches((9, 3))
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,
)
X_blob, y_blob = make_blobs(n_samples=1000, centers=3)
axes[2].scatter(
X_blob[:, 0],
X_blob[:, 1],
marker="o",
c=y_blob,
s=25,
cmap=plt.cm.autumn,
)
plt.show()
3. 模型訓練
用scikit-learn的DBSCAN模型來訓練,這個模型主要的參數有兩個:
-
eps (eps):這個參數表示鄰域的大小,或者說是鄰域的半徑。具體來說,對于數據集中的每個點,其 eps-鄰域包含了所有與該點的距離小于或等于
eps的點。 - min_samples (minPts):在給定 eps-鄰域內,一個點需要有多少個鄰居才能被視為核心點。
通過調節這2個參數,基于上面創建的樣本數據,訓練效果如下:
from sklearn.cluster import DBSCAN
# 定義
regs = [
DBSCAN(min_samples=2, eps=0.1),
DBSCAN(min_samples=2, eps=0.2),
DBSCAN(min_samples=3, eps=2),
]
# 訓練模型
regs[0].fit(X_moon, y_moon)
regs[1].fit(X_circle, y_circle)
regs[2].fit(X_blob, y_blob)
fig, axes = plt.subplots(nrows=1, ncols=3)
fig.set_size_inches((9, 3))
# 繪制聚類之后的結果
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,
)
axes[2].scatter(
X_blob[:, 0],
X_blob[:, 1],
marker="o",
c=regs[2].labels_,
s=25,
cmap=plt.cm.autumn,
)
plt.show()
針對3種不同的樣本數據,調節參數之后,聚類的效果還不錯。
感興趣的話,可以試試修改上面代碼中的DBSCAN定義部分的參數:
# 定義
regs = [
DBSCAN(min_samples=2, eps=0.1),
DBSCAN(min_samples=2, eps=0.2),
DBSCAN(min_samples=3, eps=2),
]
調節不同的 min_sample和eps,看看不同的聚類效果。
4. 總結
總的來說,基于密度的空間聚類算法是一種強大的工具,能夠從數據中提取有價值的信息。
但是,如同所有的算法一樣,它也有其局限性,需要在合適的應用場景中使用,才能達到最佳的效果。
它的優勢主要在于:
- 能夠發現任意形狀的簇
- 對噪聲和異常值有較好的魯棒性
- 不需要提前知道簇的數量
不足之處則在于:
- 對于高維數據,密度計算可能會變得非常復雜和計算量大
- 算法的性能高度依賴于密度閾值的選擇
- 在處理密度變化較大的數據時可能效果不佳
總結
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 空间聚类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2024-01-20:用go语言,小扣在
- 下一篇: WIN32 动态 UAC 提权