套件版本:
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
的参数,所以我不能像建议的here那样提供'brute'
作为参数谁能建议这里出了什么问题以及我该如何解决?谢谢
最佳答案
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,它将会起作用!编辑:它实际上在主分支中正常工作(按预期)!
从当前主分支(
e049b1d35fba9fa688d81a6511be38a73ae824cc
; 2017年10月17日)安装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!