为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英4014372 2021-12-09 15:16:45
我正在尝试两种方法来实现欧氏距离的平方结果。通过 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 小时结果保持不变。为什么会发生?我怎样才能得到相同的结果?
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

在这个最小的例子中,我们看到 2 个结果之间的差异可以忽略不计。


import numpy as np

from sklearn.metrics.pairwise import euclidean_distances


def 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 distances


def 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 distances



d = 128

ns = [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 = 100

0.0

n = 1000

0.0

n = 10000

0.0

n = 100000

0.0

n = 200000

1.52587890625e-05

当您想测试相等性时,不要只打印结果。您也可以使用numpy.set_printoptions来处理阵列的打印质量。


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号