【问题标题】:looped sklearn euclidean distances optimisation循环 sklearn 欧几里得距离优化
【发布时间】:2016-11-05 23:24:33
【问题描述】:

我正在寻找优化这种循环欧几里得距离计算的智能方法。此计算正在寻找与所有其他向量的平均距离。

因为我的向量数组真的很大:eucl_dist = euclidean_distances(eigen_vs_cleaned) 我逐行运行一个循环。

目前典型的 eigen_vs_cleaned 形状至少为 (300000,1000),我必须进一步提高。 (如 2000000,10000)

有什么更聪明的方法吗?

eucl_dist_meaned = np.zeros(eigen_vs_cleaned.shape[0],dtype=float)

from sklearn.metrics.pairwise import euclidean_distances
for z in range(eigen_vs_cleaned.shape[0]):
    if z%10000==0:
        print(z)
    eucl_dist_temp = euclidean_distances(eigen_vs_cleaned[z].reshape(1, -1), eigen_vs_cleaned)
    eucl_dist_meaned[z] = eucl_dist_temp.mean(axis=1)

【问题讨论】:

    标签: python numpy scipy scikit-learn


    【解决方案1】:

    我不是 python/numpy 大师,但这是我优化它的第一步。它至少在我的 MacPro 上运行得更好。

    from joblib import Parallel, delayed
    import multiprocessing
    import os
    import tempfile
    import shutil
    
    from sklearn.metrics.pairwise import euclidean_distances
    
    # Creat a temporary directory and define the array pat
    path = tempfile.mkdtemp()
    out_path = os.path.join(path,'out.mmap')
    out = np.memmap(out_path, dtype=float, shape=eigen_vs_cleaned.shape[0], mode='w+')
    
    eucl_dist_meaned = np.zeros(eigen_vs_cleaned.shape[0],dtype=float)
    
    num_cores = multiprocessing.cpu_count()
    
    def runparallel(row, out):
        if row%10000==0:
            print(row)
        eucl_dist_temp = euclidean_distances(eigen_vs_cleaned[row].reshape(1, -1), eigen_vs_cleaned)
        out[row] = eucl_dist_temp.mean(axis=1)
        ##
    
    nothing = Parallel(n_jobs=num_cores)(delayed(runparallel)(r, out) for r in range(eigen_vs_cleaned.shape[0]))
    

    然后我保存输出:

    eucl_dist_meaned = np.array(out,copy=True,dtype=float)
    

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 2012-12-05
      • 1970-01-01
      • 2021-02-25
      • 2015-07-15
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多