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.mfbz.cn/a/770643.html

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

相关文章

制造企业真的需要数字化转型吗?一文讲透:为何做,如何做?

此前拜访了不少制造企业,其以中小型企业居多,在与企业负责人交流数字化转型话题时,感触最多的还是管理者对“数字化转型”的认知。 在数字化转型方面从国家层面到地方政府进行大量的宣传与政策支持,部分行业头部企业也从数字化转…

Appium Inspector介绍和使用

一、什么是Appium Inspector 官方介绍:Overview - Appium Inspector 检查器的主要目的是提供应用程序页面源代码的检查功能。它主要用于测试自动化开发,但也可用于应用程序开发 - 或者如果只是想查看应用程序的页面源代码! 从本质上讲&…

RK3568驱动指南|第十六篇 SPI-第192章 mcp2515驱动编写:完善write和read函数

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Reid系列论文学习——无人机场景下基于 Transformer 的轻量化行人重识别

今天介绍的一篇论文是针对无人机场景下的行人重识别,论文题目为:"无人机场景下基于 Transformer 的轻量化行人重识别"。该论文针对无人机场景下行人呈现多角度多尺度的特点、以及传统CNN网络在行人重识别任务中受限于感受野和下采样导致的无法…

Git 操作总结

1. 安装、Git 环境配置 1.1 安装 Git 官方版本可以在 Git 官方网站下载:打开 https://git-scm.com/download/win,选择相应版本即可。 Git 安装完成后,可以在开始菜单中看到 Git 的三个启动图标(Git Bash、Git CMD、Git GUI&…

关于5G和卫星

手机,已经串联起了我们生活中的一切环节。我们随时随地拿出手机,都能畅快地上网。 这一切是如此地理所当然,以至于我们甚至想不到这样不可思议的问题: 移动通信网络真的无处不在吗? 我们都知道,地球虽叫…

解决在【Tomcat服务器上报错java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver】

目录 1. 添加驱动依赖:右键导入为库 2. 重新导入工件,注意看lib下有没有mysql的驱动包,没有的话需要导入。 3. 写代码的时候要注意对null值的处理,比如下面的截图,如果只是简单的获取生成的随机数,很有可…

Linux—KVM虚拟化中使用基本命令管理虚拟机(纯实例)

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年7月2日11点11分 🀄️文章质量:94分 文章目录 前言 1.查看命令帮助 2.查看KVM 的…

MySQL 如何实现将数据实时同步到 ES ?

引言:在现代应用程序开发中,通常会将数据存储在 MySQL 中,用于事务性处理和数据持久化。而 Elasticsearch(ES)则是一种专门用于全文搜索和分析的强大工具。将这两者结合使用的一个常见需求是实时将 MySQL 中的数据同步…

Houdini 引用领域及20版本五大重点功能

Houdini是一款三维计算机图形软件,由加拿大Side Effects Software Inc.(简称SESI)公司开发,SESI公司由Kim Davidson和Greg Hermanovic创建于1987年。Houdini是在Prisms基础上重新开发而来,可运行于Linux, Windows, Mac…

Echarts折线图 自适应窗口大小

实现效果&#xff1a; 代码&#xff1a; <template><div class"echarts"><div class"select-box"><div v-for"(item,index) in trendList":key"index":class"[period item.id?active:,item]"click&…

从涟漪到波浪:资产代币化的变革力量

原文标题&#xff1a;《From ripples to waves: The transformational power of tokenizing assets》撰文&#xff1a;Anutosh Banerjee&#xff0c;Matt Higginson&#xff0c;Julian Sevillano&#xff0c;Matt Higginson编译&#xff1a;Chris&#xff0c;Techub News本文来…

最近,被“AI”狠狠刷屏了......

最近&#xff0c;被“AI”狠狠刷屏了。 作为时下最热门的话题&#xff0c;AI画图、AI配音、AI写文案、AI做视频......AI在最近两年可谓是火遍全球。ChatGPT、Midjourney和SORA等技术不断涌现&#xff0c;不仅深刻改变着我们的生活方式&#xff0c;也推动了AI技术的飞速发展。 …

Linux文件与日志

目录 1. Linux 文件系统 1.1 inode号 1.2 EXT类型文件恢复 1.3 xfs类型文件备份和恢复 2. 日志分析 2.1 日志类型 2.2日志配置文件 2.3 日志分析的重要性 在Linux系统中&#xff0c;文件和日志是管理和维护系统运行所不可或缺的。理解它们的工作原理和如何有效地管理和…

第三天:LINK3D核心原理讲解【第1部分】

第三天:LINK3D核心原理讲解 LINK3D学习笔记 目标 了解LINK3D velodyne64线激光雷达LINK3D质心点提取效果: 分布在车道与墙体的交界处。 课程内容 LINK3D论文精讲LINK3D聚合关键点提取代码讲解LINK3D描述子匹配代码讲解除了ALOAM的线特征、面特征,还有其他点云特征吗,是…

WSL——忘记root密码(Ubuntu)

1、问题描述 Windows下的WSL&#xff08;Ubuntu&#xff09;忘记了root密码&#xff0c;无法使用管理员权限。 2、解决方法 关闭 Ubuntu 窗口。打开 Windows 的 Powershell 或 cmd&#xff0c; 以 root 默认登陆 WSL。 wsl -u root 修改对应用户密码。 # xxx为要修改密码的用…

MySQL—创建查看删除备份恢复数据库

创建数据库 创建数据库 LLF_DB01CREATE DATABASE LLF_DB01删除数据库DROP DATABASE LLF_DB01创建一个使用utf8字符集的数据库并带校对规则的数据库CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin 查看、删除数据库 显示所有的数据库SHOW DATABASES显示数据库…

车牌号查车辆信息在生活中的作用

车牌号查车辆信息在生活中具有多方面的作用&#xff0c;这些作用涵盖了安全、法律合规、便捷性等多个方面。以下是几个主要的作用&#xff1a; 交通安全与事故处理&#xff1a;在交通事故发生后&#xff0c;警方或保险公司可以通过车牌号快速查询到事故车辆的基本信息&#xf…

搭建论坛和mysql数据库安装和php安装

目录 概念 步骤 安装mysql8.0.30 安装php 安装Discuz 概念 搭建论坛的架构&#xff1a; lnmpDISCUZ l 表示linux操作系统 n 表示nginx前端页面的web服务 m 表示 mysql 数据库 用来保存用户和密码以及论坛的相关内容 p 表示php 动态请求转发的中间件 步骤 &#xff…

晨持绪科技:抖音店铺运营思路

在抖音这个充满活力与创意的平台上&#xff0c;店铺运营不仅仅是一种商业行为&#xff0c;它更是一种艺术的展示。如同画家在画布上勾勒出色彩斑斓的画面&#xff0c;抖音店铺的运营者们也在平台上精心策划着每一个细节&#xff0c;以吸引更多的目光和流量。 内容创作。内容是吸…