首页 > 其他分享 >Box-Cox变换 改善数据的分布特性 实践

Box-Cox变换 改善数据的分布特性 实践

时间:2024-08-12 18:26:36浏览次数:16  
标签:Box 变换 Cox boxcox data lambda

Box-Cox变换 改善数据的分布特性 实践

flyfish

Box-Cox变换是一种用于数据变换的技术,常用于改善数据的分布特性。

在这里插入图片描述

使用Box-Cox变换的情况

  1. 数据不服从正态分布
    在许多统计分析和建模方法中,正态性假设是一个重要的前提。例如,线性回归、t检验和ANOVA分析通常假设误差项服从正态分布。如果数据明显偏离正态分布,Box-Cox变换可以帮助将数据变换为更接近正态分布的形态。

  2. 处理异方差性
    异方差性指的是数据的方差随均值变化而变化,这违反了许多模型假设的常方差性(即所有观测值的方差相同)。Box-Cox变换可以稳定方差,使得数据的方差在整个范围内更加均匀。

  3. 数据的对称性问题
    当数据分布显著偏斜(即左偏或右偏)时,Box-Cox变换可以用于减小偏斜程度,使数据分布更加对称。这对于一些需要对称分布的统计方法尤其重要。

  4. 提高模型的解释能力和预测性能
    通过Box-Cox变换改善数据分布后,所建立的统计模型通常能够更好地拟合数据,提高预测的准确性。此外,这还可能增强模型的解释能力,因为某些偏斜特性可能使得模型参数估计偏离真实值。

  5. 数据预处理步骤
    在机器学习任务中,数据预处理是一个重要步骤。Box-Cox变换可以作为一种数据预处理方法,帮助清洗和标准化数据,特别是在构建模型之前。

不使用Box-Cox变换的情况

  1. 数据中存在负值或零值
    Box-Cox变换要求所有数据为正值,因此不适用于数据中含有负数或零的情况。
  2. 数据分布已经近似正态
    对于已经近似正态分布的数据,进行Box-Cox变换可能反而会引入不必要的复杂性。

Box-Cox变换的例子

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import boxcox
from scipy.stats import norm

# 生成一组非正态分布的随机数据
np.random.seed(0)
data = np.random.exponential(scale=2, size=1000)  # 指数分布数据

# 进行Box-Cox变换
data_boxcox, lambda_optimal = boxcox(data)

# 绘制原始数据和Box-Cox变换后的数据的直方图
fig, ax = plt.subplots(1, 2, figsize=(12, 5))

# 原始数据的直方图
ax[0].hist(data, bins=30, color='lightblue', alpha=0.7, density=True)
ax[0].set_title('Original Data Histogram')
ax[0].set_xlabel('Value')
ax[0].set_ylabel('Frequency')
# 绘制正态分布曲线以便比较
x = np.linspace(min(data), max(data), 1000)
ax[0].plot(x, norm.pdf(x, np.mean(data), np.std(data)), color='red', lw=2, label='Normal Distribution')
ax[0].legend()

# Box-Cox变换后的数据的直方图
ax[1].hist(data_boxcox, bins=30, color='lightgreen', alpha=0.7, density=True)
ax[1].set_title(f'Box-Cox Transformed Data (λ={lambda_optimal:.2f})')
ax[1].set_xlabel('Value')
ax[1].set_ylabel('Frequency')
# 绘制正态分布曲线以便比较
x_transformed = np.linspace(min(data_boxcox), max(data_boxcox), 1000)
ax[1].plot(x_transformed, norm.pdf(x_transformed, np.mean(data_boxcox), np.std(data_boxcox)), color='red', lw=2, label='Normal Distribution')
ax[1].legend()

plt.tight_layout()
plt.show()

# 打印最优的lambda值
print(f"The optimal lambda value for Box-Cox transformation is: {lambda_optimal:.4f}")

使用Box-Cox变换减少数据偏斜的例子

