数学建模——Box-Cox变换

用途:当某个随机变量 X X X 不服从正态分布的时候,可以尝试通过这种变换将其变成正态分布。

两个常用的变换

  • 对数变换:已知随机变量 X X X,如果有 ln ⁡ X ∼ N ( μ , σ 2 ) \ln X\sim N(\mu,\sigma^2) lnX∼N(μ,σ2),那么对 X X X 使用对数变换。适合随着自变量的增加,因变量的方差也增大的模型。
  • 平方根变换:已知随机变量 X X X,如果有 X ∼ N ( μ , σ 2 ) \sqrt X\sim N(\mu,\sigma^2) X ∼N(μ,σ2),那么对 X X X 使用平方根变换。适合服从Poission分布的计数资料,或轻度偏态资料。

Box-Cox 变换简介

Box-Cox变换的基本思想是通过对数据进行一定的变换,使得变换后的数据更加符合正态分布的特征。这种变换是一种幂函数变换,其公式如下:
y ~ = { y λ − 1 λ , λ ≠ 0 ln ⁡ y , λ = 0 \tilde{y}=\left \{{\begin{matrix}\cfrac{{{y}^{\lambda }}-1}{\lambda },&\lambda \ne 0\\\ln{y},&\lambda =0\end{matrix}}\right . y~=⎩ ⎨ ⎧λyλ−1,lny,λ=0λ=0

将原数据 y y y 变为大致服从正态分布的 y ~ \tilde y y~。Box-Cox 变换可以很好地根据一组随机变量 X X X 的观测值,构造出一个服从正态分布的变量 X ~ \tilde X X~,从而能够根据这个正态分布进行一些数据分析。传统的 Fitter 库给出的最佳拟合可能是一些从来没有见过的分布函数。

注意上式只适合非负数 ,如果存在负数,需要将 y y y 加上一个偏移量后再进行 Box-Cox 变换。

对数变换是 λ = 0 \lambda =0 λ=0 的 Box-Cox 变换,平方根变换是 λ = 1 / 2 \lambda=1/2 λ=1/2 的 Box-Cox 变换。

代码实例

python 复制代码
from scipy.stats import boxcox
# 下面这个库也含有 boxcox 变换方法,但是这个库的 boxcox 需要自行提供 λ。而 scipy.stats.boxcox 可以通过极大似然等方法自行计算 λ。
# from scipy.special import boxcox

from scipy.special import inv_boxcox
import numpy as np

np.random.seed(114514)
# F 分布有点偏态正态分布的意思,生成一组 F 分布数据
x = np.random.f(dfnum=3, dfden=10, size=10000)

# box-cox 正变换
y, lambda_ = boxcox(x, lmbda=None, alpha=None)
print(lambda_)
# 0.1678598919247737

import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Euclid'
plt.subplot(121)
sns.distplot(x)
plt.title('Origin')
plt.subplot(122)
sns.distplot(y)
plt.title('Transformed')
plt.show()

# 这是反变换,经验证和之前的 x 是一样的
x = inv_boxcox(y, lambda_)

做出来图片如下。

参考文献

下面的资料对 Box-Cox 变换有深入的介绍:

相关推荐
每天一个秃顶小技巧8 分钟前
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
开发语言·后端·python·golang
安特尼1 小时前
招行数字金融挑战赛数据赛道赛题一
人工智能·python·机器学习·金融·数据分析
serve the people1 小时前
解决osx-arm64平台上conda默认源没有提供 python=3.7 的官方编译版本的问题
开发语言·python·conda
多多*3 小时前
Java反射 八股版
java·开发语言·hive·python·sql·log4j·mybatis
正在走向自律3 小时前
从0到1:Python机器学习实战全攻略(8/10)
开发语言·python·机器学习
西西弗Sisyphus3 小时前
Python 处理图像并生成 JSONL 元数据文件 - 灵活text版本
开发语言·python
Taichi呀3 小时前
PyCharm 快捷键指南
ide·python·pycharm
Stara05113 小时前
基于注意力机制与iRMB模块的YOLOv11改进模型—高效轻量目标检测新范式
人工智能·python·深度学习·神经网络·目标检测·计算机视觉·yolov11
Python猫4 小时前
付费专栏·Python潮流周刊电子书合集(epub、pdf、markdown)下载
python·计算机·pdf·电子书·资料
强化学习与机器人控制仿真4 小时前
openpi 入门教程
开发语言·人工智能·python·深度学习·神经网络·机器人·自动驾驶