【python】数据预处理:分位数归一化 Quantile Normalization + INSCODE AI创作助手测试 您所在的位置:网站首页 百分位数算法公式 【python】数据预处理:分位数归一化 Quantile Normalization + INSCODE AI创作助手测试

【python】数据预处理:分位数归一化 Quantile Normalization + INSCODE AI创作助手测试

2024-07-11 18:05| 来源: 网络整理| 查看: 265

文章目录 写在前面标准化/归一化z-score标准化示例 python模块qnorm实现分位数归一化R代码实现分位数归一化分位数归一化 - NSCODE AI创作助手的回答*Q1:Quantile Normalization是什么?**Q2-1: 什么时候用Quantile normalization?**Q2-2: 什么时候做Quantile normalization?**Q3:为什么要做Quantile Normalization?**Q4-1: 如何做Quantile normalization?**Q4-2: 如何用python做Quantile Normalization?* 可视化分位数归一化处理前后发生的变化什么时候该用/不该用分位数归一化其他ChatGPT测试

写在前面

这里主要了解一下分位数归一化(Quantile Normalization, QN)。如无特殊说明时,本文中的QN作为分位数归一化的缩写。

Quantile Normalization 直接翻译是 分位数归一化,但也有翻译为分位数标准化。笔者理解是按直译叫分位数归一化,但是按数据的处理方式,应该叫分位数标准化,按英文的话就一种:Quantile Normalization。之所以有标准化和归一化两种说法,是因为它们是两种不同的处理方式。

本文暂统一名称叫分位数归一化(QN)。

Quantile Normalization 定义来自如下文献: 在这里插入图片描述

标准化/归一化

标准化(standardization)、归一化(normalization)两者总是被混着叫,实际是在做什么处理呢?

先看下Python库中的关于预处理的一些包: 在这里插入图片描述 其中包括了:scaling(缩放), centering(中心化), normalization(归一化), binarization(二值化)。

对于标准化和归一化对应的常用的模块:

标准化 standardization:py模块 StandardScaler 是常用的标准化数据处理,对应z-score标准化公式: z = x − μ s z=\frac{x-\mu}{s} z=sx−μ​(其中, μ \mu μ是训练样本的均值, s s s是训练样本的标准差)。将原始数据转换为均值为0,方差为1的新数据,也是把数据缩放(scaling)到特定区间上。该处理从公式计算上解读为:当前数据比总体均值多了几个标准差;从数据整体上解读为:把原数据标准化缩放为服从标准正态分布的数据。

归一化 normalization:py模块 MinMaxScaler是比较常用的归一化方法:min-max归一化, x ∗ = x i − x m i n x m a x − x m i n x^*=\frac{x_i− x_{min}}{x_{max} − x_{min}} x∗=xmax​−xmin​xi​−xmin​​。

z-score标准化示例 # sklear包中的zscore from sklearn.preprocessing import StandardScaler data = [[0, 0], [0, 0], [1, 1], [1, 1]] scaler = StandardScaler() print(scaler.fit(data)) scaler.fit_transform(data)

使用scipy包中的zscore,对dataframe数据直接进行zscore标准,好处是标准化后的index/columns还在,而使用sklear的标准化处理后,返回的是数组array。[chatGPT]:

import pandas as pd from scipy.stats import zscore # 创建训练数据的示例DataFrame train_data = {'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50], 'C': [100, 200, 300, 400, 500]} train_df = pd.DataFrame(train_data) # 创建测试数据的示例DataFrame test_data = {'A': [6, 7, 8, 9, 10], 'B': [60, 70, 80, 90, 100], 'C': [600, 700, 800, 900, 1000]} test_df = pd.DataFrame(test_data) # 对训练数据进行Z-score标准化 train_df_standardized = train_df.apply(zscore) # 使用训练数据的均值和标准差对测试数据进行标准化(注意使用训练数据的统计量) test_df_standardized = (test_df - train_df.mean()) / train_df.std() print("训练数据标准化结果:") print(train_df_standardized) print("\n测试数据标准化结果:") print(test_df_standardized) python模块qnorm实现分位数归一化

仔细看Python的sklearn库中(# 标准化/归一化 部分的截图),会发现这里没有分位数归一化的包。是的,sklearn里没有QN。需要先安装qnorm(qnorm安装包官网),安装命令为:pip install qnorm。使用示例如下:

import pandas as pd import qnorm df = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4}, 'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 2}, 'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}}) print(qnorm.quantile_normalize(df, axis=1))

执行后可得到: 在这里插入图片描述

R代码实现分位数归一化

最初测试使用了R代码,在“INSCODE AI创作助手”助手的默认实现方式中也使用了R。(做分位数归一化处理可能用R的比较多)

代码中使用到R包preprocessCore:

df 'A': 5, 'B': 2, 'C': 3, 'D': 4}, 'C2': {'A': 6, 'B': 1, 'C': 7, 'D': 9}, 'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}}) dfn1 = qnorm.quantile_normalize(df1, axis=1) df2 = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4}, 'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 2}, 'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}}) dfn2 = qnorm.quantile_normalize(df2, axis=1) df3 = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4}, 'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 4}, 'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}}) dfn3 = qnorm.quantile_normalize(df3, axis=1)

在这里插入图片描述 可视化QN前后的数据:

import matplotlib.pyplot as plt fig, axs = plt.subplots(3, 2) plt.rcParams.update({'font.size':5}) i = 0 for df, dfn in zip([df1, df2, df3], [dfn1, dfn2, dfn3]): axs[i, 0].scatter(range(len(df.T['A'])), df.T['A'], label='A') axs[i, 0].scatter(range(len(df.T['B'])), df.T['B'], label='B') axs[i, 0].scatter(range(len(df.T['C'])), df.T['C'], label='C') axs[i, 0].scatter(range(len(df.T['D'])), df.T['D'], label='D') axs[i, 0].legend(loc='upper left', shadow=True) axs[i, 0].set_xticks([0, 1, 2], [1, 2, 3]) axs[i, 1].scatter(range(len(dfn.T['A'])), dfn.T['A']) axs[i, 1].scatter(range(len(dfn.T['B'])), dfn.T['B']) axs[i, 1].scatter(range(len(dfn.T['C'])), dfn.T['C']) axs[i, 1].scatter(range(len(dfn.T['D'])), dfn.T['D']) axs[i, 1].set_xticks([0, 1, 2], [1, 2, 3]) i += 1 fig.tight_layout() plt.show()

图分两列,左侧一列为原始数据,右侧一列分位数归一化(QN)后的数据。从原始数据到QN后的数据,可以发现,右侧图中每个样本(一列)的4个数据的排列顺序没有发生变化。(注意:有的看起来是



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有