python - scikit - Cómo normalizar una matriz en NumPy?
sklearn example (5)
Estoy de acuerdo en que era bueno si tal función formaba parte de las baterías incluidas. Pero no lo es, hasta donde yo sé. Aquí hay una versión para ejes arbitrarios y que ofrece un rendimiento óptimo.
import numpy as np
def normalized(a, axis=-1, order=2):
l2 = np.atleast_1d(np.linalg.norm(a, order, axis))
l2[l2==0] = 1
return a / np.expand_dims(l2, axis)
A = np.random.randn(3,3,3)
print(normalized(A,0))
print(normalized(A,1))
print(normalized(A,2))
print(normalized(np.arange(3)[:,None]))
print(normalized(np.arange(3)))
Me gustaría tener la norma de una matriz NumPy. Más específicamente, estoy buscando una versión equivalente de esta función
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
¿Hay algo así en skearn
o numpy
?
Esta función funciona en una situación donde v
es el vector 0.
Puede especificar ord para obtener la norma L1. Para evitar la división cero, uso eps, pero quizás no sea genial.
def normalize(v):
norm=np.linalg.norm(v, ord=1)
if norm==0:
norm=np.finfo(v.dtype).eps
return v/norm
Si tiene datos multidimensionales y desea que cada eje se normalice a sí mismo:
def normalize(d):
# d is a (n x dimension) np array
d -= np.min(d, axis=0)
d /= np.ptp(d, axis=0)
return d
Utiliza la función numpys pico a pico .
Si usa scikit-learn, puede usar sklearn.preprocessing.normalize
:
import numpy as np
from sklearn.preprocessing import normalize
x = np.random.rand(1000)*10
norm1 = x / np.linalg.norm(x)
norm2 = normalize(x[:,np.newaxis], axis=0).ravel()
print np.all(norm1 == norm2)
# True
También está la función unit_vector()
para normalizar vectores en el popular módulo de transformations de Christoph Gohlke:
import transformations as trafo
import numpy as np
data = np.array([[1.0, 1.0, 0.0],
[1.0, 1.0, 1.0],
[1.0, 2.0, 3.0]])
print(trafo.unit_vector(data, axis=1))