在这里插入图片描述

  1. 数据生成
    使用卡方分布生成一个右偏的数据集。卡方分布常见于自由度较小的情况下,其分布通常是右偏的。
    这里使用了自由度为2的卡方分布,这通常会导致数据明显右偏。

  2. 计算偏斜度
    使用scipy.stats.skew计算原始数据和Box-Cox变换后数据的偏斜度。偏斜度为正表示右偏,偏斜度为负表示左偏,偏斜度为0表示对称分布。

  3. Box-Cox变换
    使用scipy.stats.boxcox对数据进行Box-Cox变换,得到变换后的数据和最优 λ \lambda λ值。

  4. 结果可视化
    绘制原始数据的直方图和Box-Cox变换后的数据的直方图,并在标题中显示各自的偏斜度。观察结果,变换后的数据应该比原始数据更加对称。

  5. 输出最优 λ \lambda λ值 :打印Box-Cox变换的最优 λ \lambda λ值。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import boxcox
from scipy.stats import skew

# 生成一个右偏的数据集(例如,卡方分布)
np.random.seed(0)
data = np.random.chisquare(df=2, size=1000)  # 自由度为2的卡方分布

# 计算原始数据的偏斜度
original_skewness = skew(data)

# 进行Box-Cox变换
data_boxcox, lambda_optimal = boxcox(data)

# 计算Box-Cox变换后数据的偏斜度
boxcox_skewness = skew(data_boxcox)

# 绘制原始数据和Box-Cox变换后的数据的直方图
fig, ax = plt.subplots(1, 2, figsize=(12, 5))

# 原始数据的直方图
ax[0].hist(data, bins=30, color='lightblue', alpha=0.7, density=True)
ax[0].set_title(f'Original Data Histogram\nSkewness = {original_skewness:.2f}')
ax[0].set_xlabel('Value')
ax[0].set_ylabel('Frequency')

# Box-Cox变换后的数据的直方图
ax[1].hist(data_boxcox, bins=30, color='lightgreen', alpha=0.7, density=True)
ax[1].set_title(f'Box-Cox Transformed Data\nSkewness = {boxcox_skewness:.2f}')
ax[1].set_xlabel('Value')
ax[1].set_ylabel('Frequency')

plt.tight_layout()
plt.show()

# 打印最优的lambda值
print(f"The optimal lambda value for Box-Cox transformation is: {lambda_optimal:.4f}")

boxcox 函数

boxcoxscipy.stats 模块中的一个函数,用于对数据进行 Box-Cox 变换。Box-Cox 变换的目的是使数据更接近正态分布。

语法
scipy.stats.boxcox(x, lmbda=None, alpha=None, optimizer=None)
参数

x: 要进行变换的输入数据。必须是正数,不能包含负数或零。

lmbda: (可选) 变换中的 λ \lambda λ 参数。若未指定,则函数将根据数据自动选择最优的 λ \lambda λ。

alpha: (可选) 置信区间的置信度。如果提供此参数,函数会返回 λ \lambda λ 的 ( 1 − α ) × 100 % (1-\alpha) \times 100\% (1−α)×100% 的置信区间。

optimizer: (可选) 优化器函数,用于选择最优的 λ \lambda λ。默认使用 scipy.optimize.brent

返回值

y: 变换后的数据。

lmbda: 使用的 λ \lambda λ 值。如果输入参数中未提供 λ \lambda λ,则为自动选择的最优 λ \lambda λ。

示例

import numpy as np
from scipy.stats import boxcox

# 生成一组正数数据
data = np.random.exponential(scale=2, size=1000)

# 进行 Box-Cox 变换
data_boxcox, lambda_optimal = boxcox(data)

print(f"The optimal lambda value is: {lambda_optimal}")

skew 函数

skewscipy.stats 模块中的一个函数,用于计算数据的偏斜度(skewness)。偏斜度是对称性的一种度量。

语法
scipy.stats.skew(a, axis=0, bias=True, nan_policy='propagate')
参数

a: 输入数据数组或序列。可以是多维数组。

axis: (可选) 计算偏斜度的轴。默认值为 0,即沿数组的第一个轴计算。如果为 None,将对整个数组计算偏斜度。

bias: (可选) 一个布尔值,默认为 True。如果为 False,则计算的偏斜度会进行无偏估计。

nan_policy: (可选) 指定遇到 NaN 值的处理方式。'propagate'(默认值)返回 NaN'omit' 忽略 NaN 值进行计算,'raise' 会抛出错误。

返回值

skewness: 数据的偏斜度。正值表示右偏,负值表示左偏,零表示对称。

示例

