层次结构
层次聚类算法。
属性 dendrogram_
给出树状图。
树状图是一个大小为 \((n-1) \times 4\) 的数组,表示节点的连续合并。每一行给出两个合并的节点、它们的距离以及合并后的聚类的大小。任何新的节点(合并的结果)都采用第一个可用的索引(例如,第一次合并对应于节点 \(n\))。
巴黎
- class sknetwork.hierarchy.Paris(weights: str = 'degree', reorder: bool = True)
基于节点相似度进行贪婪合并的凝聚聚类算法。
节点 \(i,j\) 之间的相似度为 \(\dfrac{A_{ij}}{w_i w_j}\),其中
\(A_{ij}\) 是边 \(i,j\) 的权重,
\(w_i, w_j\) 是节点 \(i,j\) 的权重。
如果输入矩阵 \(B\) 是二部矩阵(即矩形),则该算法将应用于相应的邻接矩阵 \(A = \begin{bmatrix} 0 & B \\ B^T & 0 \end{bmatrix}\)
- 参数:
weights (str) – 节点的权重。
'degree'
(默认)或'uniform'
。reorder (bool) – 如果为
True
(默认),则按高度非递减顺序重新排序树状图。
- 变量:
dendrogram (np.ndarray) – 图的树状图。
dendrogram_row (np.ndarray) – 二部图的行树状图。
dendrogram_col (np.ndarray) – 二部图的列树状图。
dendrogram_full (np.ndarray) – 二部图的行和列树状图,按此顺序索引。
示例
>>> from sknetwork.hierarchy import Paris >>> from sknetwork.data import house >>> paris = Paris() >>> adjacency = house() >>> dendrogram = paris.fit_predict(adjacency) >>> np.round(dendrogram, 2) array([[3. , 2. , 0.17 , 2. ], [1. , 0. , 0.25 , 2. ], [6. , 4. , 0.31 , 3. ], [7. , 5. , 0.67 , 5. ]])
备注
树状图的每一行 = \(i, j\)、距离、聚类 \(i + j\) 的大小。
另请参阅
scipy.cluster.hierarchy.linkage
参考资料
T. Bonald、B. Charpentier、A. Galland、A. Hollocou (2018)。使用节点对采样的层次图聚类。 图挖掘和学习研讨会。
- fit(input_matrix: csr_matrix | ndarray, force_bipartite: bool = False) Paris
使用最近邻链进行凝聚聚类。
- 参数:
input_matrix (sparse.csr_matrix, np.ndarray) – 图的邻接矩阵或二部矩阵。
force_bipartite – 如果为
True
,则强制将输入矩阵视为二部矩阵。
- 返回:
self
- 返回类型:
- fit_predict(*args, **kwargs) ndarray
将算法拟合到数据并返回树状图。与
fit
方法具有相同的参数。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- fit_transform(*args, **kwargs) ndarray
将算法拟合到数据并返回树状图。它是
fit_predict
的别名。与fit
方法具有相同的参数。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- get_params()
以字典形式获取参数。
- 返回:
params – 算法的参数。
- 返回类型:
dict
- predict(columns: bool = False) ndarray
返回算法预测的树状图。
- 参数:
columns (bool) – 如果为
True
,则返回对列的预测。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- set_params(params: dict) Algorithm
设置算法的参数。
- 参数:
params (dict) – 算法的参数。
- 返回:
self
- 返回类型:
Algorithm
- transform() ndarray
返回算法预测的树状图。
- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
Louvain
- class sknetwork.hierarchy.LouvainHierarchy(resolution: float = 1, tol_optimization: float = 0.001, tol_aggregation: float = 0.001, shuffle_nodes: bool = False, random_state: RandomState | int | None = None, verbose: bool = False)[source]
通过 Louvain(自下而上)进行层次聚类。
每个级别对应于 Louvain 算法的聚合步骤。
- 参数:
resolution (float) – 分辨率参数。
tol_optimization (float) – 进入新的优化循环的最小目标函数增加量。
tol_aggregation (float) – 进入新的聚合循环的最小目标函数增加量。
shuffle_nodes (bool) – 如果为
True
,则在优化之前对节点进行混洗。random_state (int) – 随机数生成器或随机种子。如果为
None
,则使用 numpy.random。verbose (bool) – 详细模式。
- 变量:
dendrogram (np.ndarray) – 图的树状图。
dendrogram_row (np.ndarray) – 二部图的行树状图。
dendrogram_col (np.ndarray) – 二部图的列树状图。
dendrogram_full (np.ndarray) – 二部图的行和列树状图,按此顺序索引。
示例
>>> from sknetwork.hierarchy import LouvainHierarchy >>> from sknetwork.data import house >>> louvain = LouvainHierarchy() >>> adjacency = house() >>> louvain.fit_predict(adjacency) array([[3., 2., 1., 2.], [4., 1., 1., 2.], [6., 0., 1., 3.], [5., 7., 2., 5.]])
备注
树状图的每一行 = 合并节点、距离、聚类的大小。
另请参阅
scipy.cluster.hierarchy.dendrogram
,sknetwork.clustering.Louvain
- fit(input_matrix: csr_matrix | ndarray, force_bipartite: bool = False) LouvainHierarchy [source]
将算法拟合到数据。
- 参数:
input_matrix (sparse.csr_matrix, np.ndarray) – 图的邻接矩阵或二部矩阵。
force_bipartite – 如果为
True
,则强制将输入矩阵视为二部矩阵。
- 返回:
self
- 返回类型:
- fit_predict(*args, **kwargs) ndarray
将算法拟合到数据并返回树状图。与
fit
方法具有相同的参数。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- fit_transform(*args, **kwargs) ndarray
将算法拟合到数据并返回树状图。它是
fit_predict
的别名。与fit
方法具有相同的参数。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- get_params()
以字典形式获取参数。
- 返回:
params – 算法的参数。
- 返回类型:
dict
- predict(columns: bool = False) ndarray
返回算法预测的树状图。
- 参数:
columns (bool) – 如果为
True
,则返回对列的预测。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- set_params(params: dict) Algorithm
设置算法的参数。
- 参数:
params (dict) – 算法的参数。
- 返回:
self
- 返回类型:
Algorithm
- transform() ndarray
返回算法预测的树状图。
- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- class sknetwork.hierarchy.LouvainIteration(depth: int = 3, resolution: float = 1, tol_optimization: float = 0.001, tol_aggregation: float = 0.001, n_aggregations: int = -1, shuffle_nodes: bool = False, random_state: RandomState | int | None = None, verbose: bool = False)[source]
通过连续的 Louvain 实例进行分层聚类(自上而下)。
- 参数:
depth (int) – 树的深度。负值被解释为没有限制(返回最大深度的树)。
resolution (float) – 分辨率参数。
tol_optimization (float) – 进入新的优化循环的最小目标函数增加量。
tol_aggregation (float) – 进入新的聚合循环的最小目标函数增加量。
n_aggregations (int) – 聚合的最大数量。负值被解释为没有限制。
shuffle_nodes (bool) – 如果为
True
,则在优化之前对节点进行混洗。random_state (int) – 随机数生成器或随机种子。如果为
None
,则使用 numpy.random。verbose (bool) – 详细模式。
- 变量:
dendrogram (np.ndarray) – 图的树状图。
dendrogram_row (np.ndarray) – 二部图的行树状图。
dendrogram_col (np.ndarray) – 二部图的列树状图。
dendrogram_full (np.ndarray) – 二部图的行和列树状图,按此顺序索引。
示例
>>> from sknetwork.hierarchy import LouvainIteration >>> from sknetwork.data import house >>> louvain = LouvainIteration() >>> adjacency = house() >>> louvain.fit_predict(adjacency) array([[3., 2., 1., 2.], [4., 1., 1., 2.], [6., 0., 1., 3.], [5., 7., 2., 5.]])
备注
树状图的每一行 = 合并节点、距离、聚类的大小。
另请参阅
scipy.cluster.hierarchy.dendrogram
,sknetwork.clustering.Louvain
- fit(input_matrix: csr_matrix | ndarray, force_bipartite: bool = False) LouvainIteration [source]
将算法拟合到数据。
- 参数:
input_matrix (sparse.csr_matrix, np.ndarray) – 图的邻接矩阵或二部矩阵。
force_bipartite – 如果为
True
,则强制将输入矩阵视为二部矩阵。
- 返回:
self
- 返回类型:
- fit_predict(*args, **kwargs) ndarray
将算法拟合到数据并返回树状图。与
fit
方法具有相同的参数。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- fit_transform(*args, **kwargs) ndarray
将算法拟合到数据并返回树状图。它是
fit_predict
的别名。与fit
方法具有相同的参数。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- get_params()
以字典形式获取参数。
- 返回:
params – 算法的参数。
- 返回类型:
dict
- predict(columns: bool = False) ndarray
返回算法预测的树状图。
- 参数:
columns (bool) – 如果为
True
,则返回对列的预测。- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
- set_params(params: dict) Algorithm
设置算法的参数。
- 参数:
params (dict) – 算法的参数。
- 返回:
self
- 返回类型:
Algorithm
- transform() ndarray
返回算法预测的树状图。
- 返回:
dendrogram – 树状图。
- 返回类型:
np.ndarray
指标
- sknetwork.hierarchy.dasgupta_cost(adjacency: csr_matrix, dendrogram: ndarray, weights: str = 'uniform', normalized: bool = False) float [source]
Dasgupta 的层次结构成本。
由随机边采样(层次结构中两个节点的最近祖先)引起的集群的预期大小(权重 =
'uniform'
)或预期体积(权重 ='degree'
)。- 参数:
adjacency – 图的邻接矩阵。
dendrogram – 树状图。
weights – 节点的权重。
'degree'
或'uniform'
(默认)。normalized – 如果为
True
,则为标准化成本(介于 0 和 1 之间)。
- 返回:
cost – 成本。
- 返回类型:
float
示例
>>> from sknetwork.hierarchy import dasgupta_score, Paris >>> from sknetwork.data import house >>> paris = Paris() >>> adjacency = house() >>> dendrogram = paris.fit_transform(adjacency) >>> cost = dasgupta_cost(adjacency, dendrogram) >>> np.round(cost, 2) 3.33
参考资料
Dasgupta, S. (2016)。基于相似度的层次聚类的成本函数。ACM 理论计算研讨会论文集。
- sknetwork.hierarchy.dasgupta_score(adjacency: csr_matrix, dendrogram: ndarray, weights: str = 'uniform') float [source]
层次结构的 Dasgupta 得分(质量度量,介于 0 和 1 之间)。
定义为 1 - 归一化的 Dasgupta 成本。
- 参数:
adjacency – 图的邻接矩阵。
dendrogram – 树状图。
weights – 节点的权重。
'degree'
或'uniform'
(默认)。
- 返回:
score – 分数。
- 返回类型:
float
示例
>>> from sknetwork.hierarchy import dasgupta_score, Paris >>> from sknetwork.data import house >>> paris = Paris() >>> adjacency = house() >>> dendrogram = paris.fit_transform(adjacency) >>> score = dasgupta_score(adjacency, dendrogram) >>> np.round(score, 2) 0.33
参考资料
Dasgupta, S. (2016)。基于相似度的层次聚类的成本函数。ACM 理论计算研讨会论文集。
- sknetwork.hierarchy.tree_sampling_divergence(adjacency: csr_matrix, dendrogram: ndarray, weights: str = 'degree', normalized: bool = True) float [source]
层次结构的树采样差异(质量度量)。
- 参数:
adjacency – 图的邻接矩阵。
dendrogram – 树状图。
weights – 节点的权重。
'degree'
(默认)或'uniform'
。normalized – 如果
True
,则为归一化得分(介于 0 和 1 之间)。
- 返回:
score – 分数。
- 返回类型:
float
示例
>>> from sknetwork.hierarchy import tree_sampling_divergence, Paris >>> from sknetwork.data import house >>> paris = Paris() >>> adjacency = house() >>> dendrogram = paris.fit_transform(adjacency) >>> score = tree_sampling_divergence(adjacency, dendrogram) >>> np.round(score, 2) 0.05
参考资料
Charpentier, B. & Bonald, T. (2019). 树采样差异:一种用于层次图聚类的信息论度量。 IJCAI 论文集。
切分
- sknetwork.hierarchy.cut_straight(dendrogram: ndarray, n_clusters: int | None = None, threshold: None | float = None, sort_clusters: bool = True, return_dendrogram: bool = False) ndarray | Tuple[ndarray, ndarray] [source]
切分树状图并返回相应的聚类。
- 参数:
dendrogram (np.ndarray) – 树状图。
n_clusters (int) – 聚类数量(可选)。如果树状图中存在相等的高度,聚类数量可能会大于 n_clusters。
threshold (float) – 高度的阈值(可选)。如果 n_clusters 和 threshold 都为
None
,则 n_clusters 设置为 2。sort_clusters (bool) – 如果
True
,则按聚类大小递减顺序对聚类进行排序。return_dendrogram (bool) – 如果
True
,则返回从聚类到根的树状图。
- 返回:
labels (np.ndarray) – 每个节点的聚类。
dendrogram_aggregate (np.ndarray) – 从聚类开始的树状图(叶节点 = 聚类)。
示例
>>> from sknetwork.hierarchy import cut_straight >>> dendrogram = np.array([[0, 1, 0, 2], [2, 3, 1, 3]]) >>> cut_straight(dendrogram) array([0, 0, 1])
- sknetwork.hierarchy.cut_balanced(dendrogram: ndarray, max_cluster_size: int = 20, sort_clusters: bool = True, return_dendrogram: bool = False) ndarray | Tuple[ndarray, ndarray] [source]
使用对聚类大小的约束切分树状图并返回相应的聚类。
- 参数:
dendrogram (np.ndarray) – 树状图
max_cluster_size (int) – 每个聚类的最大大小。
sort_clusters (bool) – 如果
True
,则按聚类大小递减顺序对标签进行排序。return_dendrogram (bool) – 如果
True
,则返回从聚类到根的树状图。
- 返回:
labels (np.ndarray) – 每个节点的标签。
dendrogram_aggregate (np.ndarray) – 从聚类开始的树状图(叶节点 = 聚类)。
示例
>>> from sknetwork.hierarchy import cut_balanced >>> dendrogram = np.array([[0, 1, 0, 2], [2, 3, 1, 3]]) >>> cut_balanced(dendrogram, 2) array([0, 0, 1])
树状图
- sknetwork.hierarchy.aggregate_dendrogram(dendrogram: ndarray, n_clusters: int = 2, return_counts: bool = False) ndarray | Tuple[ndarray, ndarray] [source]
聚合树状图以获得一定数量的叶节点。输出树状图中的叶节点对应于输入树状图中的子树。
- 参数:
dendrogram (np.ndarray) – 要聚合的输入。
n_clusters (int) – 要保留的聚类(或叶节点)数量。
return_counts (bool) – 如果
True
,则返回一个计数数组,对应于合并子树的大小。计数的总和等于输入树状图中的样本数量。
- 返回:
new_dendrogram (np.ndarray) – 聚合的树状图。节点从 0 重新索引。
counts (np.ndarray) – 对应于 new_dendrogram 中每个叶节点的子树大小。