Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比例(应用函数?)对数稀疏矩阵_Python_Machine Learning_Scipy_Scikit Learn_Sparse Matrix - Fatal编程技术网

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=
    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,但我需要日志更改的基础(基于)每列(特别是最大值)。也就是说,我想做一些类似的事情,只取对数

我看到
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