DBSCAN(密度聚类)
什么是聚类
聚类是无监督学习的一个小分支,其本质就是将样本通过亲近程度对其进行分类,你可能会有疑问?分多少类别?亲近程度如何衡量?
分多少类
至于分多少类,有的是自动学习得到,比如DBSCAN等,有的是手动指定,比如K-means等。后续的代码中会有体现
亲近关系的衡量指标
至于用什么来衡量亲近程度?对于有序属性的样本,可以使用闵可夫斯基距离、欧几里得距离、曼哈顿距离来描述,对于无序属性样本,可使用VDM,下面简单介绍一个闵可夫斯基距离。
闵可夫斯基距离公式
d
m
k
(
x
i
,
x
j
)
=
(
∑
u
=
1
n
∣
x
i
u
−
x
j
u
∣
p
)
1
p
d_{mk}(x_{i},x_{j})=\left ( \sum_{u=1}^{n} \left | x_{iu} -x_{ju} \right | ^{p} \right ) ^{\frac{1}{p} }
dmk(xi,xj)=(u=1∑n∣xiu−xju∣p)p1
其中
x
i
x_{i}
xi: 第i个样本;
x
j
x_{j}
xj: 第j个样本;
x
i
u
x_{iu}
xiu: 第i个样本的第u个特征;
x
j
u
x_{ju}
xju: 第j个样本的第u个特征;
当p=2时,就是欧几里得距离公式,当p=1时,就是曼哈顿距离,在实际应用中,通常都是采用欧几里得距离或是曼哈顿距离。
最后再多一点解释,关于什么是无序样本和有序样本,无序样本,其实可以理解为就是不能直接测量出数据的样本,比如一个样本的特征并不能用数字表示{性格,家庭住址,婚否}。有序样本,可以直观理解为特征都是数字,比如以坐标作为一个样本,其中x,y就是其特征,都是数字,有数字自然可以计算距离。
DBSCAN(密度聚类)
DBSCAN是无监督学习的一种算法,利用给定领域和最小领域样本数,最终将样本分为多个类。
与K-means区别
不用像K-means一样,需要给定分类数和迭代次数,而是需要指定两个参数:
(
ϵ
,
M
i
n
P
t
s
)
\left ( \epsilon ,MinPts \right )
(ϵ,MinPts)
分类目的:根据图中所示,可以通俗的说,就是找到一个中心点,在以
ϵ
\epsilon
ϵ为半径画圆,如果在这个圆内的点数至少有MinPts时候,就表示一个类分类完成。否则这个中心点不合格,分割失败,要重新寻找中心点。
算法流程
1.设置
(
ϵ
,
M
i
n
P
t
s
)
\left ( \epsilon ,MinPts \right )
(ϵ,MinPts) 参数
2.遍历样本集,以这个点为中心,如果其他样本有多个与中心的距离小于
ϵ
\epsilon
ϵ,且这样的样本个数不少于MinPts,则这个样本就是第一个中心点,停止遍历。
3.以选出的样本为中心,遍历除此之外的整个样本集合(注意,这里的遍历和第二步的遍历不一样,第二步如果一开始就找到中心点,其实不用完全遍历),找出所有与中心距离小于
ϵ
\epsilon
ϵ的样本,将此归为一类。
4.讲分好类的样本从整体样本集合中减去,然后重复2、3步,直到待分类样本集合为空位置。分类结束。
具体举例
假设待分类样本集合为D=
x
1
、
x
2
、
x
3
、
x
4
、
x
5
、
x
6
、
x
7
、
x
8
、
x
9
、
x
10
、
x
11
、
x
12
x_{1}、x_{2}、x_{3}、x_{4}、x_{5}、x_{6}、x_{7}、x_{8}、x_{9}、x_{10}、x_{11}、x_{12}
x1、x2、x3、x4、x5、x6、x7、x8、x9、x10、x11、x12
1.设定
(
ϵ
,
M
i
n
P
t
s
)
\left ( \epsilon ,MinPts \right )
(ϵ,MinPts)为(0.8,2),表示半径最大为0.8,分类中,每个类最少2个样本。
2.遍历样本集合D,首先取出
x
1
x_{1}
x1,计算与其他样本的距离,判断小于0.8的样本个数是否不少于2,加入满足条件,
x
1
x_{1}
x1就是中心点,停止遍历。
3.遍历样本集合D,以
x
1
x_{1}
x1为中心,假如与
x
6
、
x
4
、
x
10
、
x
12
x_{6}、x_{4}、x_{10}、x_{12}
x6、x4、x10、x12距离小于0.8.则为一类
C
1
C_{1}
C1={
x
1
、
x
6
、
x
4
、
x
10
、
x
12
x_{1}、x_{6}、x_{4}、x_{10}、x_{12}
x1、x6、x4、x10、x12}。
4.将分好类的样本从集合中减去,D=
x
2
、
x
3
、
x
5
、
x
7
、
x
8
、
x
9
、
x
11
x_{2}、x_{3}、x_{5}、x_{7}、x_{8}、x_{9}、x_{11}
x2、x3、x5、x7、x8、x9、x11。重复第2部,找到新的中心点,重复第3步,这样第二个类就分好了,重复2、3步,直到集合D为0.
DBSCAN程序示例代码
import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy.io
from sklearn.cluster import DBSCAN
def loaddata():
data = scipy.io.loadmat('cluster_data.mat')
return data['X']
X = loaddata()
#参数1:就是文中的$\epsilon$
#参数2:就是文中的MinPts
#参数3:亲密度衡量方式,也就是距离计算公式
model = DBSCAN(eps=0.5, min_samples=5, metric='euclidean')
model.fit(X)
print('每个样本所属的簇:',model.labels_)
cm_dark = mpl.colors.ListedColormap(['g','r','b','c'])
plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=cm_dark, s=20)
plt.show()
补充
核心对象:就是我们选出来的中心,满足的要求上面已经介绍过。
密度直达:核心对象与领域内的每个点都是密度直达,可以理解为,在这个圆内的点和中心都是密度直达,其他的不叫密度直达。
密度可达:在同一个领域内的所有点,两个点可以通过中心相连,这样就是密度可达,所以可以理解为,这个圆内除了中心外的两个点都是密度可达。
密度相连:相比于密度可达,区别在于,点之间是在不同领域,不同领域的点可以通过多个领域的核心对象点将其相连,也就是不同园内的点,可以通过圆心最终相连。这就是密度相连。