【翻訳】scikit-learn 0.19 User Guide 4.7. ペアワイズメトリック、類似性およびカーネル

http://scikit-learn.org/0.19/modules/metrics.html を google 翻訳した
[scikit-learn 0.19 ユーザーガイド 4. データセット変換](https://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%A4%89%E6%8F%9B) より

----

# 4.7. ペアワイズメトリック、類似性およびカーネル

[sklearn.metrics.pairwise](http://scikit-learn.org/0.19/modules/classes.html#module-sklearn.metrics.pairwise) サブモジュールは、サンプルセットのペアワイズ距離または親和性を評価するためのユーティリティを実装します。
このモジュールには、距離メトリックとカーネルの両方が含まれています。ここで2つの簡単な概要を説明します。
距離メトリックは、 `a` と `b` の関係が `a` と `c` に比べて「より類似している」と考えられる場合、 `d(a, b) < d(a, c)` となるような関数 `d(a, b)` である。 2つのオブジェクトはまったく同じようにゼロの距離を持ちます。最も一般的な例の1つがユークリッド距離です。 「真の」測定基準であるためには、以下の4つの条件に従わなければならない。

  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を距離とし、Sをカーネルとする。

  1. `S = np.exp(-D * gamma)`。 `gamma` は例えば `1 / num_features`
  2. `S = 1. / (D / np.max(D))`

## 4.7.1. コサイン類似度

[cosine_similarity](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.cosine_similarity.html#sklearn.metrics.pairwise.cosine_similarity)  は、ベクトルのL2正規化内積を計算します。つまり、xとyが行ベクトルの場合、そのコサイン類似度kは次のように定義されます。

```math
k(x, y) = \frac{x y^\top}{\|x\| \|y\|}
```

これは、ユークリッド（L2）正規化が単位球上にベクトルを投影するので、コサイン類似度と呼ばれ、そのドット積は、ベクトルによって示される点間の角度の余弦である。
このカーネルは、tf-idfベクトルとして表されるドキュメントの類似性を計算するための一般的な選択です。 cosine_similarity は `scipy.sparse` 行列を受け入れます。 （ `sklearn.feature_extraction.text` のtf-idf機能が正規化されたベクトルを生成できることに注意してください。この場合、cosine_similarityは [linear_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.linear_kernel.html#sklearn.metrics.pairwise.linear_kernel) と同等であり、遅くなります）。

  * 参考文献：
    * C.D. Manning、P. RaghavanおよびH.Schütze（2008）。情報検索入門。ケンブリッジ大学出版局。 http://nlp.stanford.edu/IR-book/html/htmledition/the-vector-space-model-for-scoring-1.html

## 4.7.2. リニアカーネル

関数 [linear_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.linear_kernel.html#sklearn.metrics.pairwise.linear_kernel) は線形カーネルを計算します。すなわちdegree = 1かつcoef0 = 0（同次）の [polynomial_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.polynomial_kernel.html#sklearn.metrics.pairwise.polynomial_kernel) の特殊なケースです。 xとyが列ベクトルの場合、その線形カーネルは次のようになります。

```math
k(x, y) = x^\top y
```

## 4.7.3. 多項式カーネル

関数 [polynomial_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.polynomial_kernel.html#sklearn.metrics.pairwise.polynomial_kernel) は、2つのベクトル間の次数多項式カーネルを計算します。多項式カーネルは、2つのベクトル間の類似性を表す。概念的には、多項式カーネルは、同じ次元のベクトル間の類似度だけでなく、次元間の類似度も考慮する。機械学習アルゴリズムで使用される場合、これにより、機能の相互作用を考慮に入れることができます。
多項式カーネルは次のように定義されます。

```math
k(x, y) = (\gamma x^\top y +c_0)^d
```

ここで：
  * `x` 、`y` は入力ベクトル
  * `d` はカーネルの次数

$c_0 = 0$ の場合、カーネルは同質であると言います。

## 4.7.4. シグモイドカーネル

関数 [sigmoid_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.sigmoid_kernel.html#sklearn.metrics.pairwise.sigmoid_kernel) は、2つのベクトル間のシグモイドカーネルを計算します。シグモイドカーネルは、双曲線正接、または多層パーセプトロン（ニューラルネットワーク分野ではしばしばニューロン活性化関数として使用されるため）としても知られています。これは次のように定義されます。

```math
k(x, y) = \tanh( \gamma x^\top y + c_0)
```

ここで：

  * `x` 、`y` は入力ベクトル
  * $\gamma$ は勾配として知られている
  * $c_0$ はインターセプトとして知られています

## 4.7.5. RBFカーネル

関数 [rbf_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.rbf_kernel.html#sklearn.metrics.pairwise.rbf_kernel) は、2つのベクトル間の放射基底関数（RBF）カーネルを計算します。このカーネルは次のように定義されます：

```math
k(x, y) = \exp( -\gamma \| x-y \|^2)
```

`x` と `y` は入力ベクトルです。 $\gamma = \sigma^{-2}$ の場合、カーネルは分散 $\sigma^{-2}$ のガウスカーネルとして知られています。

## 4.7.6. ラプラシアンカーネル

関数 [laplacian_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.laplacian_kernel.html#sklearn.metrics.pairwise.laplacian_kernel) は、ラジアル基底関数カーネルの変形で、次のように定義されています。

```
k(x, y) = \exp( -\gamma \| x-y \|_1)
```

`x` と `y` は入力ベクトル、 $ \|x-y\|_1$ は入力ベクトル間のマンハッタン距離です。
雑音の多いデータに適用されたMLでは有用であることが証明されている。例えば、[ナッツシェルで量子力学のための機械学習](http://onlinelibrary.wiley.com/doi/10.1002/qua.24954/abstract/)

## 4.7.7. カイ二乗カーネル

カイ2乗カーネルは、コンピュータビジョンアプリケーションでの非線形SVMのトレーニングに非常によく使用されます。これは [chi2_kernel](http://scikit-learn.org/0.19/modules/generated/sklearn.metrics.pairwise.chi2_kernel.html#sklearn.metrics.pairwise.chi2_kernel) を使って計算でき、 `kernel="precomputed"` で [sklearn.svm.SVC](http://scikit-learn.org/0.19/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC) に渡されます：

```pycon
>>> 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])
```

カーネル引数として直接使用することもできます。

```pycon
>>> svm = SVC(kernel=chi2_kernel).fit(X, y)
>>> svm.predict(X)
array([0, 1, 0, 1])
```

カイ2乗カーネルは

```math
k(x, y) = \exp \left (-\gamma \sum_i \frac{(x[i] - y[i]) ^ 2}{x[i] + y[i]} \right )
```

データは非負であると仮定され、L1ノルムが1になるようにしばしば正規化されます。正規化は、離散確率分布間の距離であるカイ二乗距離への接続によって合理化される。
カイ2乗カーネルは、視覚的な単語のヒストグラム（バッグ）に最も一般的に使用されます。

  * 参考文献：
    * 局所的特徴と物体カテゴリの分類のための局所特徴と核：包括的な研究コンピュータビジョン2007の国際ジャーナルhttp://research.microsoft.com/en-us/um/people/manik/projects/trade-off/papers/ZhangIJCV06.pdf

----
[scikit-learn 0.19 ユーザーガイド 4. データセット変換](https://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%A4%89%E6%8F%9B) より


©2010 - 2016、scikit-learn developers（BSDライセンス）。