2016-04-11 23 views
5

コサイン類似度を使用して、私のデータセットでTSNEを実行するのに少し問題があります。skine.manifoldのコサイン類似度TSNE

私は私のすべてのベクトルのコサイン類似度を計算しているので、私は私のコサイン類似含ま正方行列があります。そのようなその後

A = [[ 1 0.7 0.5 0.6 ] 
    [ 0.7 1 0.3 0.4 ] 
    [ 0.5 0.3 1 0.1 ] 
    [ 0.6 0.4 0.1 1 ]] 

を、私が使用しているTSNE:

A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]]) 
model = manifold.TSNE(metric="precomputed") 
Y = model.fit_transform(A) 

しかし、私は私のコサイン類似性の感覚を保つ事前に計算されたメトリックを使用していることはよく分からない:

#[documentation][1] 
If metric is “precomputed”, X is assumed to be a distance matrix 

しかし、私はメトリックコサインを使用しようとすると、私はエラーを得た:

A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]]) 
model = manifold.TSNE(metric="cosine") 
Y = model.fit_transform(A) 

raise ValueError("All distances should be positive, either " 
ValueError: All distances should be positive, either the metric or 
precomputed distances given as X are not correct 

だから私の質問で、どのようにそれは存在しないデータセット(類似度行列)にコサインメトリックを使用してTSNEを行うことができますか?

+0

scikitはどのバージョンですか? - コードは私のために働く。 – cel

+0

申し訳ありませんが、コードを更新します。私は入力を変換するために関数 'fit_transform'を使用します。 そしてエラー、私は動作しない小さな部分をコード化している ...そこから来ているようだ: 'NP A = np.matrix([[1、0.7としてsklearnインポートマニホールド 輸入numpyのから、0.5,0.6]、[1,0.7,0.5,0.6]、[0.5,0.3,1,0.1]、[0.6,0.4,0.1,1]) モデル=マニホールド.TSNE(メトリック= "余弦") Y = model.fit_transform(A) ' – HugoLasticot

答えて

5

私はあなたの質問の大部分に答えることができますが、2番目の例でそのエラーがなぜポップアップしているのかよく分かりません。

各ベクトルのコサイン類似度を計算しましたが、scikitはTSNEへの入力の距離行列を前提としています。しかし、これは本当に単純な変換距離= 1 - 類似性です。あなたの例のために

import numpy as np 
from sklearn import manifold 
A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]]) 
A = 1.-A 
model = manifold.TSNE(metric="precomputed") 
Y = model.fit_transform(A) 

これはあなたに必要な変換を与えるはずです。

+0

ありがとう!私はちょうどそれについての論文を読みました。あなたは正しい、それは動作します。 より正確には、この値の平方根を足すことができます。同意しますか ? – HugoLasticot

+0

なぜ '距離= 1 - 類似性 'ですか? – mrgloom

+0

これはコサインメトリックの定義として定義されています。[wikiページ](https://en.wikipedia.org/wiki/Cosine_similarity) – ncfirth

1

現在、バグがあります。ここを参照してください:

from sklearn.manifold import TSNE 
from sklearn.metrics import pairwise_distances 

distance_matrix = pairwise_distances(X, X, metric='cosine', n_jobs=-1) 
model = TSNE(metric="precomputed") 
Xpr = model.fit_transform(distance_matrix) 

https://github.com/scikit-learn/scikit-learn/issues/5772

しかしscikitのt-SNEは、あなたのデータを仮定すると、

0

がsklearn pairwise_distancesで行うことができ、正規化さL2で、コサイン距離に比例する乗ユークリッド距離を使用しています(1 - [-1,1])のため、distance_matrixの値は[0,2]の範囲になります。

関連する問題