Dieser Artikel ist der Artikel zum 15. Tag des "Adventskalenders für maschinelles Lernen 2015". Hier ist eine kurze Zusammenfassung der "Sparse Matrix", die häufig bei der Implementierung von maschinellem Lernen verwendet wird.
SparseMatrix
Im Gegensatz zur allgemeinen DenseMatrix wird SparseMatrix häufig verwendet, wenn die Anzahl der Nicht-Null-Werte (Nicht-Null-Werte) im Verhältnis zur Länge des Vektors extrem klein ist. SparseMatrix ist DenseMatrix in folgender Hinsicht überlegen:
Diese Vorteile sind sehr effektiv, wenn die Größe der Matrix oder des Vektors groß genug und die Anzahl der Werte ungleich Null klein ist. Zum Beispiel, wenn mehrere Massenvariablen durch 1-of-K dargestellt werden. Dieses Mal werden wir der Einfachheit halber verschiedene Bibliotheken betrachten, die Vektoroperationen anstelle von Matrizen verwenden.
scipy.sparse
Wahrscheinlich das berühmteste, das hier beschrieben wird. Es ist auch in scikit-learn verfügbar, der bekanntesten Bibliothek für maschinelles Lernen in Python. Im Fall von sklearn.clustering.KMeans wird es beispielsweise [hier] geschrieben (http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans.fit). Wie Sie sind
X : array-like or sparse matrix
Es ist möglich, SparseMatrix für X wie folgt zu verwenden. Es gibt viele Möglichkeiten, eine SparseMatrix zu definieren. Weitere Informationen finden Sie in der offiziellen Dokumentation (http://docs.scipy.org/doc/scipy/reference/sparse.html).
Examples
Mal sehen, wie groß der Unterschied zwischen Dense und Sparse in der tatsächlichen Berechnung ist.
>>> import scipy.sparse as sp
>>> import numpy as np
>>> #Länge 1,000 Vektoren
>>> x1=np.zeros(10**3)
>>> x1[10]=5; x1[100]=10;
>>> y1=sp.lil_matrix(x1).tocsr()
>>> %time x1 * x1 %Element Produkt
21 μs
>>> %time y1.multiply(y1)
249 μs
>>> #Länge 1,000,000 Vektoren
>>> x2=np.zeros(10**6)
>>> x2[10]=5; x2[100]=10;
>>> y2=sp.lil_matrix(x2).tocsr()
>>> %time x2 * x2 %Element Produkt
4.15 ms
>>> %time y2.multiply(y2)
250 μs
Wie im obigen Beispiel gezeigt, ist die Berechnungszeit offensichtlich unterschiedlich, wenn die Länge des Vektors zunimmt. Im obigen Beispiel handelt es sich übrigens um ein Elementprodukt, aber im Falle einer Addition ist es schneller als DenseVector.
#In diesem Fall wird keine sparsame Operation ausgeführt.
%time y2 * y2.T
3.41 ms
#Dies ist Sparse's Operatio
%time y2.multiply(y2).sum()
447 µs
Theano Sie können das Paket theano.sparse laden und verwenden. Csr und csc, wie sie in scipy.sparse genannt werden, werden vorbereitet.
>>> from theano import sparse
Es ist einfach, aber ich werde das gleiche Beispiel oben mit Theano versuchen.
>>> 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
Wenn Sie mit einem gewöhnlichen Vektor rechnen,
>>> import theano.tensor as T
>>> x = T.dvector(name='x')
>>> f = theano.function([x], x * x)
>>> %time f(x1)
4.74 ms
Die Berechnung braucht Zeit. Ich denke, es wird nützlich sein, sich in einer Bibliothek wie Theano daran zu erinnern, wo Funktionen flexibel verwendet und Differenzierungen leicht berechnet werden können.
Zur Erinnerung
TensorFlow Wir bieten den viel diskutierten TensorFlowSparseTensor an.
>>> 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]]
Ich habe einige Nachforschungen angestellt, wusste aber nicht genau, wie ich es verwenden soll. (Ich werde es zu einem späteren Zeitpunkt aktualisieren)
Es ist einfach, aber ich habe SparseMatrix zusammengefasst. Ich lerne noch, also ist es in Ordnung, wenn ich es nicht verstehe. Wenn Sie also Vorschläge haben, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten. Wenn Sie maschinelles Lernen implementieren, insbesondere für das Online-Lernen, ist es effektiv. Wenn Sie es implementieren, sollten Sie SparseMatrix und DenseMatrix implementieren. ??
Recommended Posts