引入
密度峰聚类思想简单,以一个小故事作为示例讲解:
从前有一个恶霸村,村里的人无论谁都想拥有自己的势力范围,为了公平起见,众人定了这样一个规矩:所有的人在村里按照自己的意愿扎堆,在以自身为中心的一定范围内,当然大家的标准是一样的,谁临近的人越多,谁就最有可能成为恶霸头子。
这时张三说,“方圆一百米内,俺周围有一百个人”。
李四不服,大怒道:“俺有一百零一!” 重相角逐之下,狗蛋的范围内共有两百人,当之无愧的扛把子。但是,他的妹妹,漂亮狗蛋实力相当,怎么办呢?不伤兄妹和气,猜拳吧,于是类似的情况出现时,大家均纷纷效仿。
最终,形成了以漂亮狗蛋为核心的恶霸集团。
久而久之,随着时间的推移,村子壮大,难免出现实力虽不及漂亮狗蛋,但是位于村子偏远踏踏的人,比如赵五。
他寻思着,“这不得行哟,反正他管不着我,不如我自立门户。”如愿以偿的,他实现了自己的小小梦想,与朱八跑了。
刚想跑了,漂亮狗蛋拿着刀放他脖子,“你走得再远,也是咋村里的人!” 这一个感动啊!当然不敢动啊。
“我赵五!”
“我朱八!永远追随大姐脚下。” 至此…
1.基本概念
1.1势力划分依据:dc
恶霸村里的每一个人,对应于数据集中的一个个样本点,在同一标准下,即diameter dc距离或者average dc距离下,可以划分自己的势力,这两种距离的计算公式如下:
d
c
d
i
a
m
e
t
e
r
=
m
a
x
(
∑
i
=
0
i
<
n
−
1
∑
j
=
i
+
1
n
d
i
s
t
a
n
c
e
(
x
i
,
x
j
)
)
×
d
c
r
a
t
i
o
(1-1)
dc_{diameter}=max(\sum_{i=0}^{i<n-1}\sum_{j=i+1}^{n}distance(x_i,x_j))×dc_{ratio}\tag{1-1}
dcdiameter=max(i=0∑i<n−1j=i+1∑ndistance(xi,xj))×dcratio(1-1)
d
c
a
v
e
r
a
g
e
=
a
v
e
r
a
g
e
(
∑
i
=
0
i
<
n
−
1
∑
j
=
i
+
1
n
d
i
s
t
a
n
c
e
(
x
i
,
x
j
)
)
×
d
c
r
a
t
i
o
(1-2)
dc_{average}=average(\sum_{i=0}^{i<n-1}\sum_{j=i+1}^{n}distance(x_i,x_j))×dc_{ratio}\tag{1-2}
dcaverage=average(i=0∑i<n−1j=i+1∑ndistance(xi,xj))×dcratio(1-2) 式中,
n
n
n代表实例总数,即村民总数;
i
i
i、
j
j
j代表循环变量;
d
c
r
a
t
i
o
dc_{ratio}
dcratio代表取值范围百分比,大小为
0
0
0~
1
1
1,一般取0.03左右,但是最终需以实验结果为准。
1.2 势力大小(局部密度): ρ i ρ_i ρi
势力大小
ρ
i
ρ_i
ρi即范围内小弟数量,常用的统计方式如下:
k
e
r
n
e
l
c
u
t
o
f
f
:
ρ
i
=
∑
j
=
0
n
f
(
d
i
s
t
a
n
c
e
(
x
i
,
x
j
)
−
d
c
)
(1-3)
kernel_{cutoff}:ρ_i=\sum_{j=0}^{n}f(distance(xi,xj)-dc)\tag{1-3}
kernelcutoff:ρi=j=0∑nf(distance(xi,xj)−dc)(1-3) 其中
f
(
x
)
=
{
1
,
x
≤
0
0
,
其
他
(1-4)
f(x)= \begin{cases} 1,\quad x\leq 0\\ 0, \quad 其他 \end{cases} \tag{1-4}
f(x)={1,x≤00,其他(1-4) 简单说来:在一定dc范围内,有多少个小弟,该村民的
ρ
i
ρ_i
ρi就是多少。但是不可避免的,会出现两个甚至更多村民具有相同数量的小弟,解决方式有如下:
1)所有的
ρ
i
ρ_i
ρi按从大到小排列之后,即是相同的小弟数量,也会有一定的先后顺序,值得一提的是,
1
−
3
1-3
1−3中统计时把村民自身也算了进去,这是为了避免出现没有小弟的尴尬情况,当然,不计算自身也是可行的。
2)使用高斯核,即如下:
k
e
r
n
e
l
g
a
u
s
s
i
a
n
:
ρ
i
=
∑
j
=
0
n
e
−
(
d
i
s
t
a
n
c
e
(
x
i
,
x
j
)
d
c
)
2
(1-5)
kernel_{gaussian}:ρ_i=\sum_{j=0}^{n}e^{-(\frac{distance(xi,xj)}{dc})^2}\tag{1-5}
kernelgaussian:ρi=j=0∑ne−(dcdistance(xi,xj))2(1-5) 高斯核相较于截断核的好处在于,可以极大避免出现相同小弟的情况,且能保证随着单个村民范围的其他村民数量增加时,也会相应的增大。
1.3 寻找直接上属:master
村子大了起来,漂亮狗蛋也管理不过来。因此需要挑出几个其他的代理boss,挑选的方式如下:
1)漂亮狗蛋无疑是最强的,所以她的直接上属,即master就是她自己,但是如何与其他人区别呢?就令她与她的master的距离为所有村民中距离的最大值。总之就是谁也比不过她;
2)对于每一个人的master,先决条件为其master的
ρ
i
ρ_i
ρi要大于自己,又为了方便管理,满足先决条件同时又离自己最近的那根村民就是其master。由此,一条条从属关系就以漂亮狗蛋展开;
3)村子发展到什么样的规模,就需要找相应数量的代理boss。以总boss数量k举例,如何抉择呢?
ρ
i
ρ_i
ρi与
d
i
s
t
a
n
c
e
(
x
i
,
x
i
−
m
a
s
t
e
r
)
distance(x_i,x_{i-master})
distance(xi,xi−master)的乘积最大的k个村名就是代理boss,其他的村名在按照其master,层层递进就能知道自己的终极master。
2 算法代码
网上的算法有很多,这里给出老师写的Java代码:CSDN。