欧几里德距离:python 和 numpy 之间的结果不同,实例数量很多

我正在尝试两种方法来实现欧氏距离的平方结果。


通过 Numpy:


def inference(feature_list):

    distances = np.zeros(len(feature_list))

    for idx, pair in enumerate(feature_list):

        distances[idx] = euclidean_distances(pair[0].reshape((1, -1)), pair[1].reshape((1, -1))).item()

        distances[idx] = distances[idx] * distances[idx]

    return distances

通过蟒蛇:


def inference1(feature_list):

    distances = np.zeros(len(feature_list))

    for idx, pair in enumerate(feature_list):

        for pair_idx in range(len(pair[0])):

            tmp = pair[0][pair_idx] - pair[1][pair_idx]

            distances[idx] += tmp * tmp


    return distances

测试结果的代码是:


def main(args):

    d = 128

    n = 100

    array2 = [(np.random.rand(d)/4, np.random.rand(d)/3) for x in range(n)]


    result = sample.inference(array2)

    print(list(result)) # print result 1



    result = sample.inference1(array2)

    print(list(result)) # print result 2

当 n 达到 100000 时结果不同,而当 n 小时结果保持不变。


为什么会发生?我怎样才能得到相同的结果?


慕桂英4014372
浏览 171回答 1
1回答

慕神8447489

在这个最小的例子中,我们看到 2 个结果之间的差异可以忽略不计。import numpy as npfrom sklearn.metrics.pairwise import euclidean_distancesdef inference_sklearn(feature_list):    distances = np.zeros(len(feature_list))    for idx, pair in enumerate(feature_list):        distances[idx] = euclidean_distances(pair[0].reshape((1, -1)), pair[1].reshape((1, -1))).item()        distances[idx] = distances[idx] * distances[idx]    return distancesdef inference_python(feature_list):    distances = np.zeros(len(feature_list))    for idx, pair in enumerate(feature_list):        for pair_idx in range(len(pair[0])):            tmp = pair[0][pair_idx] - pair[1][pair_idx]            distances[idx] += tmp * tmp    return distancesd = 128ns = [100, 1000, 10000, 100000, 200000]for n in ns:     print("n =", n)    test_array = [(np.random.rand(d)/4, np.random.rand(d)/3) for x in range(n)]    result_sklearn = inference_sklearn(test_array)    result_python = inference_python(test_array)    print(euclidean_distances([result_sklearn], [result_python])[0][0])输出:n = 1000.0n = 10000.0n = 100000.0n = 1000000.0n = 2000001.52587890625e-05当您想测试相等性时,不要只打印结果。您也可以使用numpy.set_printoptions来处理阵列的打印质量。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python