Eu gostaria de ter a norma de uma matriz NumPy. Mais especificamente, estou procurando uma versão equivalente dessa função
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Existe algo assim em skearn
ou numpy
?
Essa função funciona em uma situação em que v
é o vetor 0.
raise
uma exceção!x/np.linalg.norm(x)
não era muito mais lento (cerca de 15 a 20%) do quex/np.sqrt((x**2).sum())
no numpy 1.15.1 em uma CPU.Respostas:
Se você estiver usando o scikit-learn, poderá usar
sklearn.preprocessing.normalize
:fonte
normalize
requer uma entrada 2D. Você pode passar oaxis=
argumento para especificar se deseja aplicar a normalização nas linhas ou colunas da sua matriz de entrada.np.linalg.norm(x)
calcula a norma 'l2' por padrão. Se você quiser que a soma do seu vetor seja 1, você deve usar #np.linalg.norm(x, ord=1)
ndarray
para que ele funcione com anormalize()
função. Caso contrário, pode ser alist
.Concordo que seria bom se essa função fizesse parte das baterias incluídas. Mas não é, tanto quanto eu sei. Aqui está uma versão para eixos arbitrários e com desempenho ideal.
fonte
Você pode especificar ord para obter a norma L1. Para evitar a divisão zero, uso eps, mas talvez isso não seja ótimo.
fonte
[inf, 1, 2]
rendimentos[nan, 0, 0]
, mas não deveria ser[1, 0, 0]
?Isso também pode funcionar para você
mas falha quando
v
tem comprimento 0.fonte
Se você possui dados multidimensionais e deseja que cada eixo seja normalizado ao máximo ou à sua soma:
Utiliza a função numpys pico a pico .
fonte
Há também a função
unit_vector()
de normalizar vetores no módulo de transformações populares de Christoph Gohlke:fonte
Você mencionou o sci-kit learn, então quero compartilhar outra solução.
aprender sci-kit
MinMaxScaler
No sci-kit learn, há uma API chamada
MinMaxScaler
que pode personalizar o intervalo de valores conforme você desejar.Também trata de questões de NaN para nós.
Amostra de código
O código é simples, basta digitar
Referênciafonte
Sem
sklearn
e usando apenasnumpy
. Basta definir uma função :.Supondo que as linhas sejam as variáveis e as colunas as amostras (
axis= 1
):resultado:
fonte
Se você deseja normalizar n vetores de recursos dimensionais armazenados em um tensor 3D, também pode usar o PyTorch:
fonte
Se você estiver trabalhando com vetores 3D, poderá fazê-lo de forma concisa usando o cinto de ferramentas vg . É uma camada leve em cima de numpy e suporta valores únicos e vetores empilhados.
Eu criei a biblioteca na minha última inicialização, onde foi motivada por usos como este: idéias simples que são muito detalhadas no NumPy.
fonte
Se você não precisa da máxima precisão, sua função pode ser reduzida para:
fonte
Se você trabalha com uma matriz multidimensional, é possível seguir uma solução rápida.
Digamos que temos uma matriz 2D, que queremos normalizar pelo último eixo, enquanto algumas linhas têm zero norma.
fonte