【问题标题】:How to apply Box-Cox transformation in Python?如何在 Python 中应用 Box-Cox 变换?
【发布时间】:2015-07-13 04:11:10
【问题描述】:

我有以下形式的数据:

X   Y
3.53    0
4.93    50
5.53    60
6.21    70
7.37    80
9.98    90
16.56   100

我想找出 n 以便它可以适合形式的函数:

我正在尝试通过 Box-Cox 变换确定 n。这如何在 Python 中完成?

【问题讨论】:

    标签: python numpy scipy curve-fitting


    【解决方案1】:

    案例 1:

    这是你的数据框

        X       Y
    0   3.53    0
    1   4.93    50
    2   5.53    60
    3   6.21    70
    4   7.37    80
    5   9.98    90
    6   16.56   100
    

    您的数据包含 0,因此您可以选择 boxcox1p

    import pandas as pd
    from scipy.special import boxcox1p
    df.apply(lambda x: boxcox1p(x,0.25))
    

    输出:

        X           Y
    0   1.835587    0.000000
    1   2.241999    6.689380
    2   2.394230    7.178730
    3   2.554564    7.611132
    4   2.803640    8.000000
    5   3.281328    8.354362
    6   4.188250    8.680616
    

    案例 2:

    如果您的数据不包含 0 值,那么您可以选择 boxcox

        X       Y
    0   3.53    10
    1   4.93    50
    2   5.53    60
    3   6.21    70
    4   7.37    80
    5   9.98    90
    6   16.56   100
    

    然后

    from scipy import stats
    df.apply(lambda x: stats.boxcox(x)[0])
    

    输出:

        X           Y
    0   0.910243    16.561988
    1   1.063005    157.733998
    2   1.109383    202.939104
    3   1.153342    251.083555
    4   1.213348    301.896331
    5   1.306681    355.163289
    6   1.431789    410.710034 
    

    【讨论】:

      【解决方案2】:

      对于 Python 中的 Box-Cox 转换,您必须遵循以下步骤:-

      from scipy.stats import boxcox
      from scipy.special import inv_boxcox
      
      y =[10,20,30,40,50]
      y,fitted_lambda= boxcox(y,lmbda=None)
      inv_boxcox(y,fitted_lambda)
      

      scipy.special 包中box-cox 方法存在,但期望lambda 明确。因此我使用来自scipy.stats 的box-cox 和来自特殊的inv_box-cox,因为inv_boxcox 在scipy.stats 中不可用。

      【讨论】:

        【解决方案3】:

        1+x 的 Box-Cox 在零的情况下可能会有所帮助(boxcox1p)

        from scipy.special import boxcox1p
        boxcox1p([0.01, 0.1], 0.25)
        

        【讨论】:

          【解决方案4】:

          我想你想要scipy.stats.boxcox

          from scipy import stats
          import numpy as np
          
          data = np.fromstring('3.53    0 4.93    50 5.53    60 6.21    70 7.37    80 9.98    90 16.56   100', sep=' ').reshape(7, 2)
          
          stats.boxcox(data[0,])
          (array([ 0.91024309,  1.06300488,  1.10938333,  1.15334193,  1.213348  ,
               1.30668122,  1.43178909]), -0.54874593147877893)
          

          【讨论】:

            猜你喜欢
            • 2016-03-04
            • 2019-12-25
            • 1970-01-01
            • 2014-12-11
            • 2022-01-06
            • 2020-11-21
            • 2022-08-23
            • 2015-09-29
            • 2021-02-16
            相关资源
            最近更新 更多