我试图使用scipy.stats计算数据集的z分数,并且遇到了一个非常奇怪的微妙错误,我无法弄清楚。代码正在运行,但似乎产生的数据略有偏差,我担心这会对我在规范化数据集上运行的PCA产生不利影响。
我在列表中有以下数据:
mylist = [0.565, 0.629, 0.687, 0.797, 0.56, 0.722]
我运行以下命令,使用scipy.stats对数据进行Z-score标准化:
import scipy.stats as scipy
zscore_list = scipy.zscore(mylist)
[-1.11793077, -0.36479846, 0.31772769, 1.61217384, -1.17676923, 0.72959692]
然而,当我手动计算相同的数据时,我得到了不同的结果:
import statistics as stats
for x in mylist:
`print(str((x-stats.mean(mylist))/stats.stdev(mylist)))`
结果:
-1.0205264990693814
-0.33301391022264026
0.29004437341971895
1.471706635500054
-1.074238420073032
0.6660278204452793
我尝试了各种方法来解决这个问题,包括将“mylist”转换为numpy数组,在调用“scipy.zscore”时使用axis=None和ddof=0,结果没有任何变化。
1条答案
按热度按时间pdsfdshx1#
更新:所以我想通了,我想我会把这个留给任何感兴趣的人。
有两种方法可以计算标准偏差:* 总体 * 标准差,即均值的平方差之和除以总体大小 N,或 * 样本 * 标准差,即均值的平方差之和除以样本大小 n-1。
事实证明,NumPy(以及SciPy)默认使用人口标准差。这很少是适当的;对于大多数应用程序,其中一个是推断人口水平的统计数据,通过借鉴一个样本,样本标准偏差是更合适的。为了纠正这一点,我在对scipy.stats.zscore的调用中设置了
ddof=1
,这样就解决了计算错误的问题。希望这对某人有帮助!