【附代码原理】偏正态分布的数据处理方法

文章目录

  • 相关教程
  • 基本信息
      • 数学定义
      • 参数的影响
      • Python 实现
        • 安装 `scipy`
        • 生成和绘制偏正态分布的数据
      • 解释
      • 应用
  • 右偏(即长尾在右侧)的正态分布
      • 1. 对数变换 (Log Transformation)
      • 2. 平方根变换 (Square Root Transformation)
      • 3. Box-Cox 变换
      • 注意事项
  • 左偏(即长尾在左侧)的正态分布
      • 1. 对数变换 (Log Transformation)
      • 2. 平方根变换 (Square Root Transformation)
      • 3. Box-Cox 变换
      • 4. 幂变换 (Power Transformation)
      • 5. 反正弦变换 (Arcsin Transformation)
      • 注意事项

作者:小猪快跑

基础数学&计算数学,从事优化领域7年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法

偏正态分布(Skew Normal Distribution)是一种扩展了标准正态分布的连续概率分布,它允许数据具有偏斜性。标准正态分布是对称的,而偏正态分布则可以是左偏或右偏的。偏正态分布在金融、经济、生物统计等领域中广泛应用,因为现实世界中的许多数据集往往不是完全对称的。

如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑

相关教程

  • 常用分布的数学期望、方差、特征函数
  • 【推导过程】常用离散分布的数学期望、方差、特征函数
  • 【推导过程】常用连续分布的数学期望、方差、特征函数
  • Z分位数速查表
  • 【概率统计通俗版】极大似然估计
  • 【附代码&原理】正态分布检验
  • 【附代码&原理】偏正态分布的数据处理方法
  • 【机器学习】【通俗版】EM算法(待更新)

基本信息

偏正态分布(Skew Normal Distribution)是一种扩展了标准正态分布的连续概率分布,它允许数据具有偏斜性。标准正态分布是对称的,而偏正态分布则可以是左偏或右偏的。偏正态分布在金融、经济、生物统计等领域中广泛应用,因为现实世界中的许多数据集往往不是完全对称的。

数学定义

偏正态分布由三个参数定义:

  1. 位置参数(Location Parameter) ξ \xi ξ:表示分布的中心位置。
  2. 尺度参数(Scale Parameter) ω \omega ω:控制分布的扩散程度,类似于标准差。
  3. 形状参数(Shape Parameter) α \alpha α:控制分布的偏斜方向和程度。当 α = 0 \alpha = 0 α=0 时,偏正态分布退化为标准正态分布。

偏正态分布的概率密度函数(PDF)可以表示为:

f ( x ; ξ , ω , α ) = 2 ω ϕ ( x − ξ ω ) Φ ( α ( x − ξ ω ) ) f(x; \xi, \omega, \alpha) = \frac{2}{\omega} \phi\left(\frac{x - \xi}{\omega}\right) \Phi\left(\alpha \left(\frac{x - \xi}{\omega}\right)\right) f(x;ξ,ω,α)=ω2ϕ(ωxξ)Φ(α(ωxξ))

其中:

  • ϕ ( z ) \phi(z) ϕ(z) 是标准正态分布的密度函数:
    ϕ ( z ) = 1 2 π e − z 2 2 \phi(z) = \frac{1}{\sqrt{2\pi}} e^{-\frac{z^2}{2}} ϕ(z)=2π 1e2z2
  • Φ ( z ) \Phi(z) Φ(z) 是标准正态分布的累积分布函数(CDF):
    Φ ( z ) = ∫ − ∞ z ϕ ( t )   d t \Phi(z) = \int_{-\infty}^{z} \phi(t) \, dt Φ(z)=zϕ(t)dt

参数的影响

  • 位置参数 ξ \xi ξ:决定了分布的中心位置。改变 ξ \xi ξ 会使整个分布沿 x 轴平移。
  • 尺度参数 ω \omega ω:决定了分布的宽度。增大 ω \omega ω 会使分布变得更加分散,减小 ω \omega ω 会使分布变得更加集中。
  • 形状参数 α \alpha α:决定了分布的偏斜方向和程度。当 α > 0 \alpha > 0 α>0 时,分布右偏;当 α < 0 \alpha < 0 α<0 时,分布左偏;当 α = 0 \alpha = 0 α=0 时,分布退化为标准正态分布。

Python 实现

在Python中,可以使用 scipy.stats 库中的 skewnorm 模块来生成和处理偏正态分布的数据。

