我刚开始学习特征哈希,所以我需要帮助理解我是否可以将数学表达的哈希函数应用为https://en.wikipedia.org/wiki/Tent_map。
和帐篷地图的一个这样的应用是密码学 - 论文1:基于哈希函数的实现 论神经网络 密码学download link。
在特征哈希中,
设 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)。如何应用分段线性函数,即应用此映射创建超平面以进行特征散列?
或者我是否将这两个概念混合在一起?
答案 0 :(得分:2)
Feature hashing需要一个哈希函数,以便能够执行...哈希技巧!
它将散列每个图像,因此您需要一个散列函数来获取图像(即D维的特征/向量)并生成一个整数值。
注意:我认为你对第二个单比特输出散列函数ξ,w.r.t感到困惑。结果将是二进制的事实。一旦获得初始方法的流程,ξ()很容易掌握,因为这只是减少哈希冲突的优化。
现在让我们来看看Tent_map_2的行为:
如你所见,是一个实值函数。
输入一个数字,输出一个数字。因此,天真的帐篷地图不能散列矢量(在我们的例子中是一个图像)。有许多方法可以增加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()
。您可能需要阅读example,真的很有帮助。
看起来似乎 要求降低维度,应该不会减少,但是当你在高维空间中留下数据时,这是通常情况下是图像,你应该尝试减小尺寸(例如从256到128)。
例如,您可以使用scikit-learn或任何其他库中的PCA()。