具有高斯分佈的分位數變換 - Sklearn 實現
這可能是一個模糊的問題,但我想知道 Scikit-Learn 的分位數轉換是如何實現的?
我想知道如何將傾斜的數據集轉換為這樣的正態分佈?
通常 scikit-learn 會提供指向 wiki 的鏈接,但不會提供這種轉換。
有人可以指出我正確的方向嗎?
謝謝
是的,它似乎在幾個不同的地方被描述,沒有任何論文的鏈接。
類文檔將算法總結如下:
轉換獨立地應用於每個特徵。特徵的累積密度函數用於投影原始值。低於或高於擬合範圍的新/未見數據的特徵值將映射到輸出分佈的邊界。請注意,此變換是非線性的。它可能會扭曲以相同尺度測量的變量之間的線性相關性,但會使以不同尺度測量的變量更直接地具有可比性。
用戶指南添加了一些新信息:
但是,通過執行等級轉換,它可以平滑不尋常的分佈,並且比縮放方法受異常值的影響更小。但是,它確實會扭曲要素內部和要素之間的相關性和距離。
具體來說,對於 Normal 轉換:
因此,輸入的中位數變為輸出的均值,以 0 為中心。正常輸出被裁剪,以便輸入的最小值和最大值(分別對應於 1e-7 和 1 - 1e-7 分位數)在以下情況下不會變為無限大轉變。
此估算器的GitHub 拉取請求引用了一個較舊的估算器,表明它最初將被命名為“排名縮放器”。
從更廣泛的角度來看,本文很好地總結了可以實現這種“逆正態變換 (INT)”的各種方式:
INT 是轉換連續變量的樣本分佈以使其看起來更正態分佈的方法。有幾種類型的 INT。我們所做的第一個區別是基於等級的 INT 和不基於等級的 INT。非基於秩的 INT 需要為觀察到的數據假設一個特定的累積分佈函數 (CDF),估計該分佈的參數,將觀察到的分數轉換為來自 CDF 的估計分位數,然後使用反函數將這些分位數轉換為標準正態偏差正常(或概率函數)。這種非基於秩的 INT 通常被稱為 copulas (Basrak et al. 2004; Li et al. 2006),不會進一步考慮。然而值得注意的是,基於秩的 INT 可以表示為 copula 方法的一個特例,其中使用經驗 CDF 而不是將 CDF 限制為某些分佈族。也就是說,每個時刻實際上都是從數據中估計出來的,而分位數變成了等級的簡單函數。
基於等級的 INT 涉及將變量轉換為等級的初步步驟,並且可以進一步細分為兩類:涉及隨機元素的類別和具有確定性的類別。我們知道只有一個 INT 涉及隨機元素,這種方法被稱為使用“隨機正態偏差”(Conover 1980)。對這種方法的一個威懾是,每個調查員將相同的方法應用於相同的數據集會得到稍微不同的答案,這可能會讓一些人不滿意。這種方法的理論優勢是避免了 P 值分佈的粒度,這是一個經常困擾許多非參數測試的問題。然而,這些 INT 的隨機性似乎讓研究人員望而卻步,而且它們很少(如果有的話)被使用。
確定性基於秩的 INT 可以分為使用預期正態分數的 INT(Fisher 和 Yates 1938)與使用樣本分位數(或分數秩)的反變換來近似預期正態分數的 INT。使用數值積分,Harter (1961) 提供了最完整的預期正態分數表。涉及分數等級的反向變換以接近 Fisher 和 Yates 的預期正態分數的 INT (Maritz 1982) 似乎是基因研究中最常用的,並將成為關注的主要焦點。在反向變換秩中,需要一個小數偏移以避免將最小和最大觀測值分別轉換為負無窮大和正無窮大。
查看
QuantileTransformer
代碼,它看起來就像列表中的最後一項:一個基於確定性排名的 INT,它計算修改後的排名變量。但是,這是一個相對簡單的實現:
- 計算經驗等級,使用
numpy.percentile
- 通過插值修改排名,使用
numpy.interp
- 通過反轉 CDF 映射到正態分佈,使用
scipy.stats.norm.ppf
注意處理四肢的界限。
表示為一個非常簡化的映射,即忽略插值和邊界邏輯,它只是 $ y_i = \Phi^{-1}(F(x_i)) $ , 在哪裡 $ F $ 和 $ \Phi $ 分別表示經驗和標準正態分佈的 CDF。