Cet article est l'article du 15ème jour du "Calendrier de l'Avent de Machine Learning 2015". Voici un bref résumé de la «matrice clairsemée» qui est souvent utilisée lors de la mise en œuvre de l'apprentissage automatique.
SparseMatrix
Contrairement au DenseMatrix général, SparseMatrix est souvent utilisé lorsque le nombre de valeurs non nulles (valeurs non nulles) est extrêmement petit par rapport à la longueur du vecteur. SparseMatrix est supérieur à DenseMatrix des manières suivantes:
Ces avantages sont très efficaces lorsque la taille de la matrice ou du vecteur est suffisamment grande et que le nombre de valeurs non nulles est petit. Par exemple, lorsque plusieurs variables de masse sont représentées par 1 sur K. Cette fois, par souci de brièveté, nous examinerons diverses bibliothèques utilisant des opérations vectorielles au lieu de matrices.
scipy.sparse
Probablement le plus célèbre décrit ici. Il est également disponible dans scikit-learn, la bibliothèque d'apprentissage automatique la plus connue de Python. Par exemple, dans le cas de sklearn.clustering.KMeans, il est écrit ici. Comme vous êtes
X : array-like or sparse matrix
Il est possible d'utiliser SparseMatrix pour X de cette manière. Il existe de nombreuses façons de définir un SparseMatrix. Voir la documentation officielle (http://docs.scipy.org/doc/scipy/reference/sparse.html) pour plus d'informations.
Examples
Voyons la différence entre Dense et Sparse dans le calcul réel.
>>> import scipy.sparse as sp
>>> import numpy as np
>>> #Longueur 1,000 vecteurs
>>> x1=np.zeros(10**3)
>>> x1[10]=5; x1[100]=10;
>>> y1=sp.lil_matrix(x1).tocsr()
>>> %time x1 * x1 %Produit d'élément
21 μs
>>> %time y1.multiply(y1)
249 μs
>>> #Longueur 1,000,000 vecteurs
>>> x2=np.zeros(10**6)
>>> x2[10]=5; x2[100]=10;
>>> y2=sp.lil_matrix(x2).tocsr()
>>> %time x2 * x2 %Produit d'élément
4.15 ms
>>> %time y2.multiply(y2)
250 μs
Comme le montre l'exemple ci-dessus, le temps de calcul est évidemment différent à mesure que la longueur du vecteur augmente. À propos, dans l'exemple ci-dessus, il s'agit d'un produit d'élément, mais dans le cas de l'addition, il est plus rapide que DenseVector.
#Si tel est le cas, l'opération éparse ne sera pas effectuée.
%time y2 * y2.T
3.41 ms
#Voici l'opératio de Sparse
%time y2.multiply(y2).sum()
447 µs
Theano Vous pouvez charger et utiliser le package theano.sparse. Csr et csc comme ils sont appelés dans scipy.sparse sont préparés.
>>> from theano import sparse
C'est facile, mais je vais essayer le même exemple ci-dessus avec Theano.
>>> import theano
>>> from theano import sparse
>>> x = sparse.csr_matrix(name='x', dtype='float64')
>>> f = theano.function([x], sparse.basic.mul(x, x))
>>> %time f(y1)
312 µs
Bien sûr, si vous calculez avec un vecteur ordinaire,
>>> import theano.tensor as T
>>> x = T.dvector(name='x')
>>> f = theano.function([x], x * x)
>>> %time f(x1)
4.74 ms
Le calcul prend du temps. Je pense qu'il sera utile de se souvenir dans une bibliothèque comme Theano où les fonctions peuvent être utilisées de manière flexible et la différenciation peut être facilement calculée.
Cependant, pour rappel
TensorFlow Nous fournissons le TensorFlowSparseTensor dont on parle tant.
>>> import tensorflow as tf
>>> tf.SparseTensor(values=[1, 2], indices=[[0, 0], [1, 2]], shape=[3, 4])
[[1, 0, 0, 0]
[0, 0, 2, 0]
[0, 0, 0, 0]]
J'ai fait des recherches à ce sujet, mais je ne savais pas en détail comment l'utiliser. (Je le mettrai à jour à une date ultérieure)
C'est facile, mais j'ai résumé SparseMatrix. J'étudie toujours, donc ce n'est pas grave si je ne comprends pas, donc si vous avez des suggestions, je vous serais reconnaissant si vous pouviez commenter. Lors de la mise en œuvre de l'apprentissage automatique, il est particulièrement efficace pour l'apprentissage en ligne, alors pourquoi ne pas envisager d'implémenter SparseMatrix ainsi que DenseMatrix lors de sa mise en œuvre! ??
Recommended Posts