【发布时间】:2016-03-04 03:38:40
【问题描述】:
我有一个数据数组。我检查了它是否是正态分布的:
import sys
import scipy
from scipy import stats
from scipy.stats import mstats
from scipy.stats import normaltest
Data = []
for line in open(sys.argv[1]):
line = line.strip()
Data.append(float(line))
print scipy.stats.normaltest(Data)
输出为:(36.444648754208075, 1.2193968690198398e-08)
然后,我写了一个小脚本来规范化数据:
import sys
import numpy as np
fileopen = open(sys.argv[1])
UntransformedArray = []
for line in fileopen:
line = float(line.strip())
UntransformedArray.append(line)
TransformedArray = (UntransformedArray - np.mean(UntransformedArray)/np.std(UntransformedArray))
NewList = TransformedArray.tolist()
for i in NewList:
print i
然后我使用第一个脚本再次检查正常性,输出是 (36.444648754209595, 1.2193968690189117e-08)。
...与上一个分数相同,并且不呈正态分布。
我的一个脚本错了吗?
另外,我应该提到我的数据的平均值为 0.056,数字范围从 0.014 到 0.171(85 个观察值),我不确定这些数字如此之小是否重要。
未转换和转换数据的样本:
未转换:
0.055
0.074
0.049
0.067
0.038
0.037
0.045
0.041
转换后的数据:
-2.13696814254
-2.11796814254
-2.14296814254
-2.12496814254
-2.15396814254
-2.15496814254
-2.14696814254
编辑 1:
当我稍微编辑代码以说明括号位置错误时:
TransformedMean = (UntransformedArray - np.mean(UntransformedArray))
TransformedArray = (TransformedMean/np.std(UntransformedArray))
NewList = TransformedArray.tolist()
for i in NewList:
print i
我得到的输出不同:
例子:
-0.0385683544143
0.705333390576
-0.273484694937
0.431264326632
-0.704164652563
-0.743317375984
但是,当我检查正常时: (36.444648754241328, 1.2193968689995659e-08)
它仍然不是正态分布的(并且仍然与其他时间完全相同)?
编辑2:
然后我尝试了另一种标准化数据的方法:
import sys
import scipy
from scipy import stats
from scipy.stats import boxcox
Data = [(float(line.strip())) for line in open(sys.argv[1])]
scipy.stats.boxcox(Data)
我收到错误:TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'float'
编辑 3:由于用户的评论,问题在于理解标准化值与标准化分布的差异。
修改后的代码:
import sys
import numpy as np
fileopen = open(sys.argv[1])
UntransformedArray = []
for line in fileopen:
line = float(line.strip())
UntransformedArray.append(line)
List1 = np.log(UntransformedArray)
for i in List1:
print i
检查规范化: (4.0435072214905938, 0.13242304287973003)
(在这种情况下有效,取决于数据的偏度)。
编辑 4:或使用 BoxCox 转换:
import sys
import scipy
from scipy import stats
from scipy.stats import boxcox
import numpy as np
Data = []
for line in open(sys.argv[1]):
line = line.strip()
Data.append(float(line))
data = scipy.stats.boxcox(np.array(Data))
for i in data[0]:
print i
检查标准化:(2.9085877478631956, 0.23356523218452238)
【问题讨论】:
-
TransformedArray 计算中没有括号问题吗? ( UntransformedArray - np.mean(UntransformedArray) ) /np.std(UntransformedArray)
-
这就是我所拥有的:TransformedArray = (UntransformedArray - np.mean(UntransformedArray)/np.std(UntransformedArray)) 它似乎运行没有抱怨?括号没有错误?
-
算术除法 (/) 具有不同的优先级进行减号 (-) 操作。因此,您正在划分均值/标准差,然后仅在应用减法之后。我相信你的括号放错了地方。
-
谢谢。我稍微改变了脚本(见编辑)。检查正态性脚本可能有问题吗?我问的原因是,现在我已经为检查正态性脚本提供了两个不同的列表,(例如,我的原始转换输出,所有数字都以 -2.XXX 开头,而在我的编辑中,数字是例如0.43、-0.7 等),我仍然从检查正态性脚本得到完全相同的输出?
-
回复。
boxcox:试试scipy.stats.boxcox(np.array(Data))(如果还没有import numpy as np,请在脚本顶部添加)。顺便说一句,scipy.stats.boxcox(Data)在较新版本的scipy中工作。你用的是什么版本?运行import scipy; print(scipy.__version__)找出答案。
标签: python numpy normalization