安装 scipy

如果您还没有安装 scipy,可以使用 pip 安装:

pip install scipy
生成和绘制偏正态分布的数据
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import skewnorm

# 定义偏正态分布的参数
xi = 5  # 位置参数
omega = 2  # 尺度参数
alpha = 5  # 形状参数

# 生成偏正态分布的数据
data = skewnorm.rvs(a=alpha, loc=xi, scale=omega, size=1000)

# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, density=True, alpha=0.6, color='g', edgecolor='black')
plt.title('Skew Normal Distribution')
plt.xlabel('Value')
plt.ylabel('Density')

# 绘制理论的偏正态分布曲线
x = np.linspace(min(data), max(data), 1000)
pdf = skewnorm.pdf(x, a=alpha, loc=xi, scale=omega)
plt.plot(x, pdf, 'r-', lw=2)

plt.show()

在这里插入图片描述

解释

  • 位置参数 ξ \xi ξ:控制分布的中心位置。
  • 尺度参数 ω \omega ω:控制分布的宽度。
  • 形状参数 α \alpha α:控制分布的偏斜方向和程度。在这个例子中,alpha = 5 表示分布右偏。

应用

偏正态分布广泛应用于以下领域:

  • 金融:用于建模股票价格、收益率等。
  • 经济学:用于分析收入分布、消费行为等。
  • 生物学:用于描述生物体的生长模式、基因表达等。
  • 工程:用于可靠性分析、质量控制等。

通过使用偏正态分布,可以更准确地描述和分析那些具有偏斜性的数据集,从而提高模型的准确性和解释能力。

右偏(即长尾在右侧)的正态分布

当您的数据呈现出右偏(即长尾在右侧)的正态分布时,这意味着数据集中存在较多的大值,导致分布曲线向右延伸。对于这种类型的数据,有几种常见的处理方法,旨在使数据更加符合标准正态分布,从而提高统计分析的有效性和模型的性能。以下是几种处理右偏数据的方法:

1. 对数变换 (Log Transformation)

对数变换是处理右偏数据最常用的方法之一。通过取数据的自然对数(或10为底的对数),可以压缩较大的值,使得数据分布更加对称。

import numpy as np
import matplotlib.pyplot as plt

# 假设 data 是一个右偏的数据集
data = np.random.lognormal(mean=0, sigma=1, size=1000)

# 应用对数变换
log_data = np.log(data)

