Python特征工程 — 1.3 对数与指数变换

目录

1 对数变换

1.1 对数变换的概念

1.2 对数变换实战

2 指数变换

2.1 指数变换的概念

2.2 指数变换实战

3 Box-Cox变换

3.1 Box-Cox变换概念

3.2 Box-Cox变换实战


1 对数变换

1.1 对数变换的概念

特征对数变换和指数变换是数据预处理中的两种常用技术,它们可以帮助改善数据的分布特性,从而提高某些模型的性能。

对数变换通常用于减少数据的偏斜性(skewness),它将原始数据的每个值转换为该值的自然对数或以10为底的对数。对于具有重尾分布的数据,对数变换时很好的处理方式。公式为:

1.2 对数变换实战

下面代码的目的是通过生成具有重尾分布的数据,并对其进行对数变换,来展示对数变换对数据分布的影响。

import numpy as np
import matplotlib.pyplot as plt# 设置随机种子以获得可复现的结果
np.random.seed(0)# 生成具有重尾分布的数据(例如,使用帕累托分布)
data = np.random.pareto(a=1, size=2000)# 对数变换,这里使用10为底对数
# 为了避免对数变换中的问题,添加一个小的常数(例如1)
log_data = np.log10(data + 1)# 绘制原始数据的直方图
plt.figure(figsize=(14, 5))  # 调整图形大小以便更清晰的展示
plt.subplot(1, 2, 1)  # 1行2列的第一个图
plt.hist(data, bins=50, color='blue', alpha=0.7, log=True)  # 使用对数刻度
plt.title('Original Data (Log Scale)')
plt.xlabel('Value')  # 添加x轴标签
plt.ylabel('Frequency (log scale)')  # 添加y轴标签,说明y轴是频率的对数刻度# 绘制对数变换后数据的直方图
plt.subplot(1, 2, 2)  # 1行2列的第二个图
plt.hist(log_data, bins=30, color='green', alpha=0.7)  # 正常刻度
plt.title('Log-transformed Data')
plt.xlabel('Value')  # 添加x轴标签
plt.ylabel('Frequency')  # 添加y轴标签# 显示图形
plt.tight_layout()  # 调整布局以避免标签重叠
plt.show()

下面是对代码的分析和对数变换前后作用的解释:

  • 使用np.random.pareto(a=2.0, size=2000)生成了2000个服从帕累托分布的数据点。帕累托分布是一种典型的重尾分布,其特点是大部分数据点集中在较小的值附近,而少数数据点是极端大的值。
  • 对原始数据进行以10为底的对数变换,使用np.log10(data + 1)。这里添加了1来避免对数函数在0处未定义的问题。

运行结果如下:

在原始数据的直方图上使用对数刻度,可以清晰地看到数据的重尾特性,即直方图的右侧有一个长尾,对数变换后的数据直方图可能看起来更加紧凑,极端大值的影响被减少

2 指数变换

2.1 指数变换的概念

指数变换通常用于处理具有极端值或非常不均匀分布的数据,它将原始数据的每个值转换为该值的指数函数,指数变换可以放大较小的值而压缩较大的值,有助于减少极端值的影响。公式为:

2.2 指数变换实战

指数变换主要应用与图像处理领域,可参考如下的文章:https://www.cnblogs.com/wancy/p/17819610.html

这段代码演示了如何对一组非正态分布的正值数据进行指数变换,并可视化变换前后的数据分布。

import numpy as np
import matplotlib.pyplot as plt# 生成数据:使用gamma分布生成非正态分布的正值数据
data = np.random.gamma(shape=1.0, scale=1.0, size=1000)# 归一化数据到[0, 1]区间
data_normalized = data / np.max(data)# 应用指数变换
exp_data_normalized = np.exp(data_normalized - 1)  # 减1保证变换后数据不会全为0# 反归一化到原始数据的范围
exp_data = exp_data_normalized * np.max(data)# 绘制原始数据的直方图
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.hist(data, bins=30, color='blue', alpha=0.7)
plt.title("Original Data")# 绘制指数变换后数据的直方图
# 截断数据以避免过大的值
threshold = np.percentile(exp_data, 99)  # 取99百分位数作为阈值
exp_data[exp_data > threshold] = threshold
plt.subplot(1, 2, 2)
plt.hist(exp_data, bins=30, color='green', alpha=0.7)
plt.title("Exponential Transformed Data")# 添加坐标轴标签
plt.xlabel('Value')
plt.ylabel('Frequency')# 显示图形
plt.tight_layout()
plt.show()

