ValueError:使用sklearn TSNE时,度量'余弦'对算法'ball_tree'无效

时间:2017-10-17 13:18:28

标签: python scikit-learn

包装版本:

numpy:1.13.3

sklearn:0.19.0

scipy:0.19.1

我有一个密集矩阵svd_matrix

svd_matrix.shape
>>> (30000,50)

我想使用'余弦'作为指标

在scikit TSNE实现上训练这个
tsne = sklearn.manifold.TSNE(n_components=2, random_state=0, metric='cosine')
matrix_2d = tsne.fit_transform(svd_matrix)
>>> ValueError: Metric 'cosine' not valid for algorithm 'ball_tree'

但是我得到了上面的错误。我上周正在训练这个模型并且工作正常,但我同时更新了我的软件包版本,但我不认为这会导致问题?无论如何,软件包版本都在上面。

algorithm不是manifold.TSNE的参数,因此我不能将'brute'作为建议here

的参数

有人能说出这里出了什么问题以及如何解决这个问题?谢谢

1 个答案:

答案 0 :(得分:3)

TSNE(0.19 !!!)的代码似乎在every case中使用BallTree(但是预先计算好的):

neighbors_method = 'ball_tree'
if (self.metric == 'precomputed'):
    neighbors_method = 'brute'
knn = NearestNeighbors(algorithm=neighbors_method, n_neighbors=k,
                               metric=self.metric)

现在BallTree中允许哪些指标:

from sklearn.neighbors import BallTree
BallTree.valid_metrics
# ['seuclidean', 'hamming', 'dice', 'jaccard', 'matching', 'russellrao', 
  'euclidean', 'kulsinski', 'wminkowski', 'chebyshev', 'mahalanobis',
  'sokalmichener', 'rogerstanimoto', 'infinity', 'p', 'canberra',
  'haversine', 'sokalsneath', 'l1', 'minkowski', 'pyfunc', 'l2',
  'cityblock', 'braycurtis', 'manhattan']

TSNE的代码库is quite active并且可能会有一些重大变化描述您的观察以及事实,即它在上班前没有检查指标。

This pull-request似乎添加了对cosine指标的支持,在这种情况下不使用BallTree!由于这似乎是合并的,我认为如果你从当前的主分支安装sklearn会起作用!

编辑:它在master-branch中实际工作(如预期的那样)!

从当前主分支(e049b1d35fba9fa688d81a6511be38a73ae824cc; 17.10.2017)安装sklearn时,下面的内容没什么意义(只是一个演示),运行没有任何错误。

from sklearn.datasets.samples_generator import make_blobs
from sklearn.manifold import TSNE

X, y = make_blobs(n_samples=10, centers=3, n_features=2,
              random_state=0)

tsne = TSNE(n_components=2, random_state=0, metric='cosine')
matrix_2d = tsne.fit_transform(X)
# OK!