我有以下代码:
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个核心(。有可能吗?
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.labels