2

我才刚刚开始学习特征散列,所以我需要帮助来理解我是否可以应用以数学方式表示为https://en.wikipedia.org/wiki/Tent_map的散列函数。

Tent map 的一个这样的应用是在密码学中——论文 1:基于神经密码学的哈希函数的实现下载链接

在特征散列中,设x为 D 维的数据点,即它有 D 个元素。在特征散列中,使用线性散列函数将 D 维数据点转换为较低的 k 维数据点,从而保留降维特征空间中的距离。哈希位 k 是通过运算得到的, h_k(x) = sign(y(x)) = sign(f(w_k^Tx +b))。输出h(x)为 0 或 1 位。

本质上,我们通过创建随机超平面来对数据点 x 属于 0 类还是 1 类进行分类。

在特征散列中,有多种散列函数可供选择以降低维数:f = tanh()或简单地随机采样以获得超平面。另一种选择是在数据不是线性可分时使用核函数。这种散列函数/技术是使用内核实现的,一种流行的选择是使用高斯 RBF 作为内核函数。


  • 问题:在论文 1 中,作者使用了在单位间隔上分段线性的非对称帐篷地图https://en.wikipedia.org/wiki/Tent_map作为传递函数。对我来说,本文中使用 Tent Map 的散列公式看起来类似于散列方程 (1)。如何应用分段线性函数,即应用此地图创建超平面以进行特征散列?

    还是我混合了这两个概念?

4

1 回答 1

2

特征散列需要一个散列函数,这样它才能做到……它的散列技巧!

它将散列每个图像,因此您需要一个散列函数来获取图像(即 D 维的特征/向量)并产生单个整数值。


注意:我认为您对第二个单比特输出哈希函数 ξ 感到困惑,因为结果将是二进制的。一旦掌握了初始方法的流程,ξ() 就很容易掌握,因为这只是减少哈希冲突的优化。


现在让我们看一下 Tent_map_2 的行为:

在此处输入图像描述

如您所见,这是一个实值函数。

它将一个数字作为输入并给出一个数字作为输出。结果,一个简单的帐篷地图不能散列一个向量(在我们的例子中是一个图像)。有很多方法可以扩充 Tent Map 来处理向量,最简单的方法是:

实现一个Tent Map 函数,例如tentMap(),它将实现Tent Map 的逻辑。您可以将小于 0.5 的 Tent Map 的返回值视为 0,将其余(即 >= 0.5)视为 1,但如果您愿意,您可以做更复杂的事情。

现在对于图像,您可以执行以下操作:

def tentMapVector(image):
    results = []
    for i in image:
        results.append(tentMap(i))
    # now 'results' contains D integers
    # it needs to be hashed to a single integer
    # you could treat 'results' as a string and
    # use one of the numerous hash function to hash that string
    return hashString(results)

你准备好了!tentMapVector()应该在维基百科的实现中替换hash()。你可能想阅读它的例子,真的很有帮助。


Feature 似乎不需要降,它应该在没有降维的情况下工作,但是当您将数据留在高维空间中时,通常是图像的情况,您应该尝试减少维度(例如从 256至 128)。

例如,您可以使用scikit-learn中的 PCA()或任何其他库。

于 2016-09-27T11:39:36.090 回答