下面是对代码的分析:

  • 使用numpyrandom.gamma函数生成一组非正态分布的正值数据,这种分布通常产生偏斜的数据,具有重尾特性。
  • 将数据归一化到[0, 1]区间。这是通过将每个数据点除以数据的最大值来实现的。归一化有助于在变换过程中保持数据的尺度一致性。
  • 反归一化到原始数据的范围。通过将变换后的数据乘以原始数据的最大值来实现。

直方图显示了变换前后数据分布的对比,指数变换后的数据可能更加均匀或具有更小的偏斜度。

两种变换的使用场景和要求

这两种变换通常用于以下情况:

  • 当数据具有非线性特征时,对数变换可以帮助线性化数据。
  • 当数据的方差随着均值的增加而增加时(即方差与均值成正比),对数变换可以稳定方差。
  • 当数据包含极端值或离群点时,指数变换可以帮助减少这些值的影响。

两种变换对数据要求:在应用这些变换之前,需要考虑数据的特性和模型的需求。例如,对数变换不适用于零或负值,因为对数函数在这些值上是未定义的。而指数变换则可以处理负值。

3 Box-Cox变换

3.1 Box-Cox变换概念

平方根变换和对数变换可以简单推广为Box-Cox变换。Box-Cox变换是一种在统计建模中常用的数据变换方法,由George E.P. Box和David Cox在1964年提出,用于处理连续的、正值的、偏斜分布的数据,以便它们更符合正态分布的要求。这种变换特别适用于线性回归模型中,当响应变量不满足正态分布时,通过变换可以使模型满足线性、正态性、独立性以及方差齐性的假设条件。

Box-Cox变换的一般形式为:

其中,y是原始数据,λ 是变换参数 。

box-cox变换的主要作用:是将数据进行归一化,使得数据更加符合统计假设。在实际应用中,box-cox变换常用于解决回归分析和方差分析中的数据不满足正态分布的问题,从而提高模型的准确度和可靠性。

box-cox变换优点:

  • 提高模型预测准确性:将非正态分布的数据进行box-cox变换后,可以使数据更加符合正态分布,从而提高模型预测的准确性。
  • 统计推断更可靠:在进行统计推断时,如果假设数据符合正态分布,但实际上并不符合,可能会导致结果的错误。通过box-cox变换将数据转换为正态分布后,统计推断的结果更加可靠。
  • 处理异方差性:对于具有异方差性的数据,进行box-cox变换可以使数据更加平滑,从而更容易处理异方差性。

box-cox变换缺点:

  • 数据必须为正数:box-cox变换要求数据必须为正数,因此无法处理包含负数的数据集。
  • 参数需要选择:box-cox变换中的参数λ需要根据数据集进行选择,不同的λ值可能会导致不同的结果。因此,需要进行多次试验来找到最适合的λ值。例如,当 λ=0 时,Box-Cox变换退化为对数变换;当λ=−1 时为倒数变换;当λ=0.5 时为平方根变换。
  • 数据范围影响变换效果:box-cox变换对于数据的范围敏感,如果数据集范围较小,可能会导致变换效果不佳,或者导致出现数值问题

3.2 Box-Cox变换实战