import numpy as np
from scipy.stats import skew

# 生成一组数据
data = np.random.chisquare(df=2, size=1000)

# 计算偏斜度
data_skewness = skew(data)

print(f"The skewness of the data is: {data_skewness}")

标签:Box,变换,Cox,boxcox,data,lambda
From: https://blog.csdn.net/flyfish1986/article/details/141125871

相关文章

  • pyqt5 combox选择事件绑定
    pyqt5combox选择事件绑定 importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QComboBox,QVBoxLayout,QLabelclassComboBoxExample(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):......
  • 裁剪图像--原始大小变换
    用QPainter画出图像,画出要取出的矩形位置头文件源码如下:CusImageCrop.h点击查看代码`#pragmaonce#include<QObject>#include<QPaintEvent>#include<QLabel>#include<QMutex>#include<QTimer>#pragmaexecution_character_set("utf-8")class......
  • OpenCV C++ 霍夫直线变换-Hough Line Transform
    使用OpenCV在C++中实现霍夫直线变换(HoughLineTransform)可以通过以下步骤完成。我们将首先进行边缘检测,然后应用霍夫直线变换来检测图像中的直线。步骤概述读取图像:使用cv::imread读取图像。灰度转换:将图像转换为灰度图。边缘检测:使用Canny边缘检测器。霍夫直线......
  • 基于模糊pid的两路交错boost变换器Simulink仿真及代码自动生成(上)电路仿真部分
    后半部分已更新基于模糊pid的两路交错boost变换器Simulink仿真及代码自动生成(下)F280025实物测试部分简介:设计两路交错BOOST变换电路,搭建Simulink仿真模型,并设计控制算法(常规PID与模糊控制PID)。基于德州仪器TMS320F280025单片机使用MatlabCodeGenerationTools进行编程与实物测......
  • 基于模糊pid的两路交错boost变换器Simulink仿真及代码自动生成(下)F280025实物测试部分
    简介:设计两路交错BOOST变换电路,搭建Simulink仿真模型,并设计控制算法(常规PID与模糊控制PID)。基于德州仪器TMS320F280025单片机使用MatlabCodeGenerationTools进行编程与实物测试。电气系统建模与实践课程设计福州大学自动化系黄宸贞2024/3/28指导教师:蔡逢煌陈丹软件环境......
  • CSS3 边框(包含border-radius、border-image与box-shadow)
    CSS3边框样式border-radius作用:设置圆角值的个数及其效果简记:左上开始顺时针,值不够的对角来凑。值的个数效果1四个角一致2左上角和右下角一致,右上角和左下角一致3左上角、右上角和左下角一致、右下角4左上角、右上角、右下角、左下角圆角与椭圆角语法:border-radi......
  • 快速傅里叶变换
    快速傅里叶变换前言关于此算法,应用广泛。但是在OI算法竞赛中,我们只关注它“加速多项式乘法”这一用途。本文适用于未接触过此算法的初学者。对于本文用词不当、概念错误等问题,请发布在讨论区,我看到会及时修改,力争全文的每一句话都可以被引用而无误。由于本文在书写之初只......
  • CF844D Boxes And Balls
    题意有\(n\)个箱子、\(n\)种颜色的球,第\(i\)种颜色的球有\(w_i\)个,最开始时都在第\(1\)个箱子中。每次可以从有球的一个箱子中拿出所有球,并随意分割为2部分或3部分,并放入箱子,需要的代价为球的总数。问将每种颜色的球都放在对应的一个箱子中需要的代价最少是多少。......
  • Python和AI库NumPy(三):数组形状与变换
    目录1.数组的基础形状操作1.1查看数组的形状1.2改变数组的形状2.数组的转置与轴交换2.1数组的转置2.2交换数组的轴3.数组的合并与分割3.1数组的水平与垂直合并3.2数组的分割4.高级数组变换技巧4.1广播机制(Broadcasting)4.2使用expand_dims()和squeeze()......
  • 鸿蒙HarmonyOS NEXT开发:图形变换(ArkTS通用属性)
    图形变换用于对组件进行旋转、平移、缩放、矩阵变换等操作。说明:从APIVersion7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。rotaterotate(value:RotateOptions)设置组件旋转。卡片能力: 从APIversion9开始,该接口支持在ArkTS卡片中使用......