如何有效地找到我的测试行和训练集之间的欧几里得距离?

Posted

技术标签:

【中文标题】如何有效地找到我的测试行和训练集之间的欧几里得距离?【英文标题】:How do I find the euclidean distances between rows of my test and train set efficiently? 【发布时间】:2018-07-10 04:32:16 【问题描述】:

我有 testtrain 集合,其所有特征(即列)为整数。X_train.shape(990188L, 19L)

X_test.shape(424367L, 19L)

我想找出train 集合的所有行和test 集合的所有行之间的欧式距离。 我还必须从距离阈值为0.005 的火车集中删除行。 我有以下线性代码,它太慢但工作正常。

for a in range(X_test.shape[0]):
    a_test = np_Test[a]
    for b in range(X_train.shape[0]):
        a_train = np_Train[b]
        if(a != b):
            dst = distance.euclidean(a_test, a_train)
            if(dst <= 0.005):
                train.append(b)

我记下位于距离阈值内的行的索引。 有没有办法并行化这段代码? 我尝试使用from sklearn.metrics.pairwise import euclidean_distances 但是由于数据集很大,我遇到了内存错误。

我尝试使用 euclidean_distances 批量并行化代码,但我认为以下代码无法正常工作。 如果有任何方法可以并行化代码,请帮助我。

rows = X_train.shape[0]
rem = rows%1000
no = rows/1000
i = 0

while (i <= no*1000) :
    dst_mat = euclidean_distances(X_train[i:i+1000, :], X_test)
    condition = np.any(dst_mat <= 0.005, axis = 1)
    index = np.where(condition == True)
    index = np.add(index, i)
    print(index)
    print(dst_mat)
    i+=1000

【问题讨论】:

【参考方案1】:

使用scipy.spatial.cdist。这将计算成对距离。

感谢 Warren Weckesser 指出这个解决方案。

【讨论】:

也许吧,因为它只会计算一半的值。 让我试一试,然后回来找你。感谢您的帮助。 你对你需要的内存做了一个简单的估计吗? 要计算两个不同数组中的点之间的距离,请使用scipy.spatial.distance.cdist(不是pdist)。 cdist 不返回任何冗余数据,因此无需返回压缩形式。

以上是关于如何有效地找到我的测试行和训练集之间的欧几里得距离?的主要内容,如果未能解决你的问题,请参考以下文章

有效计算单元阵列之间的欧几里得距离

在 TensorFlow Embedding 中有效地找到最接近的词

欧几里得距离(python3,sklearn):有效地计算最近的对及其对应的距离

如何在opencv中找到单个图像的关键点之间的欧几里得距离

[ CS231n ] 图像分类

如何在不使用 numpy 或 zip 的情况下找到两个列表之间的欧几里得距离?