scipy.stats.

yeojohnson#

scipy.stats.yeojohnson(x, lmbda=None)[源代码]#

返回通过 Yeo-Johnson 幂变换转换后的数据集。

参数:
xndarray

输入数组。应为一维数组。

lmbdafloat,可选

如果 lmbdaNone,则找到使对数似然函数最大化的 lambda,并将其作为第二个输出参数返回。否则,将针对给定值执行转换。

返回:
yeojohnson: ndarray

Yeo-Johnson 幂变换后的数组。

maxlogfloat,可选

如果 lmbda 参数为 None,则第二个返回的参数是使对数似然函数最大化的 lambda。

说明

Yeo-Johnson 变换由下式给出

y = ((x + 1)**lmbda - 1) / lmbda,                for x >= 0, lmbda != 0
    log(x + 1),                                  for x >= 0, lmbda = 0
    -((-x + 1)**(2 - lmbda) - 1) / (2 - lmbda),  for x < 0, lmbda != 2
    -log(-x + 1),                                for x < 0, lmbda = 2

boxcox 不同,yeojohnson 不要求输入数据为正数。

1.2.0 版本新增。

参考文献

I. Yeo and R.A. Johnson, “A New Family of Power Transformations to Improve Normality or Symmetry”, Biometrika 87.4 (2000)

示例

>>> from scipy import stats
>>> import matplotlib.pyplot as plt

我们从非正态分布生成一些随机变量,并为其绘制概率图,以显示其在尾部是非正态的

>>> fig = plt.figure()
>>> ax1 = fig.add_subplot(211)
>>> x = stats.loggamma.rvs(5, size=500) + 5
>>> prob = stats.probplot(x, dist=stats.norm, plot=ax1)
>>> ax1.set_xlabel('')
>>> ax1.set_title('Probplot against normal distribution')

我们现在使用 yeojohnson 来转换数据,使其最接近正态分布

>>> ax2 = fig.add_subplot(212)
>>> xt, lmbda = stats.yeojohnson(x)
>>> prob = stats.probplot(xt, dist=stats.norm, plot=ax2)
>>> ax2.set_title('Probplot after Yeo-Johnson transformation')
>>> plt.show()
../../_images/scipy-stats-yeojohnson-1.png