将指数转换为正态分布

数据挖掘 机器学习 预处理 正常化
2021-09-16 12:11:21

对于下面显示的分布,我想将指数分布转换为正态分布。我想这样做是作为数据预处理的一部分,以便分类器可以更好地解释特征(ipc在此处命名)。

ipc特征分布

由于(x 轴)展开,常规对数转换在这里不起作用。

如何将这些数据转换为正态分布?

评论中指出了一个相关的答案,但我也在寻找一些 Python 代码摘录。

谢谢

2个回答

您可以使用sklearn.preprocessing.QuantileTransformer(or sklearn.preprocessing.PowerTransformer) 来满足您的需求:

from sklearn.preprocessing import QuantileTransformer
import numpy as np

ey = np.random.exponential(size=100)
qt = QuantileTransformer(output_distribution='normal')
no = qt.fit_transform(ey.reshape(-1, 1))

您可以绘制直方图来比较“之前”和“之后”:

# Plot histograms to see before vs after.
import matplotlib.pyplot as plt
%matplotlib inline 
plt.subplot(2, 2, 1)
plt.hist(ey, bins='auto')
plt.subplot(2, 2, 2)
plt.hist(no, bins='auto')
plt.show()

在此处输入图像描述

这种方法的优点是它也适用于其他输入分布,而不仅仅是指数分布。

以下代码有效:

import scipy
import numpy as np

ey = np.random.exponential(size=100)
cdfy = scipy.stats.expon.cdf(np.sort(ey))
invcdf = scipy.stats.norm.ppf(cdfy) # a normal distribution

希望这可以帮助