以对数方式缩放(应用函数?)稀疏矩阵
Posted
技术标签:
【中文标题】以对数方式缩放(应用函数?)稀疏矩阵【英文标题】:Scale (apply function?) sparse matrix logarithmically 【发布时间】:2017-05-26 19:16:28 【问题描述】:我将scikit-learn preprocessing scaling 用于稀疏矩阵。
我的目标是通过将列最大值取对数来“缩放”每个特征列。我的措辞可能不准确。我试着解释一下。
说特征列有值:0, 8, 2
:
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 之间,这是一种奇怪的情况。我自己不需要处理这种情况;您可能想发布一个单独的问题,因为它与上述问题不同。以上是关于以对数方式缩放(应用函数?)稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章