.. image:: https://img.shields.io/pypi/v/hdbscan.svg :target: https://pypi.python.org/pypi/hdbscan/ :alt: PyPI 版本 .. image:: https://anaconda.org/conda-forge/hdbscan/badges/version.svg :target: https://anaconda.org/conda-forge/hdbscan :alt: Conda-forge 版本 .. image:: https://anaconda.org/conda-forge/hdbscan/badges/downloads.svg :target: https://anaconda.org/conda-forge/hdbscan :alt: Conda-forge 下载量 .. image:: https://img.shields.io/pypi/l/hdbscan.svg :target: https://github.com/scikit-learn-contrib/hdbscan/blob/master/LICENSE :alt: 许可证 .. image:: https://travis-ci.org/scikit-learn-contrib/hdbscan.svg :target: https://travis-ci.org/scikit-learn-contrib/hdbscan :alt: Travis 构建状态 .. image:: https://codecov.io/gh/scikit-learn-contrib/hdbscan/branch/master/graph/badge.svg :target: https://codecov.io/gh/scikit-learn-contrib/hdbscan :alt: 测试覆盖率 .. image:: https://readthedocs.org/projects/hdbscan/badge/?version=latest :target: https://hdbscan.readthedocs.org :alt: 文档 .. image:: http://joss.theoj.org/papers/10.21105/joss.00205/status.svg :target: http://joss.theoj.org/papers/10.21105/joss.00205 :alt: JOSS 文章 .. image:: https://mybinder.org/badge.svg :target: https://mybinder.org/v2/gh/scikit-learn-contrib/hdbscan :alt: 在 Binder 中启动示例笔记本
======= HDBSCAN
HDBSCAN - 基于分层密度的带噪声应用空间聚类。它在不同的 epsilon 值上执行 DBSCAN,并整合结果以找到在 epsilon 上提供最佳稳定性的聚类。这使得 HDBSCAN 能够找到不同密度的聚类(不同于 DBSCAN),并且对参数选择更加稳健。
实际上,这意味着 HDBSCAN 无需或仅需很少的参数调整就能直接返回良好的聚类结果 —— 而且主要参数"最小聚类大小"是直观且易于选择的。
HDBSCAN 非常适合探索性数据分析;它是一种快速且稳健的算法,你可以信赖它返回有意义的聚类(如果存在的话)。
基于以下论文:
McInnes L, Healy J. *加速分层密度聚类*
发表于:2017 IEEE 国际数据挖掘研讨会论文集 (ICDMW),IEEE,第 33-42 页。
2017 `[pdf] <http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8215642>`_
R. Campello, D. Moulavi, 和 J. Sander, *基于分层密度估计的密度聚类*
发表于:知识发现与数据挖掘进展,Springer,第 160-172 页。
2013
文档(包括教程)可在 ReadTheDocs 上查阅:http://hdbscan.readthedocs.io/en/latest/ 。
以下笔记本可供参考:比较 HDBSCAN 与其他聚类算法 <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/Comparing%20Clustering%20Algorithms.ipynb>
、HDBSCAN 工作原理解析 <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/How%20HDBSCAN%20Works.ipynb>
以及 与其他 Python 聚类实现的性能比较 <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/Benchmarking%20scalability%20of%20clustering%20implementations-v0.7.ipynb>
_。
如何使用 HDBSCAN
hdbscan 包继承自 sklearn 类,因此可以与其他 sklearn 聚类器无缝对接,调用 API 完全相同。同样,它支持多种输入格式:形状为 (样本数 x 特征数)
的数组(或 pandas 数据框、稀疏矩阵);给出样本间距离矩阵的数组(或稀疏矩阵)。
.. code:: python
import hdbscan
from sklearn.datasets import make_blobs
data, _ = make_blobs(1000)
clusterer = hdbscan.HDBSCAN(min_cluster_size=10)
cluster_labels = clusterer.fit_predict(data)
性能
我们为提高 hdbscan 实现的速度做出了巨大努力。它比 Java 中的参考实现 快几个数量级 <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/Python%20vs%20Java.ipynb>
,目前甚至比 C 和 C++ 中高度优化的单链接实现还要快。
版本 0.7 的性能可以在这个笔记本中查看 <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/Benchmarking%20scalability%20of%20clustering%20implementations-v0.7.ipynb>
。
特别是,在低维数据上的性能优于 sklearn 的 DBSCAN <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/Benchmarking%20scalability%20of%20clustering%20implementations%202D%20v0.7.ipynb>
_,
而且通过支持 joblib 缓存,使用不同参数重新聚类几乎可以零成本完成。
附加功能
hdbscan 包配备了可视化工具,帮助你理解聚类结果。拟合数据后,聚类器对象具有以下属性:
- 压缩的聚类层次结构
- 稳健单链接聚类层次结构
- 可达距离最小生成树
所有这些都配备了绘图方法,并可转换为 Pandas 或 NetworkX 以进行进一步分析。有关示例和更多详细信息,请参阅 HDBSCAN 工作原理 <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/How%20HDBSCAN%20Works.ipynb>
_ 笔记本。
聚类器对象还有一个属性提供聚类成员强度,从而实现可选的软聚类(无需额外计算成本)。最后,每个聚类还会得到一个持续性得分,表示该聚类在数据中存在的距离尺度范围内的稳定性。这提供了聚类相对强度的度量。
异常检测
HDBSCAN 聚类器对象还支持 GLOSH 异常检测算法。
将聚类器拟合到数据后,可以通过 outlier_scores_
属性访问异常分数。结果是一个分数值向量,每个拟合的数据点对应一个分数。较高的分数表示更异常的对象。
通过上四分位数选择异常通常是一种好方法。
基于以下论文: R.J.G.B. Campello, D. Moulavi, A. Zimek 和 J. Sander 用于数据聚类、可视化和异常检测的分层密度估计, ACM 数据发现知识交易,第 10 卷,第 1 期(2015 年 7 月),1-51 页。
稳健单链接
hdbscan 包还提供了对 Chaudhuri 和 Dasgupta 提出的稳健单链接聚类算法的支持。与 HDBSCAN 实现一样,这是该算法的高性能版本,性能优于 scipy 的标准单链接实现。稳健单链接 层次结构可作为稳健单链接聚类器的属性使用,同样可以绘制或导出层次结构,并在给定 截断级别和 gamma 值下提取平面聚类。
使用示例:
.. code:: python
import hdbscan
from sklearn.datasets import make_blobs
data, _ = make_blobs(1000)
clusterer = hdbscan.RobustSingleLinkage(cut=0.125, k=7)
cluster_labels = clusterer.fit_predict(data)
hierarchy = clusterer.cluster_hierarchy_
alt_labels = hierarchy.get_clusters(0.100, 5)
hierarchy.plot()
基于以下论文: K. Chaudhuri 和 S. Dasgupta. "聚类树的收敛率。" 发表于:神经信息处理系统进展,2010。
分支检测
hdbscan 包支持 Bot 等人 <https://arxiv.org/abs/2311.15887>
_ 提出的分支检测后处理步骤。聚类形状,
如分支结构,可以揭示在基于密度的聚类层次结构中未表达的有趣模式。
BranchDetector 类模仿 HDBSCAN API,可用于检测聚类中的分支层次结构。它提供压缩
分支层次结构、分支持续性和分支成员资格,并支持 joblib 的缓存功能。有一个笔记本
演示 BranchDetector 的使用 <http://nbviewer.jupyter.org/github/scikit-learn-contrib/hdbscan/blob/master/notebooks/How%20to%20detect%20branches.ipynb>
_。
使用示例:
.. code:: python
import hdbscan
from sklearn.datasets import make_blobs
data, _ = make_blobs(1000)
clusterer = hdbscan.HDBSCAN(branch_detection_data=True).fit(data)
branch_detector = hdbscan.BranchDetector().fit(clusterer)
branch_detector.cluster_approximation_graph_.plot(edge_width=0.1)
基于以下论文: D. M. Bot, J. Peeters, J. Liesenborgs 和 J. Aerts "FLASC:一种对突发敏感的聚类算法:扩展 HDBSCAN 以检测聚类中的分支"* Arxiv 2311.15887, 2023。
安装
最简单的安装方法,如果你使用 Anaconda(感谢 conda-forge,它太棒了!):
.. code:: bash
conda install -c conda-forge hdbscan
使用 PyPI 安装,假设你的 pip 是最新版本:
.. code:: bash
pip install hdbscan
多个平台的二进制轮子可用,这要感谢 Ryan Helinski rlhelinski@gmail.com 的工作。
如果 pip 在拉取依赖项时遇到困难,我们建议先将 pip 升级到至少 10 版本,然后再试一次:
.. code:: bash
pip install --upgrade pip
pip install hdbscan
否则,使用 anaconda 手动安装依赖项,然后从 pip 拉取 hdbscan:
.. code:: bash
conda install cython
conda install numpy scipy
conda install scikit-learn
pip install hdbscan
要手动安装 GitHub 上的最新代码:
.. code:: bash
pip install --upgrade git+https://github.com/scikit-learn-contrib/hdbscan.git#egg=hdbscan
或者下载软件包,安装所需依赖,并手动运行安装程序:
.. code:: bash
wget https://github.com/scikit-learn-contrib/hdbscan/archive/master.zip
unzip master.zip
rm master.zip
cd hdbscan-master
pip install -r requirements.txt
python setup.py install
运行测试
安装后可以使用以下命令运行软件包测试:
.. code:: bash
nosetests -s hdbscan
或者,如果已安装 nose
但 nosetests
不在您的 PATH
变量中:
.. code:: bash
python -m nose -s hdbscan
如果有一个或多个测试失败,请在 https://github.com/scikit-learn-contrib/hdbscan/issues/new 报告错误
Python 版本
hdbscan 库同时支持 Python 2 和 Python 3。但如果您可以使用,我们推荐 Python 3 作为更好的选择。
帮助和支持
对于简单问题,您可以查阅文档中的 FAQ <https://hdbscan.readthedocs.io/en/latest/faq.html>
。
如果您的问题在那里没有得到适当解决,请查看 GitHub 上的 问题 <https://github.com/scikit-learn-contrib/hdbscan/issues>
。最后,如果那里没有可用的解决方案,请随时 提出问题 <https://github.com/scikit-learn-contrib/hdbscan/issues/new>
_;作者将尝试在合理的时间内回复。
贡献
我们欢迎任何形式的贡献!对文档的协助,特别是扩展教程,总是受欢迎的。要贡献,请 fork 项目 <https://github.com/scikit-learn-contrib/hdbscan/issues#fork-destination-box>
_,进行更改并提交拉取请求。我们将尽最大努力解决任何问题,并将您的代码合并到主分支中。
引用
如果您在科学出版物中使用了这个代码库并希望引用它,请使用 开源软件期刊文章 <http://joss.theoj.org/papers/10.21105/joss.00205>
_。
L. McInnes, J. Healy, S. Astels, *hdbscan: Hierarchical density based clustering*
In: Journal of Open Source Software, The Open Journal, volume 2, number 11.
2017
.. code:: bibtex
@article{mcinnes2017hdbscan,
title={hdbscan: Hierarchical density based clustering},
author={McInnes, Leland and Healy, John and Astels, Steve},
journal={The Journal of Open Source Software},
volume={2},
number={11},
pages={205},
year={2017}
}
要引用这个库中开发的高性能算法,请引用我们在 ICDMW 2017 会议论文集中的论文。
McInnes L, Healy J. *Accelerated Hierarchical Density Based Clustering*
In: 2017 IEEE International Conference on Data Mining Workshops (ICDMW), IEEE, pp 33-42.
2017
.. code:: bibtex
@inproceedings{mcinnes2017accelerated,
title={Accelerated Hierarchical Density Based Clustering},
author={McInnes, Leland and Healy, John},
booktitle={Data Mining Workshops (ICDMW), 2017 IEEE International Conference on},
pages={33--42},
year={2017},
organization={IEEE}
}
如果您在科学出版物中使用了这个代码库的分支检测功能并希望引用它,请使用 Arxiv 预印本 <https://arxiv.org/abs/2311.15887>
_:
D. M. Bot, J. Peeters, J. Liesenborgs and J. Aerts
*"FLASC: A Flare-Sensitive Clustering Algorithm: Extending HDBSCAN\* for Detecting Branches in Clusters"*
Arxiv 2311.15887, 2023.
.. code:: bibtex
@misc{bot2023flasc,
title={FLASC: A Flare-Sensitive Clustering Algorithm: Extending HDBSCAN* for Detecting Branches in Clusters},
author={D. M. Bot and J. Peeters and J. Liesenborgs and J. Aerts},
year={2023},
eprint={2311.15887},
archivePrefix={arXiv},
primaryClass={cs.LG},
url={https://arxiv.org/abs/2311.15887},
}
许可
hdbscan 包采用 3 条款 BSD 许可。尽情使用吧。