【问题标题】:Approximating dot product between two real-valued vectors in Hamming space汉明空间中两个实值向量之间的近似点积
【发布时间】:2021-10-23 16:40:12
【问题描述】:

目前我正在阅读一篇关于图神经网络中量化的论文 (https://arxiv.org/pdf/2012.15823.pdf)。在第二页,他们讨论了如何逼近两个实值向量 a 和 b 的点积

现在我尝试在 Python 中实现这一点,但是当存在负数时,我得到的结果远非良好的近似值:

dataset = np.random.uniform(-1, 1, (500, 300))
dataset /= np.linalg.norm(dataset, axis=1, keepdims=True)

def sign(vector):
    return 2* (vector > 0).astype(int) - 1

def rescaling(vector):
    return (1 / vector.size) * np.sum(np.abs(vector))

def binary_product(vector_x, vector_y):
    return (vector_x == vector_y).sum()


def calculate_approx(a, b):
    alpha = rescaling(a)
    beta = rescaling(b)

    sign_a = sign(a)
    sign_b = sign(b)

    return binary_product(sign_a, sign_b) * alpha * beta

print(calculate_approx(dataset[0], dataset[1]))
print(dataset[0] @ dataset[1])

当我将数据集更改为仅具有高于 0 的值时,我确实得到了一个很好的近似值。

有人知道我做错了什么吗?

【问题讨论】:

    标签: python vector linear-algebra dot-product


    【解决方案1】:

    你看到推导假设allclose(|x|, 1)

    使用重新调整mean(|x|) 参数,您可以拥有allclose(|x|, mean(|x|)), 点积可以重写为sum(sign(x) * sign(y) * |x| * |y|),你计算的是sum(sign(x) * sign(y)) mean(|x|) * mean(|y|),如果|x||y| 都接近它们各自的平均值,那么你得到一个很好的近似值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-08
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2017-08-22
      • 2022-08-17
      相关资源
      最近更新 更多