Gestion des matrices clairsemées dans Scipy

Un mémo qui calcule la similitude et la distance des vecteurs de documents clairsemés avec python

Opérations de base lors de l'utilisation de matrices éparses dans Scipy Je l'ai écrit il y a longtemps, alors peut-être que quelque chose ne va pas

Calcul matriciel


import scipy.sparse as sp
import numpy as np

a = sp.lil_matrix((1, 10000)) # 1*10000 matrices creuses sont créées
b = sp.lil_matrix((1, 10000))
# a.shape => (1, 10000)
for i in xrange(a.shape[1]):
	r = np.random.rand()
	if r < 0.9:
		r = 0.0
	a[0, i] = r
#Les valeurs numériques sont stockées aléatoirement dans chaque élément d'un
a
# => <1x10000 sparse matrix of type '<type 'numpy.float64'>'
        with 947 stored elements in LInked List format>
#b fait de même

conversion


ca = a.tocsr()
ca
# => <1x10000 sparse matrix of type '<type 'numpy.float64'>'
        with 947 stored elements in Compressed Sparse Row format>
#lil =>est devenu rse

Produit matriciel


#Matrice de translocation
ta = a.T
#Produit matriciel
print a.dot(ta) # (1,1), Mais cela est également représenté par une matrice clairsemée
# => (0, 0)        853.19504342

Ampleur du vecteur


v = np.array([[1, 1]])
math.sqrt(np.dot(v, v.T))
# => 1.4142135623730951
np.linalg.norm(v)
# => 1.4142135623730951

np.linalg.norm(a)
# =>Erreur se produit
np.linalg.norm(a.todense())
np.linalg.norm(a.toarray())
# => 29.209502621916037

#Similitude cosinus
import scipy.spatial.distance as dis
dis.cosine(a.todense(), b.todense())
# => 0.91347774109309299

Distance euclidienne à matrice clairsemée


# -*- encoding: utf-8 -*-

import scipy.spatial.distance as dis
import scipy.sparse as sp
import numpy as np, scipy.io as io
import math

def sparse_distance(v1, v2):
    """1*Trouver la distance euclidienne entre N vecteurs
    args:
        v1, v2 : 1 *De N(Clairsemé)queue
    """
    if not sp.issparse(v1) or not sp.issparse(v2):
        #Utilisez l'euclidien intégré s'il ne s'agit pas d'une matrice clairsemée
        if v1.size != v2.size:
            raise ValueError
        return dis.euclidean(v1, v2)
    indexes1 = v1.rows.item()[:]
    indexes2 = v2.rows.item()[:]
    if indexes1.length != indexes2.length:
        raise ValueError
    indexes = indexes1 + indexes2  #Index où les deux vecteurs ne sont pas clairsemés
    euc_dis = 0.0
    for index in indexes:
        _dis = v1[0, index] - v2[0, index]
        euc_dis += _dis ** 2
    return math.sqrt(euc_dis)

Recommended Posts

Gestion des matrices clairsemées dans Scipy
Mettez scipy dans ec2
Gestion des erreurs dans PythonBox
Comment gérer l'hexadécimal en Python3
Gestion des devis en [bash]
Fonctions mathématiques trouvées dans Scipy
Traitement des URL relatives en python
Nombre bicomplexe considéré par la matrice d'expression
Gestion des attributs épars dans une structure arborescente (Python)
Y a-t-il un spécial dans scipy? ??
Gestion des fichiers JSON en Python
Gestion des fuseaux horaires en Python (datetime, pytz)