下面代码演示了如何使用Box-Cox变换对一组非正态分布的正值数据进行处理,并可视化原始数据和变换后数据的分布情况。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats# 假设有一组非正态分布的正值数据
# 这里我们使用一个偏态分布的示例数据集
data = np.random.gamma(shape=2.0, scale=2.0, size=1000)# 应用Box-Cox变换,并找到最优的lambda值
transformed_data, optimal_lambda = stats.boxcox(data)# 打印最优的lambda值
print(f"Optimal lambda value: {optimal_lambda}")# 绘制原始数据的直方图
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
plt.hist(data, bins=30, color='blue', alpha=0.7)
plt.title("Original Data")
# 添加坐标轴标签
plt.xlabel('Value')
plt.ylabel('Frequency')# 绘制变换后数据的直方图
plt.subplot(1, 2, 2)
plt.hist(transformed_data, bins=30, color='green', alpha=0.7)
plt.title(f"Box-Cox Transformed Data \n(lambda = {optimal_lambda})")# 添加坐标轴标签
plt.xlabel('Value')
plt.ylabel('Frequency')# 显示图形
plt.tight_layout()
plt.show()
  • 首先使用伽马分布生成一组非正态分布的正值数据,伽马分布是一种偏态分布,常用于模拟具有重尾分布的数据。
  • 进一步使用scipy.stats.boxcox函数对数据进行Box-Cox变换。该函数返回变换后的数据transformed_data和最优的lambda值optimal_lambda。最优的lambda值是通过极大似然估计得到的,用于确定最佳的Box-Cox变换形式。
  • 最后使用matplotlib库绘制原始数据和变换后数据的直方图。

原始数据(伽马分布)具有偏态分布,Box-Cox变换旨在通过非线性变换减少数据的偏态,使数据更接近正态分布。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国植物志(80卷)

中国植物志,全书共80卷126分册,3700页,记载了我国301科3408属31142种植物学名、形态特征、生态环境、地理分布、经济用途和物候期等。是研究中国植物的重要论著(截图仅部分)。

使用 bend-ingest-kafka 将数据流实时导入到 Databend

作者:韩山杰 Databend Cloud 研发工程师 https://github.com/hantmac Databend是一个开源、高性能、低成本易于扩展的新一代云数据仓库。bend-ingest-kafka 是一个专为 Databend 设计的实时数据导入工具,它允许用户从 Apache Kafka 直接将数据流导入到 D…

Konva.js 使用指南

简介 Konva.js 是一个用于创建 2D 图形的高性能 JavaScript 库,专注于提供丰富的 API 和灵活的图层管理。它适用于数据可视化、游戏开发和其他需要复杂图形和动画的应用场景。本文将介绍 Konva.js 的基本使用方法,包括初始化、绘制基本图形、处理事件和…

密码学原理精解【4】

文章目录 Z 256 下的希尔密码 Z_{256}下的希尔密码 Z256​下的希尔密码概述exampleK密钥选择 ∣ K ∣ − 1 |K|^{-1} ∣K∣−1 K ∗ K^* K∗ K − 1 K^{-1} K−1 Z 256 下的希尔密码 Z_{256}下的希尔密码 Z256​下的希尔密码 概述 m ≥ 2 为正整数,表示 m 维向量空…

linux系统中的各种命令的解释和帮助(含内部命令、外部命令)

目录 一、说明 二、命令详解 1、帮助命令的种类 (1)help用法 (2)--help用法 2、如何区别linux内部命令和外部命令 三、help和—help 四、man 命令 1、概述 2、语法和命令格式 (1)man命令的格式&…

Spring Cloud中的服务熔断与降级

Spring Cloud中的服务熔断与降级 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Spring Cloud中的服务熔断与降级策略。 一、什么是服务熔…

qt6 通过http查询天气的实现

