我正在使用scikit-learn preprocessing scaling来表示稀疏矩阵。
我的目标是通过将对数基数作为列最大值来“缩放”每个要素列。我的措辞可能不准确。我试着解释一下。
假设要素列具有值:0, 8, 2
:
math.log(0+1, 8+1)
(+1是应对零;所以是的,我们实际上是采用log-base 9)math.log(8+1, 8+1)
math.log(2+1, 8+1)
是的,我可以轻松地将任意基于函数的变换器应用于FunctionTransformer,但我希望每列的日志更改(基于)(尤其是最大值)。也就是说,我想做MaxAbsScaler之类的事情,只取对数。
我看到MaxAbsScaler
首先得到每列最大值(code)的向量(scale
),然后将1 / scale
中的原始矩阵乘以scale
{3}}
但是,如果我想采用基于WHERE
向量的对数,我不知道该怎么办。甚至可以将对数运算转换为乘法(?),还是有其他有效的scipy稀疏运算的可能性?
我希望我的意图明确(并且可能)。
答案 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