2016-04-11 5 views
5

У меня есть небольшая проблема для выполнения TSNE на моем наборе данных, используя сходство с косинусом.Косинус сходства TSNE в sklearn.manifold

Я вычислил косинус сходство всех мои векторов, поэтому у меня есть квадратная матрица, которая содержит мой косинус сходства:

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' для преобразования моего ввода. И ошибка, кажется, что оттуда ... я закодирован небольшая часть, которая не работает: 'от sklearn импорт многообразия импорта NumPy как нп A = np.matrix ([[1, 0,7 , 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

Я могу ответить на большинство ваших вопросов, однако я не совсем уверен, почему эта ошибка появляется во втором примере.

Вы рассчитали косинус-сходство каждого из ваших векторов, но scikit принимает матрицу расстояний для входа в TSNE. Однако это действительно простое преобразование distance = 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

Почему 'distance = 1 - сходство'? – mrgloom

+0

Он определен как показатель косинуса, вы можете видеть на странице [wiki] (https://en.wikipedia.org/wiki/Cosine_similarity) – ncfirth

1

В настоящее время существует ошибка. смотрите здесь: https://github.com/scikit-learn/scikit-learn/issues/5772

однако scikit T-СНЕ использует квадрат евклидова расстояния, которое пропорционально расстоянию косинус, предполагая, ваши данные L2 нормализуются

0

Может быть сделано с sklearn pairwise_distances:

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) 

Значения в distance_matrix будут в диапазоне [0,2], потому что (1 - [-1,1]).