本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~

在机器学习领域, kernel trick是一种非常有效的比较两个样本(对象)的方法. 给定两个对象$x_i, x_j \in \mathcal{X}$, 用$k(x_i, x_j) :=\left <\phi(x_i), \phi(x_j)\right>$来比较两个对象的特征$\phi(x_i), \phi(x_j)$. kernel trick通过定义一个半正定核矩阵$k$, 可以在不得到$\phi(x_i)$的情况下隐式的得到高维向量$\phi(x_i)$和$\phi(x_j)$的内积, 大大减少计算时间. 但是Weinberger[1]等人提出, 在实际中, 尤其是文本分类领域, 原始的输入空间几乎是线性可分的, 但是, 训练集太大, 特征维度太高. 在这种情况下, 没必要把输入向量映射到一个高维的特征空间. 相反的, 有限的内存可能存不下核矩阵. 为此, Langford[2], Qinfeng Shi[3]等人提出了hashing trick, 把高维的输入向量哈希到一个低维的特征空间$\mathbb{R}^m$.

1. Hashing Trick

最简单的hashing trick是将原始的每个特征名(或者特征索引)hash到一个低维向量的索引上, 然后将该特征的值累加到该低维向量的索引上:

$\bar{\phi}_j(x) = \sum_{i\in \mathcal{J}; h(i) = j}\phi_i(x)$

其中$\phi(x) \in \mathbb{R}^{\mathcal{J}}$为原始的输入向量, $h: \mathcal{J} \to {1,..,n}$为哈希函数. 算法伪代码为:

 function hashing_vectorizer(features : array of string, N : integer):
x := new vector[N]
for f in features:
h := hash(f) # f 是特征名, 也可以是特征的索引
x[h mod N] += 1 # 此处累加的是1, 也可以是特征的值
return x

2. Signed Hash Trick

Weinberger等人提出了一个新的变种, 可以称作signed hash trick.  做法是累加的值不再是固定的1或者特征值, 而是由另外一个哈希函数确定: $\xi : \mathbb{N} \to {\pm 1}$, 这样的好处是可以得到一个无偏的估计.

$\bar{\phi}_j(x) = \sum_{i\in \mathcal{J}; h(i) = j}\xi(i)\phi_i(x)$

算法伪代码为:

 function hashing_vectorizer(features : array of string, N : integer):
x := new vector[N]
for f in features:
h := hash(f)
idx := h mod N
if ξ(f) == 1:
x[idx] += 1 # 此处累加的是1, 也可以是特征值
else:
x[idx] -= 1 # 此处累加的是-1, 也可以是特征值 * -1
return x

3. Multiple Hashing

为了防止哈希冲突(亦即不同的特征被哈希到了相同的索引上)带来的负面影响, 可以对那些特征值比较大的特征哈希多次, 如果哈希$c$次, 则每个索引需要累加的值为$\frac{1}{\sqrt{c}}\phi_i(x)$[1].

参考文献:

[1]. Feature Hashing for Large Scale Multitask Learning. K. Weinberger, A. Dasgupta, J. Attenberg, J. Longford, A.Smola. ICML, 2010.

[2]. Vow- pal wabbit online learning project (Technical Report). http://hunch.net/?p=309. Langford, J., Li, L., & Strehl, A. (2007).

[3]. Hash kernels. AISTATS 12. Shi, Q., Petterson, J., Dror, G., Langford, J., Smola, A., Strehl, A., & Vishwanathan, V. (2009).

[4]. Wikipedia: Feature Hashing

[5]. Mahout in Action, page 261. Section 14.3.1 Representing data as a vector: Feature Hashing.

Hashing Trick的更多相关文章

  1. PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)

    主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...

  2. GBDT原理及利用GBDT构造新的特征-Python实现

    1. 背景 1.1 Gradient Boosting Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向.损失函数是 ...

  3. [Localization] MobileNet with SSD

    先来一波各版本性能展览: Pre-trained Models Choose the right MobileNet model to fit your latency and size budget ...

  4. Deep learning with Python 学习笔记(5)

    本节讲深度学习用于文本和序列 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所有神经网络一 ...

  5. 2.keras实现-->字符级或单词级的one-hot编码 VS 词嵌入

    1. one-hot编码 # 字符集的one-hot编码 import string samples = ['zzh is a pig','he loves himself very much','p ...

  6. 网络压缩论文整理(network compression)

    1. Parameter pruning and sharing 1.1 Quantization and Binarization Compressing deep convolutional ne ...

  7. 网络压缩论文集(network compression)

    Convolutional Neural Networks ImageNet Models Architecture Design Activation Functions Visualization ...

  8. what difference between libfm and libffm

    https://www.kaggle.com/users/25112/steffen-rendle/forum Congratulations to Yu-Chin, Wei-Sheng, Yong ...

  9. scikit-learn:4.2.3. Text feature extraction

    http://scikit-learn.org/stable/modules/feature_extraction.html 4.2节内容太多,因此将文本特征提取单独作为一块. 1.the bag o ...

随机推荐

  1. [芯片][MPU6050] MPU60X0的DMP相关链接

    标题:发个自己做的UD分解+强跟踪卡尔曼滤波做的双轴姿态测量 链接:http://www.amobbs.com/thread-5511854-1-1.html 关键词:UD分解+强跟踪卡尔曼滤波,采用 ...

  2. JAXB命名空间及命名空间前缀处理

    本篇介绍下JAXB进阶使用,命名空间处理 使用package-info.java添加默认命名空间在需要添加命名空间的包下面添加package-info.java文件,然后添加@XmlSchema注解, ...

  3. Atitit.html css  浏览器原理理论概论导论attilax总结

    Atitit.html css  浏览器原理理论概论导论attilax总结 1.1. 浏览器是怎样工作的:渲染引擎,HTML解析(连载二)1 2. 5.1.1 DOM标准 1011 3. <We ...

  4. javascript基础08

    发现今天居然没有要写,那我就写写之前做的笔记吧. 这是事件的深入: 拖拽逻辑: 第一个: onmousedown : 选择元素 第二个: onmousemove : 移动元素 第三个:onmouseu ...

  5. C# 设置和获取一个字节的某一位的值的方法

    自己工作中遇到需要对单字节的高位.低位进行赋值,即一个字节byte,想要给每一位都赋值,这个值是动态来的,是0或是1. 好不容易收集到一些珍贵资料,整理一下: 一.设置 方法code: /// < ...

  6. Swift - 计算文本高度

    Swift - 计算文本高度 效果 源码 // // String+StringHeight.swift // StringHeight // // Created by YouXianMing on ...

  7. Reservoir Sampling 蓄水池抽样算法,经典抽样

    随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...

  8. C++多线程开发之actor model

    最近想把写过的一个多线程程序整理一下,这个程序主要特点是有一系列的互相之间有依赖关系的task.于是在网上找相关类库 1,一类是简单的线程池了,这也是原本俺的做法.之前使用的是手工调度,代码实现的很蛋 ...

  9. Qt txt文本中获取字符串的问题

    QT对txt文本进行读写一般是采用QFile和QTextStream结合使用,在此不细说,主要说一下读取txt文本的注意事项.因为txt文本中有中文也有英文还有数字,要准确获得需要的字串可就要多一个心 ...

  10. jquery.jqzoom.js图片放大镜

    jqzoom插件实现图片放大镜效果 1. jquery.jqzoom.js //************************************************************ ...