Box-Cox数据变化是一个基于参数λ的数据变化方法
- 接受任意分布的输入,但需要值
>0
- 可以使变化后的数据减少变量之间的相关性
- 减少噪声
数据Box-Cox变化与逆变换
stats box-cox变化请参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.boxcox.html
逆变换请参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.inv_boxcox.html
from scipy.stats import boxcox
from scipy.special import inv_boxcox
from numpy.random import pareto
array = pareto(3, size=(1000)) # 生成幂律分布数据
box_array, lambda0 = boxcox(array) # box-cox变换
origin_array = inv_boxcox(box_array, lambda0) # 逆box-cox变换
这里的lambda0
就是上面公式里的λ
,可以在变换时给定,如果没有给定,就会通过max{y}
使用最大似然求出参数λ
示例代码
numpy生成幂律分布请参考:https://numpy.org/doc/stable/reference/random/generated/numpy.random.pareto.html
from scipy.stats import boxcox
from numpy.random import pareto
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.special import inv_boxcox
if __name__ == '__main__':
array = pareto(3, size=(1000)) # 生成幂律分布数据
box_array, lambda0 = boxcox(array) # box-cox变换
origin_array = inv_boxcox(box_array, lambda0) # 逆box-cox变换
# 绘图
sns.distplot(array, kde=False, rug_kws={
'color': 'g'})
sns.distplot(box_array, kde=False, rug_kws={
'color': 'r'})
plt.show()
效果图如下: