DBSCAN也是一个非常有用的聚类算法。
DBSCAN的原理是识别特征空间的“拥挤”区域中的点,在这些区域中许多数据点靠近在一起。这些区域被称为特征空间中的密集区域。
在密集区域内的点被称为核心样本(或核心点),它们的定义如下。
一共有三种类型的点:核心点,与核心点的距离在eps之内的点(叫做边界点)和噪声。
X, y = make_blobs(random_state=0,n_samples=12)
dbscan = DBSCAN()
clusters = dbscan.fit_predict(X)
print("Cluster memberships:\n{}".format(clusters))
输出:
Cluster memberships:
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
因为eps和min_samples设置不当,所有的数据都被标记为噪声
可视化
mglearn.plots.plot_dbscan()
虽然DBSCAN不需要显式地设置簇的个数,但设置eps可以隐式地控制找到的簇的个数。使用StandardScaler或MinMaxScaler对数据进行缩放之后,有时会更容易找到eps的较好取值,因为使用这些缩放技术将确保所有特征具有相似的范围.
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
from matplotlib import pyplot as plt
X, y = make_moons(n_samples=200,noise=0.05,random_state=0)
#将数据缩放成平均值为0,方差为1
scaler = StandardScaler().fit(X)
X_scaled = scaler.transform(X)
dbscan = DBSCAN()
clusters = dbscan.fit_predict(X_scaled)
#绘制簇分配
plt.scatter(X_scaled[:,0],X_scaled[:,1],c=clusters,cmap=mglearn.cm2,s=60)
可以看到,利用DBSCAN的默认设置,算法找到了两个半圆形并将其分开。
由于算法找到了我们想要的簇的个数(2个),因此参数设置的效果很好。
《python机器学习基础教程》P143-P147