以对数方式缩放(应用函数?)稀疏矩阵

时间:2017-01-11 20:43:23

标签: python machine-learning scipy scikit-learn sparse-matrix

我正在使用scikit-learn preprocessing scaling来表示稀疏矩阵。

我的目标是通过将对数基数作为列最大值来“缩放”每个要素列。我的措辞可能不准确。我试着解释一下。

假设要素列具有值:0, 8, 2

  • 最大值= 8
  • 特征值0的Log-8应该是0.0 = math.log(0+1, 8+1)(+1是应对零;所以是的,我们实际上是采用log-base 9)
  • 特征值8的Log-8应为1.0 = math.log(8+1, 8+1)
  • 特征值2的Log-8应为0.5 = math.log(2+1, 8+1)

是的,我可以轻松地将任意基于函数的变换器应用于FunctionTransformer,但我希望每列的日志更改(基于)(尤其是最大值)。也就是说,我想做MaxAbsScaler之类的事情,只取对数。

我看到MaxAbsScaler首先得到每列最大值(code)的向量(scale),然后将1 / scale中的原始矩阵乘以scale {3}}

但是,如果我想采用基于WHERE向量的对数,我不知道该怎么办。甚至可以将对数运算转换为乘法(?),还是有其他有效的scipy稀疏运算的可能性?

我希望我的意图明确(并且可能)。

1 个答案:

答案 0 :(得分:3)

基数b中的x的对数与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