linkage
是scipy
中的一个层次聚类函数,可将距离最近的数聚在一起,形成聚类簇;多个聚类簇再次聚类,得到更高层级的聚类簇。重复这个过程,直到所有的聚类簇都聚成一个最终的类。
其调用方法为
scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False)
其中method
表示聚类方法;metric
表示聚类时采用的距离。在详细介绍这两者的可选参数之前,先对linkage做一个简单示例。
from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
Z = linkage(X, 'single')
print(Z)
Z Z Z的结果如下,是一个二维数组,记 X X X的长度为 n n n,则 Z Z Z尺寸为 ( n ? 1 ) × 4 (n-1)\times4 (n?1)×4。其中 Z i 0 , Z i 1 Z_{i0}, Z_{i1} Zi0?,Zi1?属于第 n + i n+i n+i聚类簇,且二者之间的距离为 Z i 2 Z_{i2} Zi2?, Z i 3 Z_{i3} Zi3?表示对于一个新形成的聚类簇中的元素个数。
i i i | Z i 0 Z_{i0} Zi0? | Z i 1 Z_{i1} Zi1? | Z i 2 Z_{i2} Zi2? | Z i 3 Z_{i3} Zi3? | 类别 |
---|---|---|---|---|---|
0 | 2 | 7 | 0 | 2 | 8 |
1 | 5 | 6 | 0 | 2 | 9 |
2 | 0 | 4 | 1 | 2 | 10 |
3 | 8 | 10 | 1 | 4 | 11 |
4 | 1 | 9 | 1 | 3 | 12 |
5 | 3 | 11 | 2 | 5 | 13 |
6 | 12 | 13 | 4 | 8 | 14 |
Z i 0 , Z i 1 Z_{i0}, Z_{i1} Zi0?,Zi1?中的这些数显然不是从 X X X中抽取得到的,而是 X X X中每个元素的所属类别,映射如下
2 | 8 | 0 | 4 | 1 | 9 | 9 | 0 |
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Z Z Z的第一行表示, 2 2 2和 7 7 7组成一个簇,且 2 , 7 2,7 2,7之间距离为0,根据上表, 2 , 7 2,7 2,7对应的是两个 0 0 0,所以二者之间的距离为0。且二者新形成的聚类簇为 n + i = 8 + 0 = 8 n+i=8+0=8 n+i=8+0=8,二者组成的簇共有两个元素。第二、三行与之类似。
第四行表明, 8 8 8和 10 10 10之间距离为1,其中 8 8 8是由 2 , 7 2,7 2,7两个位置的两个 0 0 0组成; 10 10 10由 0 , 4 0,4 0,4两个位置组成的,以此类推。
上面的矩阵可通过dendrogram进行可视化,结果如下
dn = dendrogram(Z)
plt.show()
可选方法及其含义如下
可选距离包括下表
距离函数 | 备注 | 表达式 |
---|---|---|
braycurtis | Bray-Curtis距离 | ∑ ∣ u i ? v i ∣ ∑ ∣ u i + v i ∣ \frac{\sum\vert u_i-v_i\vert}{\sum\vert u_i+v_i\vert} ∑∣ui?+vi?∣∑∣ui??vi?∣? |
canberra | Canberra距离 | ∑ ∣ u i ? v i ∣ ∑ ∣ u i ∣ + ∣ v i ∣ \frac{\sum\vert u_i-v_i\vert}{\sum\vert u_i\vert+\vert v_i\vert} ∑∣ui?∣+∣vi?∣∑∣ui??vi?∣? |
chebyshev | 切比雪夫距离 | max ? ( u ? ? v ? ) \max(\vec u-\vec v) max(u?v) |
minkowski([,p]) | 闵氏距离 | ∥ u ? v ∥ p \Vert u-v\Vert_p ∥u?v∥p? |
cityblock | 曼哈顿距离 | ∑ ∣ u i ? v i ∣ \sum\vert u_i-v_i\vert ∑∣ui??vi?∣ |
euclidean | 欧氏距离 | ∥ u ? v ∥ 2 \Vert u-v\Vert_2 ∥u?v∥2? |
sqeuclidean | 平方欧式距离 | ∑ w i ∣ u i ? v i ∣ 2 \sum w_i\vert u_i-v_i\vert^2 ∑wi?∣ui??vi?∣2 |
cosine | 余弦距离 | 1 ? u ? v ∥ u ∥ 2 ∥ v ∥ 2 1-\frac{u\cdot v}{\Vert u\Vert_2\Vert v\Vert_2} 1?∥u∥2?∥v∥2?u?v? |
correlation | 相关距离 | 1 ? ( u ? u ˉ ) ( v ? v ˉ ) ∥ u ? u ˉ ∥ 2 ∥ v ? v ˉ ∥ 2 1-\frac{(u-\bar u)(v-\bar v)}{\Vert u-\bar u\Vert_2\Vert v-\bar v\Vert_2} 1?∥u?uˉ∥2?∥v?vˉ∥2?(u?uˉ)(v?vˉ)? |
jensenshannon | JS距离 | |
mahalanobis | 马氏距离 | |
seuclidean | 归一化欧式距离 |
距离函数 | 备注 | 表达式 |
---|---|---|
dice | Dice距离 | ∣ 10 ∣ + ∣ 01 ∣ 2 ∣ 11 ∣ + ∣ 01 ∣ + ∣ 10 ∣ \frac{\vert10\vert+\vert01\vert}{2\vert11\vert+\vert01\vert+\vert10\vert} 2∣11∣+∣01∣+∣10∣∣10∣+∣01∣? |
hamming | 汉明距离 | [ 01 ] + [ 10 ] N \frac{[01]+[10]}{N} N[01]+[10]? |
jaccard | 杰卡德距离 | ∣ 10 ∣ + ∣ 01 ∣ ∣ 11 ∣ + ∣ 01 ∣ + ∣ 10 ∣ \frac{\vert10\vert+\vert01\vert}{\vert11\vert+\vert01\vert+\vert10\vert} ∣11∣+∣01∣+∣10∣∣10∣+∣01∣? |
kulczynski1 | Kulczynski距离 | [ 11 ] [ 01 ] + [ 10 ] \frac{[11]}{[01]+[10]} [01]+[10][11]? |
rogerstanimoto | 谷本距离 | R [ 11 ] + [ 00 ] + R \frac{R}{[11]+[00]+R} [11]+[00]+RR? |
russellrao | Russell&Rao距离 | N ? [ 11 ] N \frac{N-[11]}{N} NN?[11]? |
sokalmichener | Sokal-Michener距离 | R R + [ 11 ] + [ 00 ] \frac{R}{R+[11]+[00]} R+[11]+[00]R? |
sokalsneath | Sokal-Sneath距离 | R [ 11 ] + [ 00 ] + R \frac{R}{[11]+[00]+R} [11]+[00]+RR? |
yule | Yule距离 | 2 [ 01 ] ? [ 10 ] [ 11 ] ? [ 00 ] + [ 10 ] ? [ 01 ] \frac{2[01]\cdot[10]}{[11]\cdot[00]+[10]\cdot[01]} [11]?[00]+[10]?[01]2[01]?[10]? |
可用方法method
,主要是针对距离的聚类算法,下面记D
为距离值,d
为采用的方法
signle
d
(
u
,
v
)
=
min
?
(
D
(
u
i
,
v
j
)
)
d(u,v)=\min(D(u_i,v_j))
d(u,v)=min(D(ui?,vj?))complete
d
(
u
,
v
)
=
max
?
(
D
(
u
i
,
v
j
)
)
d(u,v)=\max(D(u_i,v_j))
d(u,v)=max(D(ui?,vj?))average
d
(
u
,
v
)
=
∑
i
,
j
D
(
u
i
,
v
j
)
d(u,v)=\sum_{i,j}\frac{D(u_i,v_j)}{}
d(u,v)=∑i,j?D(ui?,vj?)?weighted
d
(
u
,
v
)
=
d
(
s
,
v
)
+
d
(
t
,
v
)
2
d(u,v)=\frac{d(s,v)+d(t,v)}{2}
d(u,v)=2d(s,v)+d(t,v)?centroid
d
(
s
,
t
)
=
∥
c
s
?
c
t
∥
2
d(s,t)=\Vert c_s-c_t\Vert_2
d(s,t)=∥cs??ct?∥2?