scipy.cluster.hierarchy.linkage

scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False)[源代码]

执行分层/聚集群集。

输入y可以是一维浓缩距离矩阵或观察向量的二维阵列。

如果y是一维凝聚距离矩阵,则y一定是 \(\binom{{n}}{{2}}\) 调整大小的向量,其中n是距离矩阵中成对的原始观测值的数量。此函数的行为与MATLAB链接函数非常相似。

A \((n-1)\) 乘以4矩阵 Z 返回。在 \(i\) -第4次迭代,带索引的群集 Z[i, 0]Z[i, 1] 组合成簇 \(n + i\) 。索引小于 \(n\) 对应于 \(n\) 原始的观察结果。群集之间的距离 Z[i, 0]Z[i, 1] 由以下人员提供 Z[i, 2] 。第四个值 Z[i, 3] 表示新形成的簇中的原始观测值的数量。

以下链接方法用于计算距离 \(d(s, t)\) 在两个群集之间 \(s\)\(t\) 。该算法以尚未在层级结构中使用的簇林开始。当两个群集 \(s\)\(t\) 从这个林中组合成一个单独的集群 \(u\)\(s\)\(t\) 从森林中被移走,而且 \(u\) 被添加到森林中。当林中只剩下一个群集时,算法将停止,此群集将成为根。

在每次迭代中维护距离矩阵。这个 d[i,j] 条目对应于群集之间的距离 \(i\)\(j\) 在原始森林里。

在每次迭代中,该算法必须更新距离矩阵以反映新形成的群集u与林中剩余群集的距离。

假设有 \(|u|\) 原始观测 \(u[0], \ldots, u[|u|-1]\) 在群集中 \(u\)\(|v|\) 原始对象 \(v[0], \ldots, v[|v|-1]\) 在群集中 \(v\) 。回想一下, \(s\)\(t\) 组合成簇 \(u\) 。让我们 \(v\) 是林中不是的任何剩余群集 \(u\)

以下是计算新形成的群集之间距离的方法 \(u\) 而且每个人 \(v\)

  • method=‘Single’赋值

    \[D(u,v)=\min(距离(u [i] ,v [j] ))\]

    对于所有积分 \(i\) 在群集中 \(u\)\(j\) 在群集中 \(v\) 。这也称为最近点算法。

  • method=‘Complete’赋值

    \[D(u,v)=\max(距离(u [i] ,v [j] ))\]

    对于所有积分 \(i\) 在群集u中,并且 \(j\) 在群集中 \(v\) 。这也被称为最远点算法或Voor Hees算法。

  • method=‘Average’赋值

    \[d(u,v)=\sum_{ij}\frac{d(u [i] ,v [j] )} {( |u| * |v| )}\]

    对于所有积分 \(i\)\(j\) 哪里 \(|u|\)\(|v|\) 是簇的基数吗? \(u\)\(v\) ,分别为。这也称为UPGMA算法。

  • method=‘加权’赋值

    \[D(u,v)=(dist(s,v)+dist(t,v))/2\]

    其中群集u与群集s和t形成,并且v是林中剩余的群集(也称为WPGMA)。

  • method=‘centroid’赋值

    \[距离(s,t)= ||c_s-c_t||_ 2\]

    哪里 \(c_s\)\(c_t\) 是星团的质心 \(s\)\(t\) ,分别为。当两个群集 \(s\)\(t\) 组合成一个新的群集 \(u\) ,则对群集中的所有原始对象计算新质心 \(s\)\(t\) 。然后,该距离就变成了…的质心之间的欧几里得距离。 \(u\) 以及剩余群集的质心 \(v\) 在森林里。这也称为UPGMC算法。

  • method=‘Medium’赋值 \(d(s,t)\) 就像 centroid 方法。当两个群集 \(s\)\(t\) 组合成一个新的群集 \(u\) ,质心的平均值s和t给出新的质心。 \(u\) 。这也称为WPGMC算法。

  • method=‘ward’使用Ward方差最小化算法。新条目 \(d(u,v)\) 按如下方式计算,

    \[D(u,v)=\sqrt{\frac{ |v| + |s| } {T}d(v,s)^2 +\frac{ |v| + |t| } {T}d(v,t)^2 -\crc{ |v| } {T}d(s,t)^2}\]

    哪里 \(u\) 是由群集组成的新加入的群集 \(s\)\(t\)\(v\) 是森林中的一个未使用的簇, \(T=|v|+|s|+|t|\) ,以及 \(|*|\) 是它的论点的基数。这也称为增量算法。

警告:选择林中的最小距离对时,可能有两个或更多对具有相同的最小距离。此实现可能选择与MATLAB版本不同的最小值。

参数
yndarray

凝聚距离矩阵。压缩距离矩阵是包含距离矩阵的上三角形的平面阵列。这是一张表格,上面写着 pdist 返回。或者,还可以使用 \(m\) 中的观测矢量 \(n\) 维度可以作为 \(m\) 通过 \(n\) 数组。压缩距离矩阵的所有元素必须是有限的,即没有NAN或INF。

method字符串,可选

要使用的链接算法。请参阅 Linkage Methods 有关详细说明,请参阅下面的部分。

metric字符串或函数,可选

在y是观测向量集合的情况下使用的距离度量;否则忽略。请参阅 pdist 函数获取有效距离度量列表。也可以使用自定义距离函数。

optimal_ordering布尔值,可选

如果为True,则链接矩阵将重新排序,以便连续叶之间的距离最小。当数据可视化时,这会产生更直观的树形结构。默认为FALSE,因为此算法可能会很慢,尤其是在大数据集上 [2]. 另请参阅 optimal_leaf_ordering 功能。

1.0.0 新版功能.

退货
Zndarray

该分层聚类被编码为链接矩阵。

参见

scipy.spatial.distance.pdist

成对距离度量

注意事项

  1. 对于“单一”方法,实现了一种基于最小生成树的优化算法。它具有时间复杂性 \(O(n^2)\) 。对于“完全”、“平均”、“加权”和“Ward”方法,实现了最近邻链算法。它还具有时间复杂性。 \(O(n^2)\) 。对于其他方法,用以下方式实现朴素算法 \(O(n^3)\) 时间复杂性。所有算法都使用 \(O(n^2)\) 记忆。请参阅 [1] 有关算法的详细信息。

  2. 只有在使用欧几里得成对度量的情况下,才能正确定义方法“质心”、“中值”和“Ward”。如果 y 如果作为预先计算的成对距离传递,则用户有责任确保这些距离实际上是欧几里得距离,否则产生的结果将是不正确的。

参考文献

1

丹尼尔·穆尔纳,“现代分层凝聚聚类算法”, arXiv:1109.2378v1

2

Ziv Bar-Joseph,David K.Gifford,Tommi S.Jaakkola,“分层聚类的快速最佳叶排序”,2001。生物信息学 DOI:10.1093/bioinformatics/17.suppl_1.S22

示例

>>> 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, 'ward')
>>> fig = plt.figure(figsize=(25, 10))
>>> dn = dendrogram(Z)
>>> Z = linkage(X, 'single')
>>> fig = plt.figure(figsize=(25, 10))
>>> dn = dendrogram(Z)
>>> plt.show()
../../_images/scipy-cluster-hierarchy-linkage-1_00.png
../../_images/scipy-cluster-hierarchy-linkage-1_01.png