我有以下形式的数据:
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中实现?
我有以下形式的数据:
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中实现?
我认为您需要 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)
在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 和来自 special 的 inv_box-cox(因为 scipy.stats 中没有 inv_boxcox 方法)。
对于存在零值的情况,采用1+x的Box-Cox变换可能会有所帮助(boxcox1p)。
from scipy.special import boxcox1p
boxcox1p([0.01, 0.1], 0.25)
案例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
案例二:
如果您的数据不包含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