步骤如下: cmakelist 当中,增加如下配置 引入包 访问远端api 解析返回的数据 cmakelist 当中,增加如下配置,作用是引入Network库。 引入包 3、访问远端api void Form1::on_pushButton_clicked() {//根据URL(http://t.weather.…

接口测试流程及测试点!

一、什么时候开展接口测试 1.项目处于开发阶段,前后端联调接口是否请求的通?(对应数据库增删改查)--开发自测 2.有接口需求文档,开发已完成联调(可以转测),功能测试展开之前 3.专…

PHP 面向对象编程(OOP)入门指南

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,通过使用对象来设计和组织代码。PHP作为一种广泛使用的服务器端脚本语言,支持面向对象编程。本文将介绍PHP面向对象编程的基本概念和用法&#xff0…

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client实现

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client C实现 和IOServer主要差别: 1 使用Open_Client 连接 2 一定要先打开IOServer,再打开IO_Client 效果显示 1 C 代码实现 1.1 shareddataClient.h 头文件中引用 和sharedd…

手写starter写核心

文章目录 使用cn.smart 不能使用com 避免在yml配置的时候 开启或者 写万能接口实现调整日志级别写了core核心 但是没有引入其他功能组件,就是注解可以使用但是功能没有增,所以core的作用就是写入注解从新写starter 第一步提取注解 写到核心包里面,看其他包 新建模块 使用cn.s…

开源发布Whistle: 基于弱音素监督推进数据高效多语言和跨语言语音识别

论文地址:https://arxiv.org/abs/2406.02166 开源代码及模型: https://github.com/thu-spmi/CAT/blob/master/egs/cv-lang10/readme.md 摘 要 Whistle和Whisper一样,均采用弱监督方式训练ASR基座模型。不同于Whisper采用基于子词&#xff0…

全志T113系列芯片参数|性能|功耗|资料|选型-远众技术

全志T113-i和T113-S3/S4处理器,凭借高性价比、丰富接口、工业级性能等特性,适合不同应用场景。 一、T113-i:强大性能与丰富接口的理想嵌入式处理器 全志T113系列中的T113-i是一款引人注目的高性能、低成本嵌入式处理器,专为各种…

嵌入式面试需要注意的问题!

1.在嵌入式和IT行业,技术更新换代非常快。因此,求职者必须时刻关注行业的最新动向和发展趋势。了解当前市场上哪些技术和岗位需求量大,哪些新兴技术值得学习和掌握,都是至关重要的。 🔸嵌入式行业:嵌入式系…

1、项目基础

1、系统架构图 2、项目业务组成 3、技术选型 3.1 前端 vue3 ts sass axios 3.2后端 spring-cloud系列 gateway openfeign spring-cloud-alibaba系列 nacos sentinel seata

基于矩阵分解算法的评分预测实现---信息检索课设以及所涉及的深度学习原理

一、实验环境 Windows,Python 3 Python作为主要编程语言,使用Python的Pandas、NumPy、Matplotlib等库 二、实验内容 主要任务 查阅相关资料,了解矩阵分解算法的基本概念、应用场景及其难点。重点了解SVD(Singular Value Decomposition,奇异值分解)系列方法。掌握Pyth…

使用Python进行文件批量重命名:轻松实现文件管理

哈喽,大家好,我是木头左! 引言 在日常生活和工作中,经常需要对大量的文件进行重命名。手动一个个地修改文件名不仅耗时耗力,还容易出错。为了解决这个问题,可以利用Python编程语言来实现文件的批量重命名。本文将介绍如何使用Python编写一个简单的脚本,实现对文件进行批…

windows@无密码的本地用户账户相关问题@仅用用户名免密登录远程桌面登录和控制@无密码用户访问共享文件夹以及挂载问题

文章目录 abstract此用户无法登录账户被禁用问题访问共享文件夹时带上凭据错误案例和解决 两类登录方式控制台登录与远程登录的区别为什么限制空密码账户只允许控制台登录相关安全策略如何修改该策略注意事项 启用允许被免密登录功能使用空密码进行远程桌面连接设置远程桌面链接…

硅纪元视角 | 1 分钟搞定 3D 创作,Meta 推出革命性 3D Gen AI 模型

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

2.2.2 C#中显示控件BDPictureBox 的实现----DisplayContext说明续

2.2.2 C#中显示控件BDPictureBox 的实现----DisplayContext说明续 1 主要目标描述 实现图片缩放信息和中心点位置偏移信息的管理,外部调用者只要输入放大,缩小,位置偏移,其他全部由displayContext 实现 2 公共的函数部分&#…