一文帶您理解正態(tài)分?jǐn)?shù)變換 (Normal Score Transformation,NST)
在數(shù)據(jù)分析與建模中,許多插值和模擬方法要求輸入數(shù)據(jù)服從正態(tài)分布。而正態(tài)分?jǐn)?shù)變換(Normal Score Transformation,NST)正是一種將數(shù)據(jù)轉(zhuǎn)化為標(biāo)準(zhǔn)正態(tài)分布的有效方法。通過該方法,我們可以將原始數(shù)據(jù)集轉(zhuǎn)化為一個(gè)與標(biāo)準(zhǔn)正態(tài)分布相似的數(shù)據(jù)集,從而滿足某些分析方法的需求。正態(tài)得分變換的核心步驟包括:首先對(duì)數(shù)據(jù)集進(jìn)行排序并賦予秩次,然后根據(jù)秩值在標(biāo)準(zhǔn)正態(tài)分布中找到對(duì)應(yīng)的分位數(shù),最后通過這些正態(tài)分布的值構(gòu)成變換后的數(shù)據(jù)集。在實(shí)際應(yīng)用中,秩次的計(jì)算可以通過頻率分布或累計(jì)分布來完成,確保變換結(jié)果準(zhǔn)確、可靠。
下面展示了應(yīng)用正態(tài)得分變換前后,直方圖和累積分布的示例:
圖片
圖片
如何進(jìn)行正態(tài)分?jǐn)?shù)變換 (Normal Score Transformation)
對(duì)非正態(tài)分布的數(shù)據(jù)進(jìn)行正態(tài)分?jǐn)?shù)轉(zhuǎn)換(normal score transformation),也稱為秩正態(tài)化(rank normalizing)。具體步驟如下:
生成秩向量:首先,對(duì)原始數(shù)據(jù) x=(x1,x2,…,xn) 進(jìn)行排序,得到一個(gè)秩向量 Rx=(Rx1,Rx2,…,Rxn),其中 Rxi 表示數(shù)據(jù)點(diǎn) xi 在所有觀測(cè)值中的秩次。
轉(zhuǎn)換為標(biāo)準(zhǔn)正態(tài)分布:接下來,使用秩值來計(jì)算正態(tài)分?jǐn)?shù)。對(duì)于每個(gè) xi,將秩值 Rxi 轉(zhuǎn)換為正態(tài)分布的分位數(shù),計(jì)算公式為:
圖片
其中,??1 是標(biāo)準(zhǔn)正態(tài)分布的逆累積分布函數(shù)(即將概率值轉(zhuǎn)換為正態(tài)分布下的對(duì)應(yīng)值)。
這種方法的核心是通過秩排序?qū)⒎钦龖B(tài)數(shù)據(jù)映射到正態(tài)分布空間中,從而使數(shù)據(jù)更符合正態(tài)分布,通常用于統(tǒng)計(jì)分析或機(jī)器學(xué)習(xí)模型的前處理。
下面的python 代碼實(shí)現(xiàn):
import numpy as np
from scipy.stats import rankdata, norm
# 假設(shè)有一組非正態(tài)分布的數(shù)據(jù)
x = [0.1, 0.2, 1.1, 1.5, 3.8, 5.4, 6.9, 6.6, 0.2, 0.2]
# 1. 計(jì)算秩向量
ranks = rankdata(x,method='average') # method {'average', 'min', 'max', 'dense', 'ordinal'}
# 2. 將秩向量轉(zhuǎn)換為正態(tài)分?jǐn)?shù)
n = len(x)
x_prime = [norm.ppf(rank / (n+1)) for rank in ranks]
print("原始數(shù)據(jù):", x)
print("秩向量:", list(ranks))
print("正態(tài)分?jǐn)?shù):",[round(num,3) for num in x_prime] )
圖片
- rankdata(x):計(jì)算并返回?cái)?shù)據(jù)的秩向量。秩是從 1 到 n 的整數(shù),每個(gè)數(shù)據(jù)項(xiàng)對(duì)應(yīng)它在排序中的位置。
- norm.ppf():計(jì)算標(biāo)準(zhǔn)正態(tài)分布的逆累積分布函數(shù)(即將概率值映射到正態(tài)分布的分位數(shù)),這里的概率是通過 Rxi /(n+1) 計(jì)算得到的。
其他修正的方式
Blom’s formula:
圖片
Blom’s 方法引入了一個(gè)修正項(xiàng),使得尾部的正態(tài)分?jǐn)?shù)更加接近實(shí)際分布。
Tukey’s formula:
圖片
Tukey 的公式類似于 Blom,但調(diào)整項(xiàng)略有不同。
Van der Waerden's formula
圖片
import numpy as np
from scipy.stats import rankdata, norm
# 原始數(shù)據(jù)
x = [0.1, 0.2, 1.1, 1.5, 3.8, 5.4, 6.9, 6.6, 0.2, 0.2]
# 方法 1: 使用 average 秩和 Van der Waerden's formula
ranks_average = rankdata(x, method='average')
n = len(x)
x_prime_vdw = [norm.ppf((rank - 0.5) / n) for rank in ranks_average]
# 方法 2: Blom's formula
x_prime_blom = [norm.ppf((rank - 3/8) / (n + 1/4)) for rank in ranks_average]
# 方法 3: Tukey's formula
x_prime_tukey = [norm.ppf((rank - 1/3) / (n + 1/3)) for rank in ranks_average]
# 打印結(jié)果
print("原始數(shù)據(jù):", x)
print("平均秩:", list(ranks_average))
print("Van der Waerden:", [round(num,3) for num in x_prime_vdw])
print("Blom:", [round(num,3) for num in x_prime_blom])
print("Tukey:", [round(num,3) for num in x_prime_tukey])
圖片
正態(tài)分?jǐn)?shù)變換與 Z-Score 標(biāo)準(zhǔn)化變換的區(qū)別
正態(tài)分?jǐn)?shù)變換(NST)和 Z-Score 標(biāo)準(zhǔn)化都是數(shù)據(jù)預(yù)處理中常用的方法,但它們的目標(biāo)和實(shí)現(xiàn)方式有顯著不同。
NST是一種非線性變換,通過將數(shù)據(jù)的秩次映射到標(biāo)準(zhǔn)正態(tài)分布的分位數(shù),強(qiáng)制將非正態(tài)數(shù)據(jù)轉(zhuǎn)換為嚴(yán)格的正態(tài)分布,適用于需要數(shù)據(jù)服從正態(tài)假設(shè)的場(chǎng)景(如克里金插值);其優(yōu)勢(shì)在于對(duì)異常值不敏感且能重塑分布形態(tài)。而Z-Score是線性變換(基于均值和標(biāo)準(zhǔn)差),僅調(diào)整數(shù)據(jù)的中心位置和尺度,不改變?cè)挤植夹螤?,適用于消除量綱差異(如機(jī)器學(xué)習(xí)特征標(biāo)準(zhǔn)化),但對(duì)異常值敏感。兩者分別服務(wù)于“分布形態(tài)修正”和“數(shù)值標(biāo)準(zhǔn)化”的不同需求。
以下是兩者的主要區(qū)別:
圖片
根據(jù)具體需求選擇合適的方法:如果需要數(shù)據(jù)嚴(yán)格服從正態(tài)分布,使用正態(tài)分?jǐn)?shù)變換;如果僅需消除量綱差異,使用 Z-Score 標(biāo)準(zhǔn)化。
正態(tài)分?jǐn)?shù)變換(NST)是一種將非正態(tài)分布數(shù)據(jù)轉(zhuǎn)化為接近標(biāo)準(zhǔn)正態(tài)分布的方法,主要通過對(duì)數(shù)據(jù)進(jìn)行排序并根據(jù)秩值轉(zhuǎn)換為正態(tài)分布分位數(shù)。與 Z-Score 標(biāo)準(zhǔn)化不同,NST的目標(biāo)是使數(shù)據(jù)符合正態(tài)分布,而 Z-Score 標(biāo)準(zhǔn)化則主要用于消除量綱差異。NST常用于統(tǒng)計(jì)分析和機(jī)器學(xué)習(xí)模型的前處理,以確保數(shù)據(jù)符合正態(tài)性要求。