2017-01-11 3 views
2

Я использую scikit-learn preprocessing scaling для редкий матрицы.Масштаб (применяется функция?) Разреженная матрица логарифмически

Моя цель - «масштабировать» каждую колонку признаков, беря логарифмическую базу для максимального значения столбца. Мое формулирование может быть неточным. Я пытаюсь объяснить.

Скажем функция-столбец имеет значения: 0, 8, 2:

  • Максимальное значение = 8
  • Лог-8 из значения признака 0 должно быть 0,0 = math.log(0+1, 8+1) (+1, чтобы справиться с нулями; так что да , мы фактически с лог-основание 9)
  • Лог-8 значения признака 8 должно быть 1,0 = math.log(8+1, 8+1)
  • Лог-8 значения признака 2 должно составлять 0,5 = math.log(2+1, 8+1)

Да, я могу легко применить любой произвольный функциональный трансформатор с FunctionTransformer, но я хочу, чтобы база журнала меняла (на основе) каждый столбец (в частности, максимальное значение). То есть, я хочу сделать что-то вроде MaxAbsScaler, только беря логарифмы.

Я вижу, что MaxAbsScaler получает первый вектор (scale) максимальных значений каждого столбца (code), а затем кратные исходные матрицы раз 1/scale в code.

Однако я не знаю, что делать, если я хочу использовать логарифмы на основе вектора scale. Возможно ли даже преобразование операции логарифма в умножение (?) Или у меня есть другие возможности разреженных разреженных операций?

Надеюсь, что мои намерения ясны (и возможны).

ответ

3

Логарифм x в базе b такой же, как log (x)/log (b), где log являются естественными. Таким образом, описанный процесс сводится к первому применению преобразования журнала (x + 1) ко всему, а затем к масштабированию по абсолютной абсолютной величине. Удобно, log (x + 1) является встроенной функцией, log1p. Пример:

from sklearn.preprocessing import FunctionTransformer, maxabs_scale 
from scipy.sparse import csc_matrix 
import numpy as np 
logtran = FunctionTransformer(np.log1p, accept_sparse=True) 
X = csc_matrix([[ 1., 0, 8], [ 2., 0, 0], [ 0, 1., 2]]) 
Y = maxabs_scale(logtran.transform(X)) 

Выход (разреженная матрица Y):

(0, 0)  0.630929753571 
    (1, 0)  1.0 
    (2, 1)  1.0 
    (0, 2)  1.0 
    (2, 2)  0.5 
+0

Это хорошее мышление! Только то, что мне нужно, спасибо! - По аналогичной заметке, я думаю, что с матрицами _sparse_ я не могу сначала свести к минимальному диапазону, как и к 'MinMaxScaler', то есть, если функциональный столбец находится только между 40 и 80, измените минимум на 0 и 40, а затем , примените 'log1p', как в вашем ответе. - Мне нужно было бы сделать это всего за несколько столбцов, может быть, эффективно работать без перерывов на этих столбцах, а потом менять? – juanmirocks

+0

Странная ситуация, если у вас есть разреженная матрица, но некоторые столбцы имеют значения от 40 до 80. Мне самому не приходилось иметь дело с такой ситуацией; вы можете задать отдельный вопрос, поскольку он отличается от предыдущего. – FTP

Смежные вопросы