【发布时间】:2013-07-31 01:43:40
【问题描述】:
我希望FeatureHasher 的输出稀疏矩阵中的所有值都是非负的,因为我认为它应该只计算术语频率并在散列函数的帮助下对术语进行索引。当发生碰撞时,我希望它只是将“碰撞项”的频率相加。但是,似乎我错了,因为它实际上输出了一堆负值,给定一个字典列表,其中术语作为键,术语频率作为值。
这里的负值到底是什么意思?
【问题讨论】:
标签: python scikit-learn
我希望FeatureHasher 的输出稀疏矩阵中的所有值都是非负的,因为我认为它应该只计算术语频率并在散列函数的帮助下对术语进行索引。当发生碰撞时,我希望它只是将“碰撞项”的频率相加。但是,似乎我错了,因为它实际上输出了一堆负值,给定一个字典列表,其中术语作为键,术语频率作为值。
这里的负值到底是什么意思?
【问题讨论】:
标签: python scikit-learn
如果输入值都是正值(词频),那么负值实际上没有任何意义。引用scikit-learn docs:
由于哈希函数可能会导致(不相关的)特征之间发生冲突,因此使用带符号的哈希函数,哈希值的符号决定了存储在特征输出矩阵中的值的符号。这样,碰撞可能会被抵消而不是累积误差,并且任何输出特征值的预期均值为零。
维基百科有一个little table 显示这个方案的效果,它是由Weinberger et al. 发明的。它不仅减轻了碰撞的影响,而且使您的特征表现得更像高斯,这有助于一些学习算法。
如果您想摆脱负值,请将non_negative=True 传递给FeatureHasher 构造函数。该选项的实现有点小技巧,但它使 tf-idf 和朴素贝叶斯再次起作用。
【讨论】: