【问题标题】:How to specify the memory directory for Agglomerative clustering using sklearn如何使用sklearn指定凝聚聚类的内存目录
【发布时间】:2023-01-26 22:21:08
【问题描述】:

我正在尝试使用 sklearn 的 AgglomerativeClustering 优化用于计算同一数据集上具有不同数量集群的多个结果的计算时间。

https://stackoverflow.com/questions/36490241/sklearn-agglomerative-clustering-dynamically-updating-the-number-of-clusters?noredirect=1&lq=1 所示,可以存储由AgglomerativeClustering 计算的整个树。然后,您可以重新指定聚类对象的n_clusters-参数,并简单地提取聚类到新数量的同一数据集的新聚类结果。

如果这是一个微不足道的问题,我很抱歉,但我在使用 Python 处理内存方面经验很少。我的问题是如何指定AgglomerativeClustering使用的缓存目录。在上面链接的例子中,它写成:

AgglomerativeClustering(n_clusters=10, memory='mycachedir', compute_full_tree=True)

'mycachedir' 到底是什么?我需要用我自己的缓存目录替换它,还是 python 在某个名为 'mycachedir' 的地方创建一个新目录?如果是这样,当我的程序结束时它会被删除吗?我希望在我的程序停止或结束后删除缓存。再次,如果这很明显,我很抱歉。

我尝试使用字符串 "mycachedir" 运行它,Python 没有引发错误。那么这个目录位于哪里呢?它的行为如何?例如,程序结束后它是否被删除?

【问题讨论】:

    标签: python memory scikit-learn cluster-analysis hierarchical-clustering


    【解决方案1】:

    根据 scikit-learn documentation,“如果给定一个字符串,它就是缓存目录的路径。

    事实上,缓存是通过 joblib 包的 joblib.Memory 类执行的。该目录由 os.makedirs(os.path.expanduser(memory)) 创建,其中 memoryAgglomerativeClustering 输入参数。尽管可以使用joblib.Memory.clear 删除它,但据我所知,调用AgglomerativeClustering.fit 时情况并非如此。

    使用sklearn.AgglomerativeClusteringexample

    import os
    
    # EXTERNALS
    from sklearn.cluster import AgglomerativeClustering
    import numpy as np
    
    X = np.array([[1, 2], [1, 4], [1, 0],
                  [4, 2], [4, 4], [4, 0]])
    
    memory_dir = "~/tmp/my_cached_memory_folder" 
    # relative path depending on your working directory
    # (cf. `os.getcwd()`)
    
    clustering = AgglomerativeClustering(memory=memory_dir).fit(X)
    
    full_path = os.path.abspath(os.path.expanduser(memory_dir))
    
    print("Cached memory directory: " f"{full_path}")
    print(os.path.isdir(full_path))
    
    # Cached memory directory: /home/remi_cuingnet/tmp/my_cached_memory_folder
    # True
    

    请注意,您必须手动清除它。

    【讨论】:

    • 谢谢您的回答!那么,你能写几行代码吗?例如,我应该初始化一个 joblib.Memory 对象以传递给 AgglomerativeClustering 吗?之后是否需要手动清除它,还是程序结束时总是发生这种情况?
    • @Ankerstjerne,我刚刚编辑了我的答案。有帮助吗?
    猜你喜欢
    • 2017-12-03
    • 2019-05-19
    • 2015-01-07
    • 2023-03-12
    • 2016-07-29
    • 2018-04-29
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多