2017-09-04 5 views
0

J'ai un ordinateur portable Lenovo IdeaPad avec 8 Go de RAM et un processeur Intel Core I5. J'ai 60k points de données chaque 100 dimensionnel. Je veux faire KNN et pour cela j'utilise l'algorithme LMNN pour trouver une métrique de Mahalanobis.
Le problème est après 2 heures de fonctionnement un écran vide apparaît sur mon ubuntu. Je ne comprends pas quel est le problème! Ma mémoire est-elle pleine ou autre?
Alors, y a-t-il un moyen d'optimiser ce code?

Mon jeu de données: data
Ma mise en œuvre LmnN:Comment réussir à exécuter un algorithme ML avec un ensemble de données de taille moyenne sur un ordinateur portable médiocre?

import numpy as np 
import sys 
from modshogun import LMNN, RealFeatures, MulticlassLabels 
from sklearn.datasets import load_svmlight_file 

def main(): 

    # Get training file name from the command line 
    traindatafile = sys.argv[1] 

    # The training file is in libSVM format 
    tr_data = load_svmlight_file(traindatafile); 

    Xtr = tr_data[0].toarray(); # Converts sparse matrices to dense 
    Ytr = tr_data[1]; # The trainig labels 

    # Cast data to Shogun format to work with LMNN 
    features = RealFeatures(Xtr.T) 
    labels = MulticlassLabels(Ytr.astype(np.float64)) 



    # Number of target neighbours per example - tune this using validation 
    k = 18 

    # Initialize the LMNN package 
    lmnn = LMNN(features, labels, k) 
    init_transform = np.eye(Xtr.shape[1]) 

    # Choose an appropriate timeout 
    lmnn.set_maxiter(200000) 
    lmnn.train(init_transform) 

    # Let LMNN do its magic and return a linear transformation 
    # corresponding to the Mahalanobis metric it has learnt 
    L = lmnn.get_linear_transform() 
    M = np.matrix(np.dot(L.T, L)) 

    # Save the model for use in testing phase 
    # Warning: do not change this file name 
    np.save("model.npy", M) 

if __name__ == '__main__': 
    main() 
+0

as-tu veillé à obtenir un résultat avec un ensemble plus petit? – Julien

+0

Oui, j'obtiens un résultat avec un plus petit ensemble. c'est-à-dire avec environ 0,5 K points de données au lieu de 60K. – Fenil

+0

Évidemment, il a besoin de plus de processeur et ram pour traiter les données, ce n'est pas le problème avec le code. –

Répondre

0

k-NN Exact a des problèmes d'évolutivité. Scikit-learn a documentation page (stratégies de mise à l'échelle) sur quoi faire dans une telle situation (de nombreux algorithmes ont la méthode partial_fit, mais malheureusement, kNN ne l'a pas).

Si vous acceptez d'échanger une certaine précision pour la vitesse, vous pouvez exécuter quelque chose comme approximate nearest neighbors.