2017-10-17 93 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