Python 比例(应用函数?)对数稀疏矩阵
我使用的是稀疏矩阵 我的目标是通过以对数为底的列最大值来“缩放”每个功能列。我的措辞可能不准确。我试着解释 假设要素列有值:Python 比例(应用函数?)对数稀疏矩阵,python,machine-learning,scipy,scikit-learn,sparse-matrix,Python,Machine Learning,Scipy,Scikit Learn,Sparse Matrix,我使用的是稀疏矩阵 我的目标是通过以对数为底的列最大值来“缩放”每个功能列。我的措辞可能不准确。我试着解释 假设要素列有值:0,8,2: 最大值=8 特征值0的Log-8应该是0.0=math.Log(0+1,8+1)(+1用于处理零;所以是的,我们实际上是以对数为基数9) 特征值8的Log-8应为1.0=math.Log(8+1,8+1) 特征值2的Log-8应为0.5=math.Log(2+1,8+1) 是的,我可以轻松地应用任意基于函数的transformer,但我需要日志更改的基础(
0,8,2
:
- 最大值=8
- 特征值0的Log-8应该是0.0=
(+1用于处理零;所以是的,我们实际上是以对数为基数9)math.Log(0+1,8+1)
- 特征值8的Log-8应为1.0=
math.Log(8+1,8+1)
- 特征值2的Log-8应为0.5=
math.Log(2+1,8+1)
maxabscaler
首先获取每列()最大值的向量(scale
),然后将原始矩阵乘以1/scale
)
但是,如果我想根据比例
向量取对数,我不知道该怎么办。甚至可以将对数运算转换为乘法(?),或者我还有其他有效的scipy稀疏运算的可能性吗
我希望我的意图是明确的(并且是可能的)。以b为底的x的对数与log(x)/log(b)相同,其中log是自然的。因此,您描述的过程相当于首先对所有对象应用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):
这是个好主意!正是我需要的,谢谢你类似地,我想对于稀疏矩阵,我不能像
MinMaxScaler
那样首先将其缩小到最小范围,也就是说,如果特征列的范围仅在40到80之间,请将最小值更改为0到40,然后像您的答案一样应用log1p
我只需要对少数列执行此操作,也许只有在交换时才对这些列执行非稀疏操作是有效的?如果有稀疏矩阵,但某些列的所有值都在40到80之间,这是一种奇怪的情况。我自己没有必要处理这种情况;您可能需要发布一个单独的问题,因为它与上面的问题不同。
(0, 0) 0.630929753571
(1, 0) 1.0
(2, 1) 1.0
(0, 2) 1.0
(2, 2) 0.5