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; 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!