【发布时间】: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
我有以下形式的数据:
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:
这是你的数据框
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
【讨论】:
对于 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 中不可用。
【讨论】:
1+x 的 Box-Cox 在零的情况下可能会有所帮助(boxcox1p)
from scipy.special import boxcox1p
boxcox1p([0.01, 0.1], 0.25)
【讨论】:
我想你想要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)
【讨论】: