我有以下代码:
from sklearn_extra.clusters import KMedoids
def _compute_medoids(df, k):
k_medoids = KMedoids(n_clusters=k, metric='precomputed', init='k-medoids++').fit(df)
medoid_index=k_medoids.medoid_indices_
labels=k_medoids.labels_
return medoid_index, labels
for k in range(1, 6):
medoid_ids, labels = _compute_medoids(df, n_clusters=k)以这种方式执行代码,我的性能会很差。与sklearn的模型不同,sklearn_extra.cluster.KMedoids没有一个n_jobs参数,并且检查核心使用情况,大多数情况下,流程只使用一个核心。
我试着用joblib
Parallel(n_jobs=os.cpu_count())(delayed(_compute_medoids)(df, k) for k in range(1, 6))我的成绩有所提高,但还不足以完成我的任务。而且,将核心数量从4增加到8或16并不会带来相应的性能改进。
据我所知,像joblib或multiprocessing这样的多处理库可以并行控制工作人员的数量,但不能控制处理函数的核心用法。我说的对吗?
我想知道是否有一种方法可以强制在固定数量的核心上执行_compute_medoids,这样我就可以处理尽可能多的工作人员(例如,使用16个核心来设置4个工作人员来执行4个compute_medoids方法,每个工作人员使用4个核)。有可能吗?
发布于 2022-11-16 21:59:09
kmedoids包具有更快的算法,包括并行版本的FasterPAM。
https://python-kmedoids.readthedocs.io/en/latest/#kmedoids.fasterpam
def _compute_medoids(df, k):
import kmedoids
km = kmedoids.fasterpam(df, k)
return km.medoids, km.labelshttps://stackoverflow.com/questions/73977052
复制相似问题