Python机器学习(六十四)SciPy 统计

scipy.stats模块包含了统计工具以及概率分析工具。

分布: 直方图和概率密度函数

给定随机过程的观测值,其直方图是随机过程的概率密度函数PDF的估计量:

示例

import numpy as np

samples = np.random.normal(size=1000)
bins = np.arange(-4, 5)
bins

histogram = np.histogram(samples, bins=bins, normed=True)[0]
bins = 0.5*(bins[1:] + bins[:-1])
bins

from scipy import stats
pdf = stats.norm.pdf(bins)  # norm是一个分布对象

import matplotlib.pyplot as plt
plt.plot(bins, histogram) 
plt.plot(bins, pdf) 

# plt.savefig('./st1-1.png') # 保存要显示的图片
plt.show()

输出

scipy stats 图1

如果我们知道随机过程属于一个给定的随机过程家族,比如正态过程,我们就可以对观测值进行最大似然拟合来估计潜在分布的参数。这里我们将一个正态过程与观察到的数据进行拟合:

loc, std = stats.norm.fit(samples)
print(loc, std)

输出

0.0030534094701394794   1.0143664443890137

分布对象
scipy.stats.norm是一个分布对象: scipy.stats中的每个分布都表示为一个对象。例如:正态分布对象,还有PDF, CDF等等。

平均值、中位数和百分位数

均值是样本的平均值:

np.mean(samples) 

中位数是样本的中间值:

np.mean(samples) 

中位数也是百分位数50,因为50%的观察值低于它:

stats.scoreatpercentile(samples, 50) 

同样,我们可以计算百分位数90:

stats.scoreatpercentile(samples, 90)   

统计检验

统计检验是一种决策指标。例如,如果我们有两组观测值,假设是高斯过程产生的,我们可以用T检验来判断两组观测值的均值是否存在显著差异:

a = np.random.normal(0, 1, size=100)
b = np.random.normal(1, 1, size=10)
stats.ttest_ind(a, b) 

输出

Ttest_indResult(statistic=-1.497229887954618, pvalue=0.1372503797899352)

产生的输出包括:

  • T统计值/statistic: 是一个数字,其符号与两个随机过程的差值成正比,其大小与该差值的显著性有关。
  • p值/pvalue: 两个过程相同的概率。如果它接近1,这两个过程几乎肯定是相同的。越接近于零,这些过程就越有可能有不同均值。

猜你喜欢

转载自www.cnblogs.com/huanghanyu/p/13170675.html