【问题标题】:ValueError: Metric 'cosine' not valid for algorithm 'ball_tree' when using sklearn TSNEValueError:使用 sklearn TSNE 时,度量“余弦”对算法“ball_tree”无效
【发布时间】:2023-04-02 08:15:01
【问题描述】:

软件包版本:

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 的参数

谁能建议这里出了什么问题以及如何解决这个问题?谢谢

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    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!
    

    【讨论】:

    • 感谢@sascha ...尽管从 master 分支安装并构建它之后,这似乎仍然不起作用。希望这个问题在下一个版本更新中得到解决。我不明白他们为什么要摆脱它?
    • 可能不是因为他们想要,而是更多地作为艰难的设计决策(和持续开发)的副作用。我认为可能会有从密集矩阵到稀疏矩阵的转变。仅此一项就可能对很多东西造成致命影响(尤其是破坏稀疏性的指标;但这只是一个示例,此处不一定正确)。
    • @killerT2333 刚刚启动了我的虚拟机。当使用 master-branch 中的 sklearn 时,您的任务(请参阅我的代码)实际上有效!
    • 我在使用 0.19.0 版本时遇到了这个问题,升级到 0.19.1 后已解决。
    猜你喜欢
    • 2016-08-01
    • 2020-02-24
    • 2020-08-12
    • 2019-04-11
    • 2017-06-22
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多