数理统计必备统计计量计算方法及Python实现

数据样本是可以从一个域或进程生成的所有可能的观测的更广泛的总体中获得的快照。

有趣的是,许多观测符合一个共同的模式或分布称为正态分布,或更正式,高斯分布。人们对高斯分布有很多了解,因此,统计的各个子领域和统计方法都可以用在高斯数据上。

高斯分布

数据分布指的是它在绘图时所具有的形状,例如使用直方图。

最常见的也是众所周知的连续值的分布是钟形曲线。因为它是很多数据都属于的分布。它也被称为高斯分布,更正式地以卡尔·弗里德里希·高斯命名。

因此,您将看到对数据是正态分布或高斯分布的引用,它们是可互换的,两者都指向相同的东西,数据看起来像高斯分布。

一些具有高斯分布的观测实例包括:

  • 人们的身高
  • 智商分数
  • 体温
  • 让我们来看看正态分布。下面是一些生成和绘制理想高斯分布的代码。

    from numpy import arange
    from matplotlib import pyplot
    from scipy.stats import norm
    # x-axis for the plot
    x_axis = arange(-3, 3, 0.001)
    # y-axis as the gaussian
    y_axis = norm.pdf(x_axis, 0, 1)
    # plot data
    pyplot.plot(x_axis, y_axis)
    pyplot.show()

    运行该示例将生成理想高斯分布的图。

    X轴是观测,y轴是每次观测的频率.在这种情况下,0.0左右的观测是最常见的,而在-3.0和3.0左右的观测是罕见或不可能的。

    当数据是高斯的时候,或者当我们假设统计量是高斯分布时,这是很有帮助的。这是因为高斯分布是非常清楚的。因此,统计领域的很大一部分专门用于这种分布的方法。

    值得庆幸的是,我们在机器学习中使用的许多数据往往符合高斯分布,例如我们可以用来拟合模型的输入数据,以及对不同训练数据样本的模型重复评估。

    并不是所有的数据都是高斯的,有时通过查看数据的直方图图或使用统计测试进行检查,做出这一发现是很重要的。一些不符合高斯分布的观测实例包括:

  • 人民的收入
  • 城市人口
  • 图书销售情况
  • 样本与群体 Sample vs Population

    我们可以想象由某个未知过程生成的数据。

    我们收集的数据称为数据样本,而所有可能收集的数据都称为总体数据。

  • 数据样本 一组观察的子集。
  • 数据总体 每组观察数据的全部内容。
  • 这是一个重要的区别,因为对样本和总体使用不同的统计方法,而在应用机器学习中,我们经常使用数据样本。如果你阅读或使用“人口“当谈到机器学习中的数据时,它很可能是指统计方法中的样本。

    在机器学习中将遇到的两个数据示例包括:

  • 训练数据集和测试数据集。
  • 模型的评估成绩。
  • 在使用统计方法时,我们通常只使用样本中的观测结果来声明总体情况。

    这方面的两个明确例子包括:

  • 训练样本必须代表观测的总体,这样我们才能适应一个有用的模型。
  • 测试样本必须代表观察的总体情况,这样我们才能对模型技能进行公正的评估。
  • 因为我们正在处理样本,并对种群进行索赔,这意味着总是存在一些不确定性,理解和 告这种不确定性是很重要的。

    测试数据集 Test Dataset

    在我们研究高斯分布的数据的一些重要的汇总统计信息之前,让我们首先生成一个我们可以处理的数据样本。

    我们可以使用 randn() ,NumPy函数生成一个从高斯分布中抽取的随机数样本。

    定义任意高斯分布的两个关键参数是均值和标准差。稍后,我们将更深入地研究这些参数,因为它们也是关键统计数据,用于估计何时从未知的高斯分布中提取数据。

    这个 randn() 函数将从高斯分布中生成指定数目的随机数(例如10,000),其均值为零,标准差为1。然后,通过重新标度这些数字,我们可以将这些数字缩放到我们选择的高斯。

    通过添加所需的平均值(例如50)并将该值乘以标准差(5),可以使这一结果保持一致。

    data = 5 * randn(10000) + 50

    然后,我们可以使用直方图绘制数据集,并查找所绘制数据的预期形状。

    下面列出了完整的示例。

    from numpy.random import seed
    from numpy.random import randn
    from matplotlib import pyplotseed(1)data = 5 * randn(10000) + 50
    # 直方图
    pyplot.hist(data)
    pyplot.show()

    运行该示例将生成数据集并将其绘制为直方图。

    我们几乎可以看到高斯形状的数据,但它是块状。这突出了一个重要的问题。

    有时,数据将不是一个完美的高斯,但它将有一个类似高斯分布。它几乎是高斯的,如果以另一种方式绘制,以某种方式缩放,或者收集更多的数据,它可能会更高斯。

    通常,在处理类高斯数据时,我们可以将其视为高斯数据,并使用所有相同的统计工具并获得可靠的结果。

    在这个数据集的情况下,我们确实有足够的数据,因为绘图函数选择了一个任意大小的桶来分割数据,所以图是块的。我们可以选择一种不同的、更细粒度的方式来分割数据,并更好地公开底层的高斯分布。

    下面列出了具有更精细情节的更新示例。

    from numpy.random import seed
    from numpy.random import randn
    from matplotlib import pyplot
    # seed the random number generator
    seed(1)
    # generate univariate observations
    data = 5 * randn(10000) + 50
    # histogram of generated data
    pyplot.hist(data, bins=100)
    pyplot.show()

    通过这个例子,我们可以看到,选择数据的100个分块可以更好地创建一个能清楚地显示数据的高斯分布的图形。

    数据集是由一个完美的高斯产生的,但是这些数据是随机选择的,我们只为我们的样本选择了10,000个观测值。您可以看到,即使使用这种受控设置,数据示例中也存在明显的噪声。

    这突出了另一个要点:我们应该总是期望数据样本中有一些噪声或限制。与纯基础分布相比,数据示例始终包含错误。

    中心倾向 Central Tendency

    分布的中心倾向是指分布中的中间值或典型值。最常见或最有可能的价值。

    在高斯分布中,中心趋势被称为均值,或者更正式地称为算术平均,是定义任意高斯分布的两个主要参数之一。

    一个样本的平均值计算为观察值的总和除以样本中的观测总数。

    mean = sum(data) / length(data)

    它还以更紧凑的形式写成:

    mean = 1 / length(data) * sum(data)

    我们可以使用mean()数组上的NumPy函数。

    result = mean(data)

    下面的示例在上一节中开发的测试数据集上演示了这一点。

    from numpy.random import seed
    from numpy.random import randn
    from numpy import mean
    # seed the random number generator
    seed(1)
    # generate univariate observations
    data = 5 * randn(10000) + 50
    # calculate mean
    result = mean(data)
    print('Mean: %.3f' % result)

    运行该示例将计算并打印示例的平均值。

    计算样本的算术平均值是对从样本中提取的总体的基本高斯分布参数的估计。作为一个估计,它将包含错误。

    因为我们知道基础分布的真实平均值是50,所以我们可以看到,从10,000个观测样本中得到的估计是相当准确的。

    Mean: 50.049

    平均值很容易受到离群点值的影响,即远离平均值的稀有值。这些可能是合理地罕见的观察到边缘的分布或误差。

    此外,这种中庸可能会造成误导。计算另一分布上的均值,例如均匀分布或功率分配,可能没有什么意义,因为虽然可以计算这个值,但它指的是一个看似任意的期望值,而不是分布的真正中心趋势。

    在离群点或非高斯分布的情况下,一种常用的计算中心趋势是中间值。

    中值是通过首先对所有数据进行排序,然后在样本中定位中间值来计算的。如果有一些奇数的观察,这是很简单的。如果观测数为偶数,则将中值计算为中间两个观测值的平均值。

    我们可以通过调用median() NumPy函数

    result = median(data)

    下面的示例在测试数据集中演示了这一点。

    from numpy.random import seed
    from numpy.random import randn
    from numpy import median
    # seed the random number generator
    seed(1)
    # generate univariate observations
    data = 5 * randn(10000) + 50
    # calculate median
    result = median(data)
    print('Median: %.3f' % result)

    通过这个例子,我们可以看到中位数是从样本中计算出来的。

    结果与平均值没有太大的不同,因为样本具有高斯分布。如果数据有一个不同的(非高斯)分布,中位数可能与平均数有很大的不同,也许更好地反映了底层人群的中心倾向。

    Median: 50.042

    方差 Variance

    分布的差异是指观测值与平均值的变化或差异的平均值。

    把方差看作是一种分布传播的尺度是很有用的。低方差的值将围绕平均值分组(例如,窄钟形),而高方差的值将从平均值(例如宽钟形)中展开。

    我们可以用一个例子证明这一点,通过绘制低方差和高方差的理想化高斯。下面列出了完整的示例。

    from numpy import arange
    from matplotlib import pyplot
    from scipy.stats import norm
    # x-axis for the plot
    x_axis = arange(-3, 3, 0.001)
    # plot low variance
    pyplot.plot(x_axis, norm.pdf(x_axis, 0, 0.5))
    # plot high variance
    pyplot.plot(x_axis, norm.pdf(x_axis, 0, 1))
    pyplot.show()

    运行该示例绘制了两个理想的高斯分布:蓝色分布和橙色分布,它们的方差都在平均值附近,而橙色分布的方差越大,差异越大。

    从高斯分布抽取的数据样本的方差计算为样本中每个观测值从样本平均数中的平均平方差:

    variance = 1 / (length(data) - 1) * sum(data[i] - mean(data))^2

    其中,差异通常表示为S^2清楚地显示度量的平方单位。你可以从观测的数量中看到没有(-1)的方程,这是对总体的方差的计算,而不是样本。

    我们可以使用 var() 功能。

    下面的示例演示测试问题的计算方差。

    from numpy.random import seed
    from numpy.random import randn
    from numpy import var
    # seed the random number generator
    seed(1)
    # generate univariate observations
    data = 5 * randn(10000) + 50
    # calculate variance
    result = var(data)
    print('Variance: %.3f' % result)

    运行此示例将计算并打印差异。

    Variance: 24.939

    因为这些单位是观测值的平方单位,所以很难解释方差。通过取结果的平方根,我们可以将这些单位返回到观测的原始单位。

    例如,24.939的平方根约为4.9。

    通常,当高斯分布的传播被总结时,它是用方差的平方根来描述的。这就是所谓的标准差。标准差和平均值是指定任何高斯分布所需的两个关键参数。

    我们可以看到,4.9的值非常接近为测试问题创建样本时指定的标准差5的值。

    我们可以将方差计算封装在平方根中,从而直接计算标准差。

    standard_deviation = sqrt(1 / (length(data) - 1) * sum(data[i] - mean(data))^2)

    标准偏差通常写为s或希腊文小写字母西格玛。

    数组的标准偏差可以在NumPy中通过std()功能。

    下面的示例演示了测试问题的标准偏差的计算。

    from numpy.random import seed
    from numpy.random import randn
    from numpy import std
    # seed the random number generator
    seed(1)
    # generate univariate observations
    data = 5 * randn(10000) + 50
    # calculate standard deviation
    result = std(data)
    print('Standard Deviation: %.3f' % result)

    运行该示例将计算并打印示例的标准差。该值与方差的平方根相匹配,非常接近5.0,即问题定义中指定的值。

    Standard Deviation: 4.994

    方差的度量可以对非高斯分布进行计算,但通常需要对分布进行识别,以便计算特定于该分布的特殊方差度量。

    交叉验证 K flod

    在应用机器学习中,通常需要 告算法的结果。

    这通常是通过 告k倍交叉验证或其他一些重复抽样过程的平均性能来实现的。

    在 告模型技能时,您实际上是在总结技能分数的分布,并且很可能技能分数将从高斯分布中提取。

    通常只 告模型的平均性能。这将隐藏模型技能分布的另外两个重要细节。

    至少,我建议 告模型分数的高斯分布和样本大小的两个参数。理想情况下,最好确认模型的技能分数确实是高斯的,或者看起来足够高斯,足以维护 告高斯分布的参数。

    这一点很重要,因为技能分数的分布可以由你重构,并可能与模型在未来相同问题上的技能相比较。

    #机器学习##python##数理统计#

    声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!

    (0)
    上一篇 2022年1月20日
    下一篇 2022年1月21日

    相关推荐