2017-01-11 17 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得到第一每个列(code),然后倍数的最大的值的矢量(scale)原始矩阵倍1/scalecode

但是,我不知道该怎么做,如果我想采取基于scale向量的对数。是否有可能将对数运算转换为乘法运算(?),还是有其他可行的有效的scipy稀疏运算?

我希望我的意图清楚(可能)。

回答

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 
+0

这是很好的想法!正是我需要的,谢谢! - 在类似的说明中,我猜想使用_sparse_矩阵我不能像MinMaxScaler那样先缩小到最小范围,也就是说,如果要素列的取值范围只在40和80之间,则将最小值改为0和40,然后,在你的答案中应用'log1p'。 - 我只需要为少数列执行此操作,也许在这些列上非空白地操作才有效,然后才能交换? – juanmirocks

+0

如果你有一个稀疏矩阵,但是有些列的所有值都在40到80之间,这是一个奇怪的情况。我自己并不需要处理这种情况,你可能想发布一个单独的问题,因为它与上面的不同。 – FTP