# 4.7. 成对的矩阵, 类别和核函数
校验者:
[@FontTian](https://github.com/FontTian)
[@numpy](https://github.com/apachecn/scikit-learn-doc-zh)
翻译者:
[@程威](https://github.com/apachecn/scikit-learn-doc-zh)
The [`sklearn.metrics.pairwise`](classes.html#module-sklearn.metrics.pairwise "sklearn.metrics.pairwise") 子模块实现了用于评估成对距离或样本集合之间的联系的实用程序。
本模块同时包含距离度量和核函数,对于这两者这里提供一个简短的总结。
距离度量是形如 `d(a, b)` 例如 `d(a, b) < d(a, c)`如果对象 `a` 和 `b` 被认为 “更加相似” 相比于 `a`和 `c`. 两个完全相同的目标的距离是零。最广泛使用的例子就是欧几里得距离。 为了保证是 ‘真实的’ 度量, 其必须满足以下条件:
> 1. 对于所有的 a 和 b,d(a, b) >= 0
> 2. 正定性:当且仅当 a = b时,d(a, b) == 0
> 3. 对称性:d(a, b) == d(b, a)
> 4. 三角不等式:d(a, c) <= d(a, b) + d(b, c)
核函数是相似度的标准. 如果对象 `a` 和 `b` 被认为 “更加相似” 相比对象 `a` 和 `c`,那么 `s(a, b) > s(a, c)`. 核函数必须是半正定性的.
存在许多种方法将距离度量转换为相似度标准,例如核函数。 假定 `D` 是距离, and `S` 是核函数:
> 1. `S = np.exp(-D * gamma)`, 其中 `gamma` 的一种选择是 `1 / num_features`
> 2. `S = 1. / (D / np.max(D))`
## 4.7.1. 余弦相似度
[`cosine_similarity`](generated/sklearn.metrics.pairwise.cosine_similarity.html#sklearn.metrics.pairwise.cosine_similarity "sklearn.metrics.pairwise.cosine_similarity") 计算L2正则化的向量的点积. 也就是说, if ![x](https://box.kancloud.cn/8b09310f09e864e3a4f6d92b559afe29_10x8.jpg) 和 ![y](https://box.kancloud.cn/0255a09d3dccb9843dcf063bbeec303f_9x12.jpg) 都是行向量,, 它们的余弦相似度 ![k](https://box.kancloud.cn/300675e73ace6bf4c352cfbb633f0199_9x13.jpg) 定义为:
![k(x, y) = \frac{x y^\top}{\|x\| \|y\|}](https://box.kancloud.cn/bff758312e7d686f4c4f9ce2b4429ba9_133x45.jpg)
这被称为余弦相似度, 因为欧几里得(L2) 正则化将向量投影到单元球面内,那么它们的点积就是被向量表示的点之间的角度。
这种核函数对于计算以tf-idf向量表示的文档之间的相似度是一个通常的选择. [`cosine_similarity`](generated/sklearn.metrics.pairwise.cosine_similarity.html#sklearn.metrics.pairwise.cosine_similarity "sklearn.metrics.pairwise.cosine_similarity") 接受 `scipy.sparse` 矩阵. (注意到 `sklearn.feature_extraction.text`中的tf-idf函数能计算归一化的向量,在这种情况下 [`cosine_similarity`](generated/sklearn.metrics.pairwise.cosine_similarity.html#sklearn.metrics.pairwise.cosine_similarity "sklearn.metrics.pairwise.cosine_similarity")等同于 [`linear_kernel`](generated/sklearn.metrics.pairwise.linear_kernel.html#sklearn.metrics.pairwise.linear_kernel "sklearn.metrics.pairwise.linear_kernel"), 只是慢一点而已.)
References:
- C.D. Manning, P. Raghavan and H. Schütze (2008). Introduction to Information Retrieval. Cambridge University Press. <http://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html>
## 4.7.2. 线性核函数
函数 [`linear_kernel`](generated/sklearn.metrics.pairwise.linear_kernel.html#sklearn.metrics.pairwise.linear_kernel "sklearn.metrics.pairwise.linear_kernel") 是计算线性核函数, 也就是一种在 `degree=1` 和 `coef0=0` (同质化) 情况下的 [`polynomial_kernel`](generated/sklearn.metrics.pairwise.polynomial_kernel.html#sklearn.metrics.pairwise.polynomial_kernel "sklearn.metrics.pairwise.polynomial_kernel") 的特殊形式. 如果 `x` 和 `y` 是列向量, 它们的线性核函数是:
![k(x, y) = x^\top y](https://box.kancloud.cn/8e9d69b0299741ff66426aaea61bbff3_105x21.jpg)
## 4.7.3. 多项式核函数
函数 [`polynomial_kernel`](generated/sklearn.metrics.pairwise.polynomial_kernel.html#sklearn.metrics.pairwise.polynomial_kernel "sklearn.metrics.pairwise.polynomial_kernel") 计算两个向量的d次方的多项式核函数. 多项式核函数代表着两个向量之间的相似度.概念上来说,多项式核函数不仅考虑相同维度还考虑跨维度的向量的相似度。当被用在机器学习中的时候,这可以原来代表着特征之间的 相互作用。多项式函数定义为:
![k(x, y) = (\gamma x^\top y +c_0)^d](https://box.kancloud.cn/386e51a80d0e10f7402ddc7d1a1f9e7a_173x21.jpg)
其中:
> - `x`, `y` 是输入向量
> - `d` 核函数维度
如果 ![c_0 = 0](https://box.kancloud.cn/43e47a01b6cb21eaea6aeb8214fbc43d_48x15.jpg) 那么核函数就被定义为同质化的.
## 4.7.4. Sigmoid 核函数
函数 [`sigmoid_kernel`](generated/sklearn.metrics.pairwise.sigmoid_kernel.html#sklearn.metrics.pairwise.sigmoid_kernel "sklearn.metrics.pairwise.sigmoid_kernel") 计算两个向量之间的S型核函数. S型核函数也被称为双曲切线或者 多层感知机(因为在神经网络领域,它经常被当做激活函数). S型核函数定义为:
![k(x, y) = \tanh( \gamma x^\top y + c_0)](https://box.kancloud.cn/161a1cacebd2ec0ffe9231da02a835e7_201x21.jpg)
where:
> - `x`, `y` 是输入向量
> - ![\gamma](https://box.kancloud.cn/502b69cbaa2eaab1fc4bf35906e10418_10x12.jpg) 是斜度
> - ![c_0](https://box.kancloud.cn/7dae2ff0f64032ef341a95a2d53cbd8e_14x11.jpg) 是截距
## 4.7.5. RBF 核函数
函数 [`rbf_kernel`](generated/sklearn.metrics.pairwise.rbf_kernel.html#sklearn.metrics.pairwise.rbf_kernel "sklearn.metrics.pairwise.rbf_kernel") 计算计算两个向量之间的径向基函数核 (RBF) 。 其定义为:
![k(x, y) = \exp( -\gamma \| x-y \|^2)](https://box.kancloud.cn/a382777d0b7ae9d57e58303808a9e6cf_206x21.jpg)
其中 `x` 和 `y` 是输入向量. 如果 ![\gamma = \sigma^{-2}](https://box.kancloud.cn/f0c38c45c8f2b49f3a415552682a4f30_61x19.jpg)核函数就变成方差为 ![\sigma^2](https://box.kancloud.cn/08855da6e80bbdef8f4c044b50529936_17x15.jpg) 的高斯核函数.
## 4.7.6. 拉普拉斯核函数
函数 [`laplacian_kernel`](generated/sklearn.metrics.pairwise.laplacian_kernel.html#sklearn.metrics.pairwise.laplacian_kernel "sklearn.metrics.pairwise.laplacian_kernel") 是一种径向基函数核的变体,定义为:
![k(x, y) = \exp( -\gamma \| x-y \|_1)](https://box.kancloud.cn/94a0283ee7340a3f01bc75ece6f06666_206x19.jpg)
其中 `x` 和 `y` 是输入向量 并且 ![\|x-y\|_1](https://box.kancloud.cn/674e433bcbfa82fa7ab019c277f4c091_64x19.jpg) 是输入向量之间的曼哈顿距离.
已被证明在机器学习中运用到无噪声数据中是有用的. 可见例如 [Machine learning for quantum mechanics in a nutshell](http://onlinelibrary.wiley.com/doi/10.1002/qua.24954/abstract/).
## 4.7.7. 卡方核函数
在计算机视觉应用中训练非线性支持向量机时,卡方核函数是一种非常流行的选择.它能以 [`chi2_kernel`](generated/sklearn.metrics.pairwise.chi2_kernel.html#sklearn.metrics.pairwise.chi2_kernel "sklearn.metrics.pairwise.chi2_kernel") 计算然后将参数 [``](#id7)kernel=”precomputed”[``](#id9)传递到[`sklearn.svm.SVC`](generated/sklearn.svm.SVC.html#sklearn.svm.SVC "sklearn.svm.SVC") :
```
>>> from sklearn.svm import SVC
>>> from sklearn.metrics.pairwise import chi2_kernel
>>> X = [[0, 1], [1, 0], [.2, .8], [.7, .3]]
>>> y = [0, 1, 0, 1]
>>> K = chi2_kernel(X, gamma=.5)
>>> K
array([[ 1. , 0.36..., 0.89..., 0.58...],
[ 0.36..., 1. , 0.51..., 0.83...],
[ 0.89..., 0.51..., 1. , 0.77... ],
[ 0.58..., 0.83..., 0.77... , 1. ]])
```
```
>>> svm = SVC(kernel='precomputed').fit(K, y)
>>> svm.predict(K)
array([0, 1, 0, 1])
```
也可以直接使用 `kernel` 变量:
```
>>> svm = SVC(kernel=chi2_kernel).fit(X, y)
>>> svm.predict(X)
array([0, 1, 0, 1])
```
卡方核函数定义为
![k(x, y) = \exp \left (-\gamma \sum_i \frac{(x[i] - y[i]) ^ 2}{x[i] + y[i]} \right )](https://box.kancloud.cn/c2d76f4ffd47c5da52a70aa4e3d4757d_286x55.jpg)
数据假定为非负的,并且已经以L1正则化。 归一化随着与卡方平方距离的连接而被合理化,其是离散概率分布之间的距离。
卡方核函数最常用于可视化词汇的矩形图。
参考:
- Zhang, J. and Marszalek, M. and Lazebnik, S. and Schmid, C. Local features and kernels for classification of texture and object categories: A comprehensive study International Journal of Computer Vision 2007 <http://research.microsoft.com/en-us/um/people/manik/projects/trade-off/papers/ZhangIJCV06.pdf>
- scikit-learn 0.19 中文文档
- 用户指南
- 1. 监督学习
- 1.1. 广义线性模型
- 1.2. 线性和二次判别分析
- 1.3. 内核岭回归
- 1.4. 支持向量机
- 1.5. 随机梯度下降
- 1.6. 最近邻
- 1.7. 高斯过程
- 1.8. 交叉分解
- 1.9. 朴素贝叶斯
- 1.10. 决策树
- 1.11. 集成方法
- 1.12. 多类和多标签算法
- 1.13. 特征选择
- 1.14. 半监督学习
- 1.15. 等式回归
- 1.16. 概率校准
- 1.17. 神经网络模型(有监督)
- 2. 无监督学习
- 2.1. 高斯混合模型
- 2.2. 流形学习
- 2.3. 聚类
- 2.4. 双聚类
- 2.5. 分解成分中的信号(矩阵分解问题)
- 2.6. 协方差估计
- 2.7. 经验协方差
- 2.8. 收敛协方差
- 2.9. 稀疏逆协方差
- 2.10. Robust 协方差估计
- 2.11. 新奇和异常值检测
- 2.12. 密度估计
- 2.13. 神经网络模型(无监督)
- 3. 模型选择和评估
- 3.1. 交叉验证:评估估算器的表现
- 3.2. 调整估计器的超参数
- 3.3. 模型评估: 量化预测的质量
- 3.4. 模型持久化
- 3.5. 验证曲线: 绘制分数以评估模型
- 4. 数据集转换
- 4.1. Pipeline(管道)和 FeatureUnion(特征联合): 合并的评估器
- 4.2. 特征提取
- 4.3. 预处理数据
- 4.4. 无监督降维
- 4.5. 随机投影
- 4.6. 内核近似
- 4.7. 成对的矩阵, 类别和核函数
- 4.8. 预测目标 (y) 的转换
- 5. 数据集加载工具
- 6. 大规模计算的策略: 更大量的数据
- 7. 计算性能
- 教程
- 使用 scikit-learn 介绍机器学习
- 关于科学数据处理的统计学习教程
- 机器学习: scikit-learn 中的设置以及预估对象
- 监督学习:从高维观察预测输出变量
- 模型选择:选择估计量及其参数
- 无监督学习: 寻求数据表示
- 把它们放在一起
- 寻求帮助
- 处理文本数据
- 选择正确的评估器(estimator)
- 外部资源,视频和谈话