数理统计是数学的一个分支,它以概率论为基础,研究大量随机现象的统计规律性。本节介绍数理统计基础知识,以及PyTorch中的主要统计函数及其案例。
概率论与数理统计是从数量化的角度来研究现实世界中一类不确定现象(随机现象)规律性的一门应用数学学科。下面分别介绍概率论与数理统计的基础知识。
在生活和工作中,人们会观察到各种各样的现象,归纳起来,分为两大类:
一类是可预言其结果的,即在保持条件不变的情况下,重复进行试验,其结果总是确定的,必然发生。这类现象称为必然现象或确定性现象。
另一类是事前不可预言其结果的,即在保持条件不变的情况下,重复进行试验,其结果未必相同。这类在个别试验中其结果呈现偶然性、不确定性的现象,称为随机现象或不确定性现象。
研究随机试验,仅知道可能发生哪些随机事件是不够的,还需要了解各种随机事件发生的可能性大小,以揭示这些事件内在的统计规律性。
这就要求有一个能够衡量事件发生可能性大小的数量指标,这个指标应该是事件本身所固有的,且不随人的主观意志而改变,称之为概率。事件 A 的概率记为 P ( A )。
在相同条件下进行 n 次重复试验,如果随机事件 A 发生的次数为 m ,那么 m / n 称为随机事件 A 的频率;当试验重复数 n 逐渐增大时,随机事件 A 的频率越来越稳定地接近某一数值 p ,那么就把 p 称为随机事件 A 的概率。这样定义的概率称为统计概率。
若连续型随机变量 x 的概率密度函数为:
其中 μ 为平均数, σ 2 为方差,则称随机变量 x 服从正态分布,记为 x ~N(μ, σ 2 )。相应的概率分布函数为:
称 μ =0, σ 2 =1的正态分布为标准正态分布,标准正态分布的概率密度函数及分布函数为:
若 n 个相互独立的随机变量 X 1 , X 2 ,…, X n 均服从标准正态分布(也称独立同分布于标准正态分布),则这 n 个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律称为卡方分布。
T 分布用于根据小样本来估计呈正态分布且方差未知的总体的均值。设随机变量 X 服从标准正态分布,变量 Y 服从卡方分布且独立,则称:
为自由度为 n 的 t 分布。
设 X 和 Y 分别服从自由度为 n 1 和 n 2 的卡方分布,则称统计量 F 服从 F 分布。
自由度(df)指的是计算某一统计量时,取值不受限制的变量个数,通常df= n - k ,其中 n 为样本数量, k 为被限制的条件数或变量个数。
抽样指标值随着样本的变动而变动,因而抽样指标和总体指标的误差仍然是一个随机变量,不能保证误差不超过一定范围的这件事是必然的,而只能给以一定程度的概率保证(置信度)。
对于总体的被估计指标 X ,找出样本的两个估计量 x 1 和 x 2 ,使被估计指标 X 落在区间( x 1 , x 2 )内的概率1-α,(0<α<1)为已知的。我们称区间( x 1 , x 2 )为总体指标 X 的置信区间,其估计置信度为1-α,称α为显著性水平, x 1 是置信下限, x 2 是置信上限。
平均值(均值)是集中趋势中最常用、最重要的测度值,根据数据的表现形式不同,平均值有简单平均值和加权平均值两种。
简单平均值是将总体各单位每一个值加总得到的总量除以单位总量而求出的平均指标,其计算公式如下:
简单平均值适用于总体单位数较少的未分组数据。如果所给的资料是已经分组的数据,则平均值的计算应采用加权平均值的形式。
加权平均值是首先用各组的值乘以相应的各组单位数求出各组总量,并加总求得总体总量,而后再将总体总量和总体单位总量对比,其计算公式如下:
其中 f 表示各组的单位数,或者说是频数或权数。
例如,某企业第一次进货量为100吨,单价为1.5元;第二次进货量为120吨,单价为1.4元;第三次进货量为150吨,单价为1.2元。三次进货单价的平均值计算如下:
简单平均值:(1.5+1.4+1.2)/3= 1.37(元)。
加权平均值:(100×1.5+120×1.4+150×1.2)/(100+120+150)= 1.35(元)。
中位数是将总体单位某一变量的各个变量值按大小顺序排列,处在数列中间位置的那个变量值就是中位数。
将各变量值按大小顺序排序后,首先确定中位数的位置,可用公式( n +1)/2确定, n 代表总体单位的项数;然后根据中点位置确定中位数。有两种情况:当 n 为奇数项时,则中位数就是居于中间位置的那个变量值;当 n 为偶数项时,则中位数是位于中间位置的两个变量值的平均数。
例如,序列3、1、2、5、4的中位数是3,而序列3、1、2、4的中位数是2.5。
众数是总体中出现次数最多的值,即最普遍、最常见的值。众数只有在总体单位较多而又有明确的集中趋势的资料中才有意义。在单项数列中,出现最多的那个组的值就是众数。若在数列中有两组的次数是相同的,且次数最多,则就是双众数。
例如,序列9、18、15、7、4、6、9、9、6的众数是9。
如果将一组数据排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。常用的有四分位数,指的是将数据分为4等份,分别位于25%、50%和75%处的分位数。百分位数的优点是不受极端值的影响,但是不能用于定类数据。
例如,序列9、1、5、7、4、6、8、3、2、10的25%百分位数是2.5,50%百分位数是5。
方差是总体各单位变量值与其平均数的离差平方的平均数,用 σ 2 表示,方差的平方根是标准差 σ 。与方差不同的是,标准差是具有量纲(即单位)的,它与变量值的计量单位相同,其实际意义要比方差清楚。因此,在对社会经济现象进行分析时,往往更多地使用标准差。
根据数据不同,方差和标准差的计算有两种形式:简单平均式和加权平均式。
在数据未分组的情况下,采用简单平均式,公式如下:
例如,序列1、2、3、4、5、6、7、8、9、10的方差为8.25,标准差为2.87。
在数据分组的情况下,采用加权平均式,公式如下:
例如,某企业第一次进货量为100吨,单价为1.5元;第二次进货量为120吨,单价为1.4元;第三次进货量为150吨,单价为1.2元。三次进货单价的方差为0.016426426,标准差为0.128165621。
极差又称全距或范围,它是总体单位中最大变量值与最小变量值之差,即两极之差,以R表示。根据全距的大小来说明变量值变动范围的大小,公式如下:
R = X max - X min
极差只是利用了一组数据两端的信息,不能反映出中间数据的分散状况,因而不能准确描述出数据的分散程度,且易受极端值的影响。
顾名思义,最大值即样本数据中取值最大的数据。
即样本数据中取值最小的数据。
变异系数是将标准差与其平均数对比所得的比值,又称离散系数,公式如下:
变异系数是衡量数据中各观测值变异程度的统计量。当进行两个或多个资料变异程度的比较时,如果平均数相同,则可以直接利用标准差来比较。如果平均数不同,则比较其变异程度不能采用标准差,而需要采用标准差与平均数的比值(相对值)来比较。
偏度是对分布偏斜方向及程度的测度。测量偏斜的程度需要计算偏态。常用三阶中心矩除以标准差的三次方,表示数据分布的相对偏斜程度。其计算公式如下:
在公式中, a 3 为正,表示分布为右偏; a 3 为负,表示分布为左偏。
峰度是频数分布曲线与正态分布相比较,顶端的尖峭程度。统计上常用四阶中心矩测定峰度,其计算公式如下:
当 a 4 =3时,分布曲线为正态分布。
当 a 4 <3时,分布曲线为平峰分布。
当 a 4 >3时,分布曲线为尖峰分布。
Z 标准化得分是某一数据与平均数的距离以标准差为单位的测量值。其计算公式如下:
在公式中, Z i 即为 X i 的Z标准化得分。Z标准化的绝对值越大,说明它离平均数越远。
标准化后的数值能表明各原始数据在一组数据分布中的相对位置,而且还能在不同分布的各组原始数据间进行比较。因此,标准化值在统计分析中起着十分重要的作用。
PyTorch与其他统计软件一样,也内置了丰富的统计函数。下面结合案例重点介绍求和、求均值、求方差、求标准差、求中位数等一些常用的统计函数。
torch.prob()函数返回所有元素的积,用法如下:
torch.prob(input, dtype=None)
设置参数input,代码如下:
print(torch.prod(a))
输出如下:
tensor(0.0039)
torch.sum()函数对输入的tensor数据的某一维度求和,一共有两种用法,代码如下:
torch.sum(input, dtype=None) torch.sum(input, dim, keepdim=False, dtype=None)
参数说明:
● Input:输入一个tensor。
● dim:要求和的维度,可以是一个列表,当dim=0时,即第0个维度会缩减,也就是说将 N 行压缩成一行,故相当于对列进行求和;当dim=1时,对行进行求和。
● keepdim:求和之后这个dim的元素个数为1,所以要被去掉,如果要保留这个维度,则应当让keepdim=True。
首先,创建初始张量,代码如下:
import torch a = torch.rand(2,2) print(a)
输出如下:
tensor([[0.0528, 0.3420], [0.5011, 0.4264]])
设置参数input和dim,代码如下:
a1 = torch.sum(a) a2 = torch.sum(a, dim=(0, 1)) a3 = torch.sum(a, dim=0) a4 = torch.sum(a, dim=1) print(a1) print(a2) print(a3) print(a4)
输出如下:
tensor(1.3223) tensor(1.3223) tensor([0.5539, 0.7684]) tensor([0.3948, 0.9275])
设置参数keepdim,代码如下:
a5 = torch.sum(a, dim=(0, 1), keepdim=True) a6 = torch.sum(a, dim=(0, ), keepdim=True) a7 = torch.sum(a, dim=(1, ), keepdim=True) print(a5) print(a6) print(a7)
输出如下:
tensor([[1.3223]]) tensor([[0.5539, 0.7684]]) tensor([[0.3948], [0.9275]])
torch.mean()函数对输入的tensor数据的某一维度求平均值,参数与torch.sum()函数类似,也有两种用法:
torch.mean(input, dtype=None) torch.mean(input, dim, keepdim=False, dtype=None)
设置参数input和dim,代码如下:
a8 = torch.mean(a) a9 = torch.mean(a, dim=(0, 1)) a10 = torch.mean(a, dim=0) a11 = torch.mean(a, dim=1) print(a8) print(a9) print(a10) print(a11)
输出如下:
tensor(0.3306) tensor(0.3306) tensor([0.2770, 0.3842]) tensor([0.1974, 0.4638])
设置参数keepdim,代码如下:
a12 = torch.mean(a, dim=(0, 1), keepdim=True) a13 = torch.mean(a, dim=(0, ), keepdim=True) a14 = torch.mean(a, dim=(1, ), keepdim=True) print(a12) print(a13) print(a14)
输出如下:
tensor([[0.3306]]) tensor([[0.2770, 0.3842]]) tensor([[0.1974], [0.4638]])
torch.max()函数返回最大值,参数与torch.sum()函数类似,但是参数dim需要是整数,也有两种用法,代码如下:
torch.max(input, dtype=None) torch.max(input, dim, keepdim=False, dtype=None)
设置参数input和dim,代码如下:
a15 = torch.max(a) a16 = torch.max(a, dim=0) a17 = torch.max(a, dim=1) print(a15) print(a16) print(a17)
输出如下:
tensor(0.5011) torch.return_types.max( values=tensor([0.5011, 0.4264]), indices=tensor([1, 1])) torch.return_types.max( values=tensor([0.3420, 0.5011]), indices=tensor([1, 0]))
设置参数keepdim,代码如下:
a18 = torch.max(a, 0, keepdim=True) a19 = torch.max(a, 1, keepdim=True) print(a18) print(a19)
输出如下:
torch.return_types.max( values=tensor([[0.5011, 0.4264]]), indices=tensor([[1, 1]])) torch.return_types.max( values=tensor([[0.3420], [0.5011]]), indices=tensor([[1], [0]]))
torch.min()函数返回最小值,参数与torch.max()函数类似,也有两种用法,代码如下:
torch.min(input, dtype=None) torch.min(input, dim, keepdim=False, dtype=None)
设置参数input和dim,代码如下:
a20 = torch.min(a) a21 = torch.min(a, dim=0) a22 = torch.min(a, dim=1) print(a20) print(a21) print(a22)
输出如下:
tensor(0.0528) torch.return_types.min( values=tensor([0.0528, 0.3420]), indices=tensor([0, 0])) torch.return_types.min( values=tensor([0.0528, 0.4264]), indices=tensor([0, 1]))
设置参数keepdim,代码如下:
a23 = torch.min(a, 0, keepdim=True) a24 = torch.min(a, 1, keepdim=True) print(a23) print(a24)
输出如下:
torch.return_types.min( values=tensor([[0.0528, 0.3420]]), indices=tensor([[0, 0]])) torch.return_types.min( values=tensor([[0.0528], [0.4264]]), indices=tensor([[0], [1]]))
torch.median():返回中位数,参数与torch.max()函数类似,也有两种用法,代码如下:
torch.median(input, dtype=None) torch.median(input, dim, keepdim=False, dtype=None)
设置参数input和dim,代码如下:
print(torch.median(a)) print(torch.median(a, 1))
输出如下:
tensor(0.3420) torch.return_types.median( values=tensor([0.0528, 0.4264]), indices=tensor([0, 1]))
设置参数keepdim,代码如下:
torch.median(a, 1, keepdim=True)
输出如下:
torch.return_types.median( values=tensor([[0.0528], [0.4264]]), indices=tensor([[0], [1]]))
torch.mode():返回众数,参数与torch.max()函数类似,也有两种用法,代码如下:
torch.mode(input, dtype=None) torch.mode(input, dim, keepdim=False, dtype=None)
设置参数input和dim,代码如下:
print(torch.mode(a)) print(torch.mode(a, 0))
输出如下:
torch.return_types.mode( values=tensor([0.0528, 0.4264]), indices=tensor([0, 1])) torch.return_types.mode( values=tensor([0.0528, 0.3420]), indices=tensor([0, 0]))
设置参数keepdim,代码如下:
torch.mode(a, 1, keepdim=True)
输出如下:
torch.return_types.mode( values=tensor([[0.0528], [0.4264]]), indices=tensor([[0], [1]]))
torch.var():返回输入张量中所有元素的方差,也有两种用法,代码如下:
torch.var(input, unbiased=True) torch.var(input, dim, unbiased=True, keepdim=False, *, out=None)
参数说明:
● input:输入一个tensor。
● dim:要求和的维度,可以是一个列表,当dim=0时,即第0个维度会缩减,也就是说将N行压缩成一行,故相当于对列进行求和;当dim=1时,对行进行求和。
● unbiased:是否使用无偏估计,布尔型。如果unbiased为False,则将通过有偏估计量计算方差,否则将使用“贝塞尔校正”更正。
● keepdim:求和之后这个dim的元素个数为1,所以要被去掉,如果要保留这个维度,则应当让keepdim=True。
设置参数input和dim,代码如下:
torch.var(a, 1)
输出如下:
tensor([0.0418, 0.0028])
设置参数unbiased,代码如下:
torch.var(a, 1, unbiased=False)
输出如下:
tensor([0.0209, 0.0014])
设置参数keepdim,代码如下:
torch.var(a, 1, unbiased=False, keepdim=True)
输出如下:
tensor([[0.0209], [0.0014]])
torch.std():返回输入张量中所有元素的标准差,参数与torch.var()函数类似,也有两种用法,代码如下:
torch.std(input, unbiased=True) torch.std(input, dim, unbiased=True, keepdim=False, *, out=None)
设置参数input和dim,代码如下:
torch.std(a, 1)
输出如下:
tensor([0.2045, 0.0529])
设置参数unbiased,代码如下:
torch.std(a, 1, unbiased=False)
输出如下:
tensor([0.1446, 0.0374])
设置参数keepdim,代码如下:
torch.std(a, 1, unbiased=False, keepdim=True)
输出如下:
tensor([[0.1446], [0.0374]])