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