# 绘制原始数据和变换后的数据的直方图
plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(log_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Log Transformed Data')

plt.show()

在这里插入图片描述

2. 平方根变换 (Square Root Transformation)

平方根变换同样可以减少数据的偏斜度,尤其适用于数据中有许多接近于零的小值的情况。

sqrt_data = np.sqrt(data)

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(sqrt_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Square Root Transformed Data')

plt.show()

在这里插入图片描述

3. Box-Cox 变换

Box-Cox 变换是一种更为通用的方法,它可以应用于一系列连续的非负数据。它实际上是一系列幂变换的集合,包括对数变换、平方根变换等。Box-Cox 变换会找到一个最佳的λ值来最小化数据的偏斜度。

from scipy.stats import boxcox

# 执行 Box-Cox 变换
bc_data, _ = boxcox(data)

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(bc_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Box-Cox Transformed Data')

plt.show()

在这里插入图片描述

注意事项

  • 数据范围:确保您的数据是非负的,因为对数变换和 Box-Cox 变换不适用于负数或零。
  • 解释性:变换后的数据可能难以直接解释,因此在报告结果时需要转换回原始尺度。
  • 模型假设:并非所有模型都要求输入数据严格服从正态分布,因此在应用任何变换之前,请考虑您的具体需求和所使用的模型类型。

左偏(即长尾在左侧)的正态分布

当您的数据呈现出左偏(即长尾在左侧)的正态分布时,这意味着数据集中存在较多的小值,导致分布曲线向左延伸。处理左偏数据的目标是通过适当的变换使数据更加对称,从而更接近正态分布。以下是一些常用的处理方法及其Python实现:

1. 对数变换 (Log Transformation)

对数变换通常用于处理右偏数据,但对于左偏数据,可以尝试对数据取相反数后再进行对数变换。

import numpy as np
import matplotlib.pyplot as plt

# 假设 data 是一个左偏的数据集
data = -np.random.lognormal(mean=0, sigma=1, size=1000)

# 应用对数变换
log_data = np.log(-data)

# 绘制原始数据和变换后的数据的直方图
plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(log_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Log Transformed Data')

plt.show()

在这里插入图片描述

2. 平方根变换 (Square Root Transformation)

平方根变换也可以用于处理左偏数据,方法类似对数变换,即对数据取相反数后再进行平方根变换。

sqrt_data = np.sqrt(-data)

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(sqrt_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Square Root Transformed Data')

plt.show()

在这里插入图片描述

3. Box-Cox 变换

Box-Cox 变换是一种更为通用的方法,但它通常适用于非负数据。对于左偏数据,可以尝试对数据取相反数后再进行 Box-Cox 变换。

from scipy.stats import boxcox

# 对数据取相反数
neg_data = -data

# 执行 Box-Cox 变换
bc_data, _ = boxcox(neg_data)

# 再次取相反数以恢复数据的方向
bc_data = -bc_data

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(bc_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Box-Cox Transformed Data')

plt.show()

在这里插入图片描述

4. 幂变换 (Power Transformation)

幂变换是一种更灵活的方法,可以通过调整幂次来处理不同类型的偏斜。对于左偏数据,可以尝试使用负幂次。

# 选择一个合适的幂次
power = -0.5

# 应用幂变换
power_data = np.power(-data, power)

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(power_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Power Transformed Data')

plt.show()

在这里插入图片描述

5. 反正弦变换 (Arcsin Transformation)

反正弦变换主要用于处理比例数据,但在某些情况下也可以用于处理左偏数据。

# 应用反正弦变换
arcsin_data = np.arcsin(np.sqrt(-data / np.max(-data)))

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Original Data')

plt.subplot(1, 2, 2)
plt.hist(arcsin_data, bins=30, edgecolor='black', alpha=0.7)
plt.title('Arcsin Transformed Data')

plt.show()

在这里插入图片描述

注意事项

  • 数据范围:确保您的数据在变换前后的合理范围内。特别是对数变换和 Box-Cox 变换不适用于负数或零。
  • 解释性:变换后的数据可能难以直接解释,因此在报告结果时需要转换回原始尺度。
  • 模型假设:并非所有模型都要求输入数据严格服从正态分布,因此在应用任何变换之前,请考虑您的具体需求和所使用的模型类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】MPU6050简介

文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册&#xff1a;MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…

一篇快速上手 Axios,一个基于 Promise 的网络请求库(涉及原理实现)

Axios 1. 介绍1.1 什么是 Axios&#xff1f;1.2 axios 和 ajax 的区别 2. 安装使用3. Axios 基本使用3.1 Axios 发送请求3.2 其他方式发送请求3.3 响应结构3.4 Request Config3.5 默认配置3.6 创建实例对象发送请求 3.7 拦截器3.8 取消请求 4. 模拟 Axios4.1 axios 对象创建过程…

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?

随着容器技术的不断成熟&#xff0c;不少企业在开展私有化容器平台建设时&#xff0c;首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器&#xff1f;在往期“虚拟化 vs. 裸金属*”系列文章中&#xff0c;我们分别对比了容器部署在虚拟化平台和物理机上的架…

Unity-添加世界坐标系辅助线

如果你想在场景中更直观地显示世界坐标系&#xff0c;可以通过编写一个简单的脚本来实现。下面是一个基本的示例脚本&#xff0c;它会在场景中绘制出世界坐标系的三个轴&#xff1a; using UnityEngine;public class WorldAxesIndicator : MonoBehaviour {public float length…

决策树分类算法【sklearn/决策树分裂指标/鸢尾花分类实战】

决策树分类算法 1. 什么是决策树&#xff1f;2. DecisionTreeClassifier的使用&#xff08;sklearn&#xff09;2.1 算例介绍2.2 构建决策树并实现可视化 3. 决策树分裂指标3.1 信息熵&#xff08;ID3&#xff09;3.2 信息增益3.3 基尼指数&#xff08;CART&#xff09; 4. 代码…

5分钟轻松搭建Immich图片管理软件并实现公网远程传输照片

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件&#xff0c;并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…

React和Next.js的相关内容

React–前端框架 React 是一个用于构建用户界面的 JAVASCRIPT 库。 React 主要用于构建 UI&#xff0c;很多人认为 React 是 MVC 中的 V&#xff08;视图&#xff09;。 React 起源于 Facebook 的内部项目&#xff0c;用来架设 Instagram 的网站&#xff0c;并于 2013 年 5 …

【LeetCode热题100】队列+宽搜

这篇博客是关于队列宽搜的几道题&#xff0c;主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …

丹摩征文活动|基于丹摩算力的可图(Kolors)的部署与使用

Kolors是一个以生成图像为目标的人工智能系统&#xff0c;可能采用了类似于OpenAI的DALLE、MidJourney等文本生成图像的技术。通过自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;相结合&#xff0c;Kolors能够根据用户提供的文本描述生成符合…

【PTA】【数据库】【SQL命令】编程题1

数据库SQL命令测试题1 10-1 显示教工编号以02开头的教师信息 作者 冰冰 单位 广东东软学院 显示教工编号以02开头的教师信息 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE teacher ( TId CHAR(5) NOT NULL, -- 教师工号&#xff0c;主键 DId CHAR(2) …

Dockerhub镜像加速

一、背景 dockerhub由于被封锁和站点处于国外的原因&#xff0c;docker pull拉取镜像非常慢&#xff0c;有时候直接都无法拉取。严重妨碍了我们的学习进度以及日常使用。 总结了一些proxy代理的镜像站点&#xff0c;配置之后速度会有明显提升&#xff0c;大家可以参考使用。 二…

Linux: C语言解析域名

在上一篇博客 Linux: C语言发起 DNS 查询报文 中&#xff0c;自己构造 DNS 查询报文&#xff0c;发出去&#xff0c;接收响应&#xff0c;以二进制形式把响应的数据写入文件并进行分析。文章的最后留下一个悬念&#xff0c;就是写代码解析 DNS answer section 部分。本文来完成…

Tri Mode Ethernet MAC IP核详解

本文对 Vivado 的三速 MAC IP 核&#xff08;Tri Mode Ethernet MAC&#xff0c;TEMAC&#xff09;进行介绍。 在自行实现三速以太网 MAC 控制器时&#xff0c;GMII/RGMII 接口可以通过 IDDR、ODDR 原语实现&#xff0c;然而实际使用中自己实现的模块性能不是很稳定&#xff08…

CENTOS7 升级gcc版本

升级gcc版本 CentOS下升级gcc版本有两个途径&#xff0c;一个是添加其他源进行自动升级&#xff0c;一个是手动编译升级&#xff0c;这里先顺便讲下自动升级的两个办法&#xff1a; a. 添加Fedora源 在 /etc/yum.repos.d 目录中添加文件 FedoraRepo.repo &#xff0c;并输入…

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源 由于需要在 Linux 环境下进行一些测试工作&#xff0c;于是决定使用 VMware 虚拟化软件来安装 Ubuntu 24.04 .1操作系统。考虑到测试过程中需要访问 Github &#xff0c;要使用Docker拉去镜像等外部网络资源&#xff0c;因此产…

学习日记_20241123_聚类方法(高斯混合模型)续

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

15.C++STL 2(string类的使用,6000字详解)

⭐本篇重点&#xff1a;string类的使用 ⭐本篇代码&#xff1a;c学习/05.string类的学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. C/C字符与string类 二. STL中的string类的使用 2.1 string类常见的构造与赋值 2.2 string对象的数据容量操作 …

神经网络(系统性学习一):入门篇——简介、发展历程、应用领域、基本概念、超参数调优、网络类型分类

相关文章&#xff1a; 神经网络中常用的激活函数 神经网络简介 神经网络&#xff08;Neural Networks&#xff09;是受生物神经系统启发而设计的数学模型&#xff0c;用于模拟人类大脑处理信息的方式。它由大量的节点&#xff08;或称为“神经元”&#xff09;组成&#xff0…

shell 基础知识2 ---条件测试

目录 一、条件测试的基本语法 二、文件测试表达式 三、字符串测试表达式 四、整数测试表达式 五、逻辑操作符 六、实验 为了能够正确处理 Shell 程序运行过程中遇到的各种情况&#xff0c; Linux Shell 提供了一组测试运算符。 通过这些运算符&#xff0c;Shell 程序能够…

数据指标与标签在数据分析中的关系与应用

导读&#xff1a;分享数据指标体系的文章很多&#xff0c;但讲数据标签的文章很少。实际上&#xff0c;标签和指标一样&#xff0c;是数据分析的左膀右臂&#xff0c;两者同样重要。实际上&#xff0c;很多人分析不深入&#xff0c;就是因为缺少对标签的应用。今天系统的讲解下…