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

Posted

技术标签:

【中文标题】以对数方式缩放(应用函数?)稀疏矩阵【英文标题】:Scale (apply function?) sparse matrix logarithmically 【发布时间】:2017-05-26 19:16:28 【问题描述】:

我将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),然后将 code 中的原始矩阵乘以 1 / scale

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

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

【问题讨论】:

【参考方案1】:

以 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

【讨论】:

这是个好主意!正是我需要的,谢谢! -- 类似地,我想对于 sparse 矩阵,我不能像 MinMaxScaler 那样首先减少到最小范围,也就是说,如果特征列的范围仅在 40 到 80 之间,则更改最小值到 0 和 40,然后按照您的答案应用 log1p。 -- 我只需要对少数列执行此操作,也许在这些列上非稀疏操作然后交换是否有效? 如果你有一个稀疏矩阵,但有些列的所有值都在 40 到 80 之间,这是一种奇怪的情况。我自己不需要处理这种情况;您可能想发布一个单独的问题,因为它与上述问题不同。

以上是关于以对数方式缩放(应用函数?)稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

R中非常大的稀疏矩阵的列重新缩放

稀疏矩阵及其压缩格式

具有特征库的块稀疏矩阵

稀疏矩阵的压缩与还原

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

稀疏矩阵定义以及存储格式(COO,CSR,CSC)