2017-10-17 98 views
0

包版本:ValueError异常:公制 '余弦' 不是有效的算法 'ball_tree' 使用sklearn TSNE时

numpy的:1.13.3

sklearn:0.19.0

SciPy的:0.19.1

我有一个致密的基质svd_matrix

svd_matrix.shape 
>>> (30000,50) 

我要到t使用“余弦”作为度量标准

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' 

但是我得到上述错误下雨的scikit TSNE实施。我上周正在训练这个模型,并且运行良好,但是我同时更新了我的软件包版本,但我不认为这会导致问题?无论如何,软件包版本都在上面。

algorithm不是manifold.TSNE的说法,所以我不能给'brute'作为参数的建议here

任何人都可以建议是怎么回事错了,我怎么能解决这个问题?谢谢

回答

2

TSNE的代码(0.19 !!!)似乎every case使用BallTree(但预计算一个):什么指标BallTree内允许

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

现在:

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!

编辑:它实际上工作(如预期)在主分支!

从当前主分支安装sklearn(e049b1d35fba9fa688d81a6511be38a73ae824cc; 17.10.2017)时,以下几点没有太大意义(只是演示),运行时没有任何错误。

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! 
+0

谢谢@sascha ......尽管从主分支安装并构建它后,它仍然无法工作。希望这个get可以在下一个版本更新中解决。我不明白他们为什么会摆脱它? – killerT2333

+0

可能不是因为他们想要,而是更多的是作为艰难的设计决策(和正在进行的开发)的副作用。我认为可能会从密集矩阵切换到稀疏矩阵。对于许多东西来说,这本身可能是致命的(尤其是度量稀疏性的指标;但这仅仅是一个不一定真实的例子)。 – sascha

+0

@ killerT2333刚刚开启了我的虚拟机。从主分支使用sklearn时,你的任务(请参阅我的代码)实际上工作正常! – sascha