精华内容
下载资源
问答
  • 算法系列之二十一:实验数据与曲线拟合

    万次阅读 多人点赞 2013-10-16 22:17:15
    曲线拟合(Curve Fitting)的数学定义是指用连续曲线近似地刻画或比拟平面上一组离散点所表示的坐标之间的函数关系,是一种用解析表达式逼近离散数据的方法。...就可以根据曲线方程对数据进行数学计算,实验结果进行

    12.1 曲线拟合

    12.1.1 曲线拟合的定义

            曲线拟合(Curve Fitting)的数学定义是指用连续曲线近似地刻画或比拟平面上一组离散点所表示的坐标之间的函数关系,是一种用解析表达式逼近离散数据的方法。曲线拟合通俗的说法就是“拉曲线”,也就是将现有数据透过数学方法来代入一条数学方程式的表示方法。科学和工程遇到的很多问题,往往只能通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,如果能够找到一个连续的函数(也就是曲线)或者更加密集的离散方程,使得实验数据与方程的曲线能够在最大程度上近似吻合,就可以根据曲线方程对数据进行数学计算,对实验结果进行理论分析,甚至对某些不具备测量条件的位置的结果进行估算。

    12.1.2 简单线性数据拟合的例子

            回想一下中学物理课的“速度与加速度”实验:假设某物体正在做加速运动,加速度未知,某实验人员从时间t0 = 3秒时刻开始,以1秒时间间隔对这个物体连续进行了12次测速,得到一组速度和时间的离散数据,请根据实验结果推算该物体的加速度。

    时间 (秒)

    3

    4

    5

    6

    7

    8

    9

    10

    速度(米/秒)

    8.41

    9.94

    11.58

    13.02

    14.33

    15.92

    17.54

    19.22

    时间 (秒)

    11

    12

    13

    14

     

     

     

     

    速度(米/秒)

    20.49

    22.01

    23.53

    24.47

     

     

     

     

    表 12 – 1 物体速度和时间的测量关系表

            在选择了合适的坐标刻度之后,我们就可以在坐标纸上画出这些点。如图12–1所示,排除偏差明显偏大的测量值后,可以看出测量结果呈现典型的线性特征。沿着该线性特征画一条直线,使尽量多的测量点能够位于直线上,或与直线的偏差尽量小,这条直线就是我们根据测量结果拟合的速度与时间的函数关系。最后在坐标纸上测量出直线的斜率K,K就是被测物体的加速度,经过测量,我们实验测到的物体加速度值是1.48米/秒2。

     

    图 12 – 1 实验法测量加速度的过程

     

    12.2 最小二乘法曲线拟合

            使用数学分析进行曲线拟合有很多常用的方法,这一节我们先介绍一下最简单的最小二乘法,并给出使用最小二乘法解决上一节给出的速度与加速度实验问题。

     

    12.2.1 最小二乘法原理

            最小二乘法(又称最小平方法)通过最小化误差的平方和寻找数据的最佳函数匹配,利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小,当然,做为一种插值方法使用时,最小二乘法也可以用于曲线拟合。使用最小二乘法进行曲线拟合是曲线拟合种早期的一种常用方法,不过,最小二乘法理论简单,计算量小,即便是在使用三次样条曲线或RBF(Radial Basis Function)进行曲线拟合大行其道的今天,最小二乘法在多项式曲线或直线的拟合问题上,仍然得到广泛地应用。使用最小二乘法,选取的匹配函数的模式非常重要,如果离散数据呈现的是指数变化规律,则应该选择指数形式的匹配函数模式,如果是多项式变化规律,则应该选择多项式匹配模式,如果选择的模式不对,拟合的效果就会很差,这也是使用最小二乘法进行曲线拟合时需要特别注意的一个地方。

            下面以多项式模式为例,介绍一下使用最小二乘法进行曲线拟合的完整步骤。假设选择的拟合多项式模式是:

    这m个等式相当于m个方程,a0,a1,…am是m个未知量,因此这m个方程组成的方程组是可解的,最小二乘法的第二步处理就是将其整理为针对a0,a1,…am的正规方程组。最终整理的方程组如下:

    最小二乘法的第三步处理就是求解这个多元一次方程组,得到多项式的系数a0,a1,…am,,就可以得到曲线的拟合多项式函数。求解多元一次方程组的方法很多,高斯消元法是最常用的一种方法,下一节就简单介绍一下最小二乘算法实现所用的高斯消元法算法。

    12.2.2 高斯消元法求解方程组

            在数学上,高斯消元法是线性代数中的一个算法,可用来求解多元一次线性方程组,也可以用来求矩阵的秩,以及求可逆方阵的逆矩阵。高斯消元法虽然以数学家高斯的名字命名,但是最早出现在文献资料中应该是中国的《九章算术》。

            高斯消元法的主要思想是通过对系数矩阵进行行变换,将方程组的系数矩阵由对称矩阵变为三角矩阵,从而达到消元的目的,最后通过回代逐个获得方程组的解。在消元的过程中,如果某一行的对角线元素的值太小,在计算过程中就会出现很大的数除以很小的数的情况,有除法溢出的可能,因此在消元的过程中,通常都会增加一个主元选择的步骤,通过行交换操作,将当前列绝对值最大的行交换到当前行位置,避免了除法溢出问题,增加了算法的稳定性。

            高斯消元法算法实现简单,主要有两个步骤组成,第一个步骤就是通过选择主元,逐行消元,最终行程方程组系数矩阵的三角矩阵形式,第二个步骤就是逐步回代的过程,最终矩阵的对角线上的元素就是方程组的解。下面就给出高斯消元法的一个算法实现:

     76 /*带列主元的高斯消去法解方程组,最后的解在matrixA的对角线上*/

     77 bool GuassEquation::Resolve(std::vector<double>& xValue)

     78 {

     79     assert(xValue.size() == m_DIM);

     80 

     81     /*消元,得到上三角阵*/

     82     for(int i = 0; i < m_DIM - 1; i++)

     83     {

     84         /*按列选主元*/

     85         int pivotRow = SelectPivotalElement(i);

     86         if(pivotRow != i)/*如果有必要,交换行*/

     87         {

     88             SwapRow(i, pivotRow);

     89         }

     90         if(IsPrecisionZero(m_matrixA[i * m_DIM + i])) /*主元是0? 不存在唯一解*/

     91         {

     92             return false;

     93         }

     94         /*对系数归一化处理,使行第一个系数是1.0*/

     95         SimplePivotalRow(i, i);

     96         /*逐行进行消元*/

     97         for(int j = i + 1; j < m_DIM; j++)

     98         {

     99             RowElimination(i, j, i);

    100         }

    101     }

    102     /*回代求解*/

    103     m_matrixA[(m_DIM - 1) * m_DIM + m_DIM - 1] = m_bVal[m_DIM - 1] / m_matrixA[(m_DIM - 1) * m_DIM + m_DIM - 1];

    104     for(int i = m_DIM - 2; i >= 0; i--)

    105     {

    106         double totalCof = 0.0;

    107         for(int j = i + 1; j < m_DIM; j++)

    108         {

    109             totalCof += m_matrixA[i * m_DIM + j] * m_matrixA[j * m_DIM + j];

    110         }

    111         m_matrixA[i * m_DIM + i] = (m_bVal[i] - totalCof) / m_matrixA[i * m_DIM + i];

    112     }

    113 

    114     /*将对角线元素的解逐个存入解向量*/

    115     for(int i = 0; i < m_DIM; i++)

    116     {

    117         xValue[i] = m_matrixA[i * m_DIM + i];

    118     }

    119 

    120     return true;

    121 }

     

            GuassEquation::Resolve()函数中m_matrixA是以一维数组形式存放的系数矩阵,m_DIM是矩阵的维数,SelectPivotalElement()函数从系数矩阵的第i列中选择绝对值最大的那个值所在的行,并返回行号,SwapRow()函数负责交换系数矩阵两个行的所有值,SimplePivotalRow()函数是归一化处理函数,通过除法操作将指定的行的对角线元素变换为1.0,以便简化随后的消元操作。

    12.2.3 最小二乘法解决“速度与加速度”实验

            根据12.2.1节对最小二乘法原理的分析,用程序实现最小二乘法曲线拟合的算法主要由两个步骤组成,第一个步骤就是根据给出的测量值生成关于拟合多项式系数的方程组,第二个步骤就是解这个方程组,求出拟合多项式的各个系数。根据对上文最终整理的正规方程组的分析,可以看出其系数有一定的关系,就是每一个方程式都比前一个方程式多乘了一个xi。因此,只需要完整计算出第一个方程式的系数,其他方程式的系数只是将前一个方程式的系数依次左移一位,然后单独计算出最后一个系数就可以了,此方法可以减少很多无谓的计算。求解多元一次方程组的方法就使用12.2.2节介绍的高斯消元法,其算法上一节已经给出。

            这里给出一个最小二乘算法的完整实现,以12.1.2节的数据为例,因为数据结果明显呈现线性方程的特征,因此选择拟合多项式为v = v0 + at,v0和a就是要求解的拟合多项式系数。

     99 bool LeastSquare(const std::vector<double>& x_value, const std::vector<double>& y_value,

    100                  int M, std::vector<double>& a_value)

    101 {

    102     assert(x_value.size() == y_value.size());

    103     assert(a_value.size() == M);

    104 

    105     double *matrix = new double[M * M];

    106     double *b= new double[M];

    107 

    108     std::vector<double> x_m(x_value.size(), 1.0);

    109     std::vector<double> y_i(y_value.size(), 0.0);

    110     for(int i = 0; i < M; i++)

    111     {

    112         matrix[ARR_INDEX(0, i, M)] = std::accumulate(x_m.begin(), x_m.end(), 0.0);

    113         for(int j = 0; j < static_cast<int>(y_value.size()); j++)

    114         {

    115             y_i[j] = x_m[j] * y_value[j];

    116         }

    117         b[i] = std::accumulate(y_i.begin(), y_i.end(), 0.0);

    118         for(int k = 0; k < static_cast<int>(x_m.size()); k++)

    119         {

    120             x_m[k] *= x_value[k];

    121         }

    122     }

    123     for(int row = 1; row < M; row++)

    124     {

    125         for(int i = 0; i < M - 1; i++)

    126         {

    127             matrix[ARR_INDEX(row, i, M)] = matrix[ARR_INDEX(row - 1, i + 1, M)];

    128         }

    129         matrix[ARR_INDEX(row, M - 1, M)] = std::accumulate(x_m.begin(), x_m.end(), 0.0);

    130         for(int k = 0; k < static_cast<int>(x_m.size()); k++)

    131         {

    132             x_m[k] *= x_value[k];

    133         }

    134     }

    135 

    136     GuassEquation equation(M, matrix, b);

    137     delete[] matrix;

    138     delete[] b;

    139 

    140     return equation.Resolve(a_value);

    141 }

     

            将表12-1的数据带入算法,计算得到v0 = 4.05545455,a = 1.48818182,比作图法得到的结果更精确。以上算法是根据最小二乘法的理论推导系数方程,并求解系数方程得到拟合多项式的系数的一种实现方法,除此之外,还可以利用预先计算好的最小二乘解析理论直接求得拟合多项式的系数,读者可自行学习相关的实现算法。

     

     

    12.3 三次样条曲线拟合

            曲线拟合基本上就是一个插值计算的过程,除了最小二乘法,其他插值方法也可以被用于曲线拟合。常用的曲线拟合方法还有基于RBF(Radial Basis Function)的曲线拟合和三次样条曲线拟合。最小二乘法方法简单,便于实现,但是如果拟合模式选择不当,会产生较大的偏差,特别是对于复杂曲线的拟合,如果选错了模式,拟合的效果就很差。基于RBF(Radial Basis Function)的曲线拟合方法需要高深的数学基础,涉及多维空间理论,将低维的模式输入数据转换到高维空间中,使得低维空间内的线性不可分问题在高维空间内变得线性可分,这种数学分析方法非常强大,但是这种方法不宜得到拟合函数,因此在需要求解拟合函数的情况下使用起来不是很方便。

            样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。使用三次样条曲线进行曲线拟合可以得到非常高精度的拟合结果,并且很容易得到拟合函数,本节的内容将重点介绍三次样条曲线拟合的原理和算法实现,并通过一个具体的例子将三次样条函数拟合的曲线与原始曲线对比显示,体会一下三次样条曲线拟合的惊人效果。

     

     

    12.3.1 插值函数

            前文提到过,曲线拟合的实质就是各种插值计算,因此,插值函数的选择决定了曲线拟合的效果。那么插值函数的数学定义是什么呢?若在[a, b]上给出n + 1个点a ≤ x0 < x1 < ⋯ < xn ≤ b,f(x) 是[a, b]上的实值函数, 要求一个具有n + 1个参量的函数s(x; a0,...,an) 使它满足

            s(xi; a0,..., an) = f(xi) , i = 0, 1, ⋯, n                          (3.5)

    则称s(x)为f(x) 在[a, b]上的插值函数. 若s(x) 关于参量a0, a1,...,an是线性关系, 即:

            s(x) = a0s0(x) + a1s1(x) + ⋯ + ansn(x)                                (3.6)

    s(x)就是多项式插值函数,如果si(x)是三角函数,则s(x)就是三角插值函数。

            比较常用的多项式插值函数是牛顿插值多项式和拉格朗日插值多项式,但是在多项式的次数比较高的情况下,插值点数n过多会导致多项式插值在收敛性和稳定性上失去保证,因此,当插值点数n较大的情况下,一般不使用多项式插值,而采用样条插值或次数较低的最小二乘法插值。

    12.3.2 样条函数的定义

            在所有能够保证收敛性和稳定性的插值函数中,最常用的,也是最重要的插值函数就是样条插值函数。采用样条函数计算出的插值曲线和曲面在飞机、轮船和汽车等精密机械设计中都得到了广泛的应用。样条插值函数的数学定义是这样的:

    设区间[a, b]上选取n - 1个节点(包括区间端点a和b共n + 1个节点),将其划分为n个子区间 a = x0 < x1 < ⋯ < xn = b, 如果存在函数s(x),使得s(x)满足以下两个条件:

    (1) s(x) 在整个区间[a, b]上具有m - 1阶连续导数;

    (2) s(x)在每个子区间[xi-1, xi], i= 1, 2, ⋯, n 上是m 次代数多项式(最高次数为m次);

    则称s(x)是区间[a, b]上的m 次样条函数。假如区间[a, b]上存在实值函数f(x),使得每个节点处的值f(xi)与s(xi)相等,即

            s(xi) = f(xi), i = 0, 1, …, n                                          (3.7)

    则称s(x)是实值函数f(x)的m 次样条插值函数。

            当m = 1时,样条插值函数就是分段线性插值, 此时虽然s(x)是属于区间[a, b]上的函数, 但它不光滑(连一阶连续导数性质都不具备),不能满足工程设计要求。工程设计通常使用较多的是m = 3时的三次样条插值函数,此时样条函数具有二阶连续导数性质。

            根据三次样条函数的定义,s(x)在每个子区间上的样条函数si(x)都是一个三次多项式,也就是说,三次样条函数s(x)由n个区间上的n个三次多项式组成,每个三次多项式可描述为以下形式:

            si(x) = aix3 + bix2 + cix + di      i = 1, 2, …, n                      (3.8)

    因此,要确定完整的样条函数s(x)需要确定ai、bi、ci和di公4n个系数。根据样条函数的定义,s(x)在区间内的n - 1个节点处都是连续的,并且其一阶导数si‘(x)和二阶导数si“(x)都是连续的,根据连续函数的性质(xi的左右导数相等),我们可以得到3(n - 1)个条件:

            si(xi - 0) = si+1(xi + 0)    i = 1, 2, …, n-1

            si‘(xi - 0) = si+1‘(xi + 0)    i = 1, 2, …, n-1

            si“(xi - 0) = si+1“(xi + 0)    i = 1, 2, …, n-1                          (3.9)

     

    再加上插值函数在包括区间端点a(就是x0),b(就是xn)在内的n + 1个节点处满足s(xi) = f(xi),又可以得到n + 1个条件,这样就具备了4n – 2个条件。

    12.3.3 边界条件

            为了解决4n个系数组成的方程组,最终确定的s(x),需要再补充两个边界条件使之满足4n个条件。常用的边界条件有以下几种:

            第一类边界条件,即满足s‘(x0) = f’(x0),s‘(xn) = f’(xn)两个条件,其中f(x)是实值函数。

            第二类边界条件,即满足s”(x0) = f”(x0),s”(xn) = f”(xn)两个条件,其中f(x)是实值函数。特别情况下,当f”(x0) = f”(xn) = 0的时候,也就是s”(x0) = s”(xn) = 0的情况下,第二类边界条件又被称为自然边界条件。

            当样条函数的实值函数f(x)是以[a, b]为周期的周期函数时,三次样条函数s(x)在两个端点处满足s‘(x0 - 0) = s‘(xn + 0)和s”(x0 - 0) = s”(xn + 0),这种情况又被成为第三类边界条件。

            工程技术中常用的是第一类边界条件和第二类边界条件,以及第二类边界条件的特殊情况自然边界条件。理想情况下,也就是实值函数已知的情况下,可以通过实值函数直接计算出边界条件的值,否则的话,就只能通过测量和计算得到边界条件的值,有时候甚至只能给出经验估计值,工程技术中通常根据实际情况灵活使用各类边界条件。

    12.3.4 推导三次样条函数

            求三次样条插值函数s(x)的方法很多,其基本原理都是首先求出由待定系数组成的s(x),以及其一阶导数s’(x)和二阶导数s”(x),然后将其带入到12.3.2和12.3.3节列举的4n个条件中,得到关于待定系数的方程组,最后求解方程组得到待定系数,并最终确定插值函数s(x)。

            求三次样条插值函数s(x)常用的方法是“三转角法”和“三弯矩法”。根据三次样条函数的性质,s(x)的一阶导数s’(x)是二次多项式, 二阶导数s”(x)是一次多项式(线性函数), “三转角法”和“三弯矩法”的主要区别是利用这两个特性推导插值函数s(x)、s’(x)和s”(x)的方式不同。“三转角法”利用s(x)的一阶导数s’(x)是二次多项式这个特性,对于子区间[xi, xi+1],利用抛物线插值公式获得一个通过xi和xi+1两个点的二次多项式做为s’(x),然后对s’(x)进行积分和微分(求导)运算,分别得到s(x),和s”(x),最后将它们带入4n个条件中求解系数方程组。“三弯矩法”则是利用s(x)的二阶导数s”(x)是一次多项式(线性函数)这个特性,对于子区间[xi, xi+1],首先假设一个通过xi和xi+1两个点的线性函数做为s”(x),然后对s”(x)进行连续两次积分运算得到s(x),再对s(x)进行求导得运算到s’(x),最后将它们带入4n个条件中求解系数方程组。这两种方法的本质是一样的,只是对s(x)的推导过程不同,接下来就介绍使用“三弯矩法”求解三次样条函数的方法。

            三次样条函数的求解过程就是系数方程组的推导过程,使用“三弯矩法”推导系数方程组,首先要确定插值函数的二阶导数s”(x)。根据三次样条函数的性质,在每个子区间[xi, xi+1]上,其二阶导数s”(x)是个线性方程,现在假设在xi和xi+1两个端点的二阶导数值分别是Mi和Mi+1,也就是s”(xi) = Mi,s”(xi+1) = Mi+1,则经过xi和xi+1的两点式直线方程是:

    从M0到Mn,有n+1个Mi的值需要求解,但是(3.20)只有n-1个等式,此时就需要用到两个边界条件了。

            如果是使用第二类边界条件,则直接可以得到以下两个条件等式:

            s”(x0) = M0 = f”(x0) = y0’                                                (3.21)

            s”(xn) = Mn = f”(xn) = yn’                                                (3.22)

    令d0 = 2y0’,dn = 2yn’,可以得到由第二类边界条件确定的两个方程:

            2M0 = d0                                                                    (3.23)

            2Mn = dn                                                                    (3.24)

            如果是使用第一类边界条件,即s‘(x0) = f’(x0),s‘(xn) = f’(xn)两个条件,则需要将这两个条件代入(3.16),通过计算得到两个条件等式。将s‘(x0) = y0’代入(3.16),得到:

    将第二类边界条件得到的(3.23)和(3.24)或第一类边界条件得到的(3.27)和(3.28)与(3.20)中的n – 1个等式组合在一起就得到一个关于Mi的方程组,求解此方程组可以得到Mi的值,代入到(3.15)即可得到三次样条函数方程。以第一类边界条件得到的(3.27)和(3.28)为例,与(3.20)连立得到以下方程组:

    这就是三弯矩方程组,其中Mi,i=0,1,…n就是三次样条函数s(x)的矩。根据(3.27)和(3.28),un = 1,v0 = 1,其余各系数可以通过(3.19)中的系数计算出来。这个方程组的系数矩阵是一个对角线矩阵,并且是一个严格对角占优的对角阵(ui和vi的值均小于主对角线的值,也就是ui和vi的值皆小于2),可以使用追赶法求解。下一节将介绍如何使用追赶法求解方程组,并给出求解的算法实现。

    12.3.5 追赶法求解方程组

            任意矩阵A,都可以通过克洛脱(Crout)分解得到两个三角矩阵:

    其中y1=d1/l1,其余各项的递推计算关系是:

    yi = (di – miyi-1)/li, i = 2,3,… ,n

    对于第二个方程,求解最终结果xi:

    其中xn = yn,其余各项的递推求解关系是:

    xi = yi – uixi+1, i = n – 1, n – 2, …, 1

    递推计算yi和xi的过程分别被形象地形容为追的过程和赶的过程,这也是追赶法得名的原因,实际上这种方法在国际上叫做托马斯(Thomas)法。在这里需要强调一下,对三角矩阵的克洛脱分解需要满足几个条件,否则无法进行,这几个条件分别是:

            下面就给出一个追赶法求解方程组的通用算法实现,在使用之前需要判断系数矩阵是否是对三角矩阵,并且满足上述三个条件,相关的判断请读者自行添加:

     76 /*追赶法求对三角矩阵方程组的解*/

     77 bool ThomasEquation::Resolve(std::vector<double>& xValue)

     78 {

     79     assert(xValue.size() == m_DIM);

     80 

     81     std::vector<double> L(m_DIM);

     82     std::vector<double> M(m_DIM);

     83     std::vector<double> U(m_DIM);

     84     std::vector<double> Y(m_DIM);

     85 

     86     /*消元,追的过程*/

     87     L[0] = m_matrixA[ARR_INDEX(0, 0, m_DIM)];

     88     U[0] = m_matrixA[ARR_INDEX(0, 1, m_DIM)] / L[0];

     89     Y[0] = m_bVal[0] / L[0];

     90     for(int i = 1; i < m_DIM; i++)

     91     {

     92         if(IsPrecisionZero(m_matrixA[ARR_INDEX(i, i, m_DIM)]))

     93         {

     94             return false;

     95         }

     96         M[i] = m_matrixA[ARR_INDEX(i, i - 1, m_DIM)];

     97         L[i] = m_matrixA[ARR_INDEX(i, i, m_DIM)] - M[i] * U[i - 1];

     98         Y[i] = (m_bVal[i] - M[i] * Y[i - 1]) / L[i];

     99         if((i + 1) < m_DIM)

    100         {

    101             U[i] = m_matrixA[ARR_INDEX(i, i + 1, m_DIM)] / L[i];

    102         }

    103     }

    104     /*回代求解,赶的过程*/

    105     xValue[m_DIM - 1] = Y[m_DIM - 1];

    106     for(int i = m_DIM - 2; i >= 0; i--)

    107     {

    108         xValue[i] = Y[i] - U[i] * xValue[i + 1];

    109     }

    110 

    111     return true;

    112 }

     

    12.3.6 三次样条曲线拟合算法实现

            根据12.3.4节对三次样条函数的推导分析,三次样条曲线拟合算法的核心可分为三部分,第一部分是根据推导结果计算关于三次样条函数的“矩”的方程组的系数矩阵,第二部分就是用追赶法求解方程组,得到各个区间的三次样条函数,第三部分就是根据每个拟合点的输入的值xi,确定使用哪个区间的三次样条函数,并使用该区间的三次样条函数计算出三次样条插值yi,最后得到的一系列(xi, yi)组成的曲线就是三次样条拟合曲线。拟合算法也是按照上面的分析,分三个步骤计算插值:

            第一步是计算系数矩阵,其中u0、v0、d0和dn的值需要单独计算,其余的值可以通过(3.19)递推计算出来。

            第二步是将系数矩阵代入12.3.5节给出的追赶法通用算法,求出Mi的值。求解之前,先证明一下第一步得到系数矩阵是否满足追赶法的条件。首先,主对角线元素的值都是2,满足12.3.5节的条件(1)。其次,由ui和vi的计算条件可知,|ui| < 1,|vi| < 1,这也满足12.3.5节的条件(2)。最后,因为ai = 2,且ui和vi的和是1,所以12.3.5节的条件(3)也得到了满足。由上判断可知,求解三次样条函数的“矩”的系数矩阵满足使用追赶法求解的条件,可以使用追赶法求解。

            第三步是计算插值,需要将第二步计算得到的Mi代入(3.15),并选择合适的子区间样条函数计算出插值点的值。

            下面就给出采用三弯矩法实现的三次样条曲线拟合算法,CalcSpline()函数的参数Xi和Yi是n个插值点(包括起点和终点)的值,boundType是边界条件类型,b1和b2分别是对应的两个边界条件,这个算法支持第一类和第二类边界条件(包括自然边界条件)。内部的矩阵matrixA就是按照(3.29)构造的Mi方程组的系数矩阵,可用于直接用追赶法求解方程组。CalcSpline()函数的大部分代码都是在构造Mi方程组的系数矩阵,首先根据边界条件确定un 、v0 、d0和dn,其他系数则根据(3.19)的递推关系,在for(int i = 1; i < (m_valN - 1); i++)循环中依次计算出来,最后是利用12.3.5节给出的追赶法算法求出Mi。GetValue()函数负责计算给定区间内任意位置的插值,首先根据x的值确定使用哪个子区间的样条函数,然后根据(3.12)和(3.14)给出的关系计算插值。

     16 void SplineFitting::CalcSpline(double *Xi, double *Yi, int n, int boundType, double b1, double b2)

     17 {

     18     assert((boundType == 1) || (boundType == 2));

     19 

     20     double *matrixA = new double[n * n];

     21     if(matrixA == NULL)

     22     {

     23         return;

     24     }

     25     double *d = new double[n];

     26     if(d == NULL)

     27     {

     28         delete[] matrixA;

     29         return;

     30     }

     31 

     32     m_valN = n;

     33     m_valXi.assign(Xi, Xi + m_valN);

     34     m_valYi.assign(Yi, Yi + m_valN);

     35     m_valMi.resize(m_valN);

     36     memset(matrixA, 0, sizeof(double) * n * n);

     37 

     38     matrixA[ARR_INDEX(0, 0, m_valN)] = 2.0;

     39     matrixA[ARR_INDEX(m_valN - 1, m_valN - 1, m_valN)] = 2.0;

     40     if(boundType == 1) /*第一类边界条件*/

     41     {

     42         matrixA[ARR_INDEX(0, 1, m_valN)] = 1.0; //v0

     43         matrixA[ARR_INDEX(m_valN - 1, m_valN - 2, m_valN)] = 1.0; //un

     44         double h0 = Xi[1] - Xi[0];

     45         d[0] = 6 * ((Yi[1] - Yi[0]) / h0 - b1) / h0; //d0

     46         double hn_1 = Xi[m_valN - 1] - Xi[m_valN - 2];

     47         d[m_valN - 1] = 6 * (b2 - (Yi[m_valN - 1] - Yi[m_valN - 2]) / hn_1) / hn_1; //dn

     48     }

     49     else /*第二类边界条件*/

     50     {

     51         matrixA[ARR_INDEX(0, 1, m_valN)] = 0.0; //v0

     52         matrixA[ARR_INDEX(m_valN - 1, m_valN - 2, m_valN)] = 0.0; //un

     53         d[0] = 2 * b1; //d0

     54         d[m_valN - 1] = 2 * b2; //dn

     55     }

     56     /*计算ui,vi,di,i = 2,3,...,n-1*/

     57     for(int i = 1; i < (m_valN - 1); i++)

     58     {

     59         double hi_1 = Xi[i] - Xi[i - 1];

     60         double hi = Xi[i + 1] - Xi[i];

     61         matrixA[ARR_INDEX(i, i - 1, m_valN)] = hi_1 / (hi_1 + hi); //ui

     62         matrixA[ARR_INDEX(i, i, m_valN)] = 2.0;

     63         matrixA[ARR_INDEX(i, i + 1, m_valN)] = 1 - matrixA[ARR_INDEX(i, i - 1, m_valN)]; //vi = 1 - ui

     64         d[i] = 6 * ((Yi[i + 1] - Yi[i]) / hi - (Yi[i] - Yi[i - 1]) / hi_1) / (hi_1 + hi); //di

     65     }

     66 

     67     ThomasEquation equation(m_valN, matrixA, d);

     68     equation.Resolve(m_valMi);

     69     m_bCalcCompleted = true;

     70 

     71     delete[] matrixA;

     72     delete[] d;

     73 }

     74 

     75 double SplineFitting::GetValue(double x)

     76 {

     77     if(!m_bCalcCompleted)

     78     {

     79         return 0.0;

     80     }

     81     if((x < m_valXi[0]) || (x > m_valXi[m_valN - 1]))

     82     {

     83         return 0.0;

     84     }

     85     int i = 0;

     86     for(i = 0; i < (m_valN - 1); i++)

     87     {

     88         if((x >= m_valXi[i]) && (x < m_valXi[i + 1]))

     89             break;

     90     }

     91     double hi = m_valXi[i + 1] - m_valXi[i];

     92     double xi_1 = m_valXi[i + 1] - x;

     93     double xi = x - m_valXi[i];

     94 

     95     double y = xi_1 * xi_1 * xi_1 * m_valMi[i] / (6 * hi);

     96     y += (xi * xi * xi * m_valMi[i + 1] / (6 * hi));

     97 

     98     double Ai = (m_valYi[i + 1] - m_valYi[i]) / hi - (m_valMi[i + 1] - m_valMi[i]) * hi / 6.0;

     99     y += Ai * x;

    100     double Bi = m_valYi[i + 1] - m_valMi[i + 1] * hi * hi / 6.0 - Ai * m_valXi[i + 1];

    101     y += Bi;

    102     return y;

    103 }

     

    12.3.7 三次样条曲线拟合的效果

    本节将用定义一个原始函数,从原始函数的某个区间上抽取9个插值点,根据这9个插值点和原函数的边界条件,利用三次样条曲线插值进行曲线拟合,并将原始曲线和拟合曲线做对比,展示一下三次样条曲线拟合的效果。

    首先定义原始函数:

    f(x) = 3/(1 + x2)

     

    选择区间[0.0, 8.0]上的9个点做为插值点,计算各点的值为:

    x

    0.0

    1.0

    2.0

    3.0

    4.0

    5.0

    6.0

    7.0

    8.0

    y

    3.0

    1.5

    0.6

    0.3

    0.1765

    0.1154

    0.0811

    0.06

    0.0462

    表 12 – 2 原函数f(x)在各插值点的值

    求f(x)的导函数f’(x):

    f’(x) = -6x/(1 + x2)2

    根据f’(x)计算出在区间端点处的两个第一类边界条件f’(0.0) = 0.0, f’(8.0) = -0.01136。利用表12-2中的数据和这两个边界条件,计算出三次样条插值函数,并从0.0开始,以0.01为步长,连续求800个点的插值,将这些点连成曲线得到拟合曲线。为了作对比,同样从0.0开始,以0.01为步长,用f(x)函数连续计算800个点的原值,将这些点连成曲线得到原始曲线。分别用不同的颜色画出这两条曲线,如图12-2所示:

    图12-2 拟合曲线和原始曲线对比

            从图12-2可以看到,三次样条曲线拟合的效果非常好。同样在[0.0, 8.0]区间上,如果增加插值点的个数,将获得更好的拟合效果。比如以0.5为单位,将插值点增加到17个,则拟合的曲线与原始曲线几乎完全重合。

     

    展开全文
  • 【转】第5章 数据描述性分析

    万次阅读 2014-12-09 09:11:18
    文章来源于:炼数成金;摘自《数据分析:R语言实战》 ...第5章 数据描述性分析 ...通过前面两章的学习,我们知道...描述性统计用编制图表、计算统计量等形式对数据进行加工处理和显示,进而综合、概括和分析,得出

    文章来源于:炼数成金;摘自《数据分析:R语言实战》


    第5章 数据的描述性分析

    通过前面两章的学习,我们知道,数据收集是取得统计数据的过程,数据预处理是将数据中的问题清理干净,那么接下来的步骤就是统计分析了。数据分析是通过统计方法研究数据的过程,所用的方法分为描述性统计和统计推断两部分。描述性统计用编制图表、计算统计量等形式对数据进行加工处理和显示,进而综合、概括和分析,得出反映所研究数据的一般性特征——数字特征、分布状态等。


    描述性统计分析是统计分析的第一步,做好这一步是下面进行正确统计推断的先决条件。


    本章将分别从统计量和图形的角度描述样本的分布特征,重点介绍如何运用R中的函数完成。


    5.1  R内置的分布
    分布是描述一个样本数据最核心、最重要的方式。R内嵌了很多常用的统计分布,提供了四类函数:概率密度函数(density)、累积分布函数(probability)、分位数(quantile)和伪随机数(random)。在R中分别用d、p、q、r表示这4个项目,后面接分布的英文名称或缩写。


    例如正态分布的4个函数分别表示为dnorm、pnorm、qnorm及rnorm。表5.1列出了R中的分布函数,每个分布函数都有各自的参数,有些有默认值(如正态分布默认为N(0,1)),有些则没有。


    最常用的函数一般都来自于统计分析程序包stats,它不需要手动安装,打开R的同时其就已经自动加载。另外,有些分布较为复杂但在统计上应用较广,例如Wishart分布和Pareto分布,使用它们需要加载新的程序包。


    5.1  R内置的分布及对应函数


    分 布

    R函数

    参数及默认值

    所属程序包

    贝塔Beta

    _beta

    shape1, shape2, ncp=0

    stats

    二项Binomial

    _binom

    size, prob

    柯西Cauchy

    _cauchy

    location=0, scale=1

    卡方Chi-square(x2)

    _chisq

    df, ncp

    指数Exponential

    _exp

    rate

    F分布Fisher-Snedecor

    _f

    df1, df2, ncp

    伽马Gamma

    _gamma

    shape, scale=1

    几何Geometric

    _geom

    prob

    超几何Hypergeometric

    _hyper

    m, n, k

    对数正态Lognormal

    _lnorm

    meanlog=0, sdlog=1

    逻辑斯蒂Logistic

    _logis

    location=0, scale=1

    负二项Negative binomial

    _nbinom

    size, prob

    多项式Multinomial

    _multinom

    size, prob

    正态Normal

    _norm

    mean=0, sd=1

    泊松Poisson

    _pois

    lambda

    学生Student’s t

    _t

    df

    均匀Uniform

    _unif

    min=0, max=1

    威布尔Weibull

    _weibull

    shape, scale=1

    威尔考克森Wilcoxon

    _wilcox

    m, n

    帕累托Pareto

    _pareto

    shape, scale

    actuar

    (含有许多逆函数)

    布尔Burr

    _burr

    shape1, shape2, rate=1

    (scale=1/rate)

    逆指数Inverse Exponential

    _invexp

    rate

    狄利克雷Dirichlet

    _dirichlet

    alpha

    MCMCpack

    (蒙特卡罗,马氏链)

    威沙特Wishart

    _wish

    v, S

    逆威沙特Inverse Wishart

    _iwish

    v, S

    广义极值

    Generalized Extreme Value

    _gev

    xi, mu, sigma

    evir

    (极值统计分析)

    广义帕累托

    Generalized Pareto

    _gpd

    xi=1, mu=0, sigma=1

    多元正态

    Multivariate Normal

    _mvnorm

    mean, sigma

    mvtnorm

    多元t分布Multivariate-t

    _mvt

    sigma=diag(2), df=1

    mvtnorm

    5.2  集中趋势的分析
    5.2.1  集中趋势的测度
    样本观测值来自于总体,其中含有总体各方面的信息,乍看这些信息有时显得杂乱无章,需要对样本进行加工,通过探索性分析、计算统计量来提炼有用的信息。
    描述数据分布特征的统计量可分为两类:一类表示数量的中心位置;另一类表示数量的变异程度(或称离散程度)。两者相互补充,共同反映数据的全貌。
    描述统计分布集中趋势的指标主要是平均数、中位数、众数,也称为“平均指标”。这些指标的主要作用包括:
     反映总体各单位变量分布的集中趋势和一般水平;
     便于比较同类现象在不同单位之间的水平;
     便于比较同类现象在不同时期的发展变化趋势或规律;

     用于分析现象之间的依存关系。

    (1)均值(平均数)
    均值是最常用于度量数据平均水平的统计量,记为 ,定义为

    01.jpg 

    (2)众数
    一组数据中出现次数最多的观测值叫做众数,用 表示。众数测度数据的集中性趋势,一般在数据量较大的情况下,众数比较有意义。众数不受极端值的影响,一组数据分布的最高位置对应的数值即众数。
    如果数据没有明显的集中趋势,那么众数可能不存在;如果有两个最高峰点,那么这组数据就有两个众数。
    (3)中位数
    中位数简单来讲就是数据排序位于中间位置的值,记为 ,即

    1.jpg 

    中位数描述数据中心位置,对于对称分布的数据,均值接近中位数;偏态分布是指频数分布不对称,集中位置偏向一侧,数据的均值则与中位数不同。
    中位数是描述分析中重要的统计量,与众数类似,它的显著特点在于不受异常值的影响,具有稳健性。
    平均数、众数和中位数三者一起可以对数据的分布形式做简单描述。
     如果数据具有单一众数且分布对称,那么均值、众数和中位数相等,即 。
     若集中位置偏向数值小的一侧,称为正偏态分布,也称右偏分布(可以简单地记为分布的“尾巴”在右边)。此时数据存在极大值,必然拉动均值向极大值一方靠拢,因此 ,如图5.1(b)所示。
     如果集中位置偏向数值大的一侧,称为负偏态分布,也叫左偏分布,即 ,如图5.1(a)所示。

    2.jpg


    4)分位数


    中位数是将数据等分后中间位置的点,与之类似的还有四分位点、十分位点和百分位点。常用的是数据排序后处于25%75%位置上的值,即四分位点。

    5.2.2  R语言实现

    R中的函数mean()用于计算样本均值,其调用格式如下:

    mean(x, trim = 0, na.rm = FALSE, ...)

     

    内部的参数x是计算对象,可以为向量、矩阵、数据或数据框;trim用于设置计算前去掉与均值差别较大数据的比例,默认为0,表示计算中包括全部数据;na.rm默认为FALSE,表示不允许数据有缺失。

    我们使用2007.01-2012.09时间段中国人寿股票价格的样本作为实例,具体说明用R如何做描述统计。这一数据集读入后包含两列,第一列为交易日期,第二列为当日收盘价:

    > data=read.csv("d:/data/中国人寿股价.csv")

    >attach(data)

    The following object is masked from data (position 3):

    Clsprc, Trddt

    >price=Clsprc[!is.na(Clsprc)]  #获得价格向量,同时去掉缺失数据

    >mean(price)

    [1] 27.83326

     

    有时计算均值时,我们希望赋予各变量的权重是不一样的,也就是要计算加权平均数,这时用到的指令是weighted.mean(x,w,…),其中x是样本数据,w是与x长度相等的数值型向量,用于指出赋予样本各数据的权重值。

    中位数通过函数median()计算,该函数与mean()的使用方法相同。由计算结果发现,均值略大于中位数,可以初步判断,中国人寿股价样本呈右偏分布。

    >median(price)

    [1] 24.02

     

    分位数通过quantile()计算,x是数值向量,probs给出相应的百分位数,默认值是(0,0.25,0.5,0.75,1),na.rm=FALSE表示不允许包含缺失数据。

    默认条件下,可以直接计算出“五数”:最小值、25%的四分位数、中位数、75%的四分位数和最大值。函数fivenum()用来计算五数。

    quantile(x, probs = seq(0, 1, 0.25), na.rm = FALSE,names = TRUE, type = 7, ...)

    >quantile(price)

        0%    25%    50%    75%      100%

    14.740 19.285 24.020 31.160  75.080

    >fivenum(price)

    [1] 14.74 19.27 24.02 31.16 75.08

    >min(price);max(price)

    [1] 14.74

    [1] 75.08

     

    这样一个一个地输入函数非常不方便,R提供了总体描述的函数。函数summary()可以计算出一组数据的五数和均值。

    >summary(price)

    Min.1st Qu.Median  Mean3rd Qu.    Max.

      14.74   19.28   24.02   27.83   31.16   75.08

     

    另外,在R中没有直接的函数用来计算众数。对于离散型样本数据,可以简单地手动计算,使用指令which.max(table(x))。但像本例中这样的连续型样本,众数的定义是其分布的密度函数峰值对应的取值,这就需要我们自己写一个函数(function)来计算,然而出于描述数据分布形态的目的,我们大可以直接画出直方图来观察众数的大概位置。

    5.3  离散趋势的分析

    集中趋势只是数据分布的一个概括性度量,它反映的是各变量值向中心值聚集的程度。而变量的分散程度如何度量呢?分散程度,即各观测值远离中心值的程度,也称为“离中趋势”。离散程度越小,数据的代表性就越好。

    5.3.1  离散趋势的测度

    数据分布的离散程度主要靠极差、四分差、平均差、方差、标准差等统计指标来度量。在实际分析中,离散程度分析主要有以下作用:

    • 衡量平均指标的代表性;

    • 反映社会经济活动的均衡性;

    • 研究总体标志值分布偏离正态的情况;

    • 抽样推断等统计分析的一个基本指标。

    1)极差

    首先从最简单的统计量入手,极差是描述数据离散程度最简单的测度值,是样本数据中两个极端值之差,也称为全距。数据越分散,极差越大。

    3.jpg

    极差计算简单又容易理解,但它只是利用了数据两端的信息,容易受极端值的影响,并且没有充分利用数列的信息


    (2)四分位差



    数据的四分位差是两个四分位点之差,反映了中间50%数据的离散程度,其数值越小,说明中间的数据越集中。

    03.jpg04.jpg

    虽然四分位差避免了极端数据的影响,但“掐头去尾”后仍然丢失很多信息。


    3)方差与标准差


    描述离散程度,最常用的指标是方差和标准差,它们利用了样本的全部信息去描述数据取值分散性。方差是各样本相对均值的偏差平方和的平均,即

    4.jpg

    方差的平方根,称为标准差。与方差不同的是,标准差是具有量纲的,它与变量值的计量单位相同,因此具有较强的实际意义,在实际分析中会比较常用。

    5.jpg

    (4)变异系数
    一组数据的标准差与相应平均数之比,称为变异系数,也叫做离散系数。它是刻画数据相对分散性的一种度量,记为CV。既然是“相对”,说明它去除了单位的影响,因此是个无量纲的统计量,用百分数表示。在实际应用中可以消除由于不同计量单位、不同平均水平所产生的影响。

    6.jpg

    5.3.2  R语言实现

    可以通过函数range()计算极差。给出最小值和最大值两个点,再相减得到。

    > m=range(price);m[2]-m[1]

    [1] 60.34

    >max(price)-min(price)

    [1] 60.34


    四分位差同样需要手动计算,比较便捷的方法是直接使用函数fivenum()

    > q=fivenum(price);q[4]-q[2]

    [1] 11.89

     

    R中的方差函数和标准差函数分别是var()sd(),非常简单。还可以手动输入公式,计算验证一下。

    var(x, y = NULL, na.rm = FALSE, use)

    sd(x, na.rm = FALSE)

    >var(price);sd(price)

    [1] 138.7829

    [1] 11.78061

    >sqrt((sum(price^2)-(sum(price))^2/length(price))/(length(price)-1))

    [1] 11.78061



    除了上面几个最常用的离散趋势统计量外,R还有一个比较特殊的函数,即离差mad(),它用于计算中位数绝对偏差,具有渐近正态的一致性。


    mad(x, center = median(x), constant = 1.4826, na.rm = FALSE, low = FALSE, high = FALSE)


    其中的参数center可选,默认为中位数,即计算样本偏离中位数的程度;constant是比例因子,默认为一个常数;参数low/high默认取值为FALSE,若是TRUE,表示对于偶数个样本数据,中位数不取两个中间值的平均,而是采用较小/大的那一个。在默认状态下,R中离差的计算公式相当于

    7.jpg

    其中系数1.4826约等于1/qnorm(3/4),这样离差mad()在估计方差时才具有渐近正态的一致性。
    >mad(price)
    [1] 7.813302


    5.4  数据的分布分析

    5.4.1  分布情况的测度


    仅通过集中趋势和离散趋势两个指标,仍无法判断数据的分布形态。数据比较集中的区域在分布图上就会形成一个“峰”,这个“峰”可能偏左,也可能偏右;峰值可能较高,也可能较低,这时就需要用到偏态(Skewness)和峰度(Kurtosis)两个统计方法对数据分布特征作进一步描述。


    1)偏度


    前面提到,通过均值和平均数、众数之间的关系可以大致判断出数据点分布状态是对称、左偏还是右偏。显然,判断偏斜方向并不难,但要判断偏斜的程度却需要更精确的测度,即偏度系数。样本的偏度系数记为SK,计算公式为


    8.jpg 



    其中,s是标准差, 是样本的3阶中心矩。
    具体的判断方法是:如果样本的偏度系数SK=0,则说明数据关于均值对称;当SK<0时,样本是左偏分布(Negative Skew);当SK>0时,表示正偏离程度较大,说明样本是右偏分布(Positive Skew),如图5.2所示。

    9.jpg 

    (2)峰度
    偏度系数判断尖峰在水平方向上往哪边偏移,可以说它是从横向的角度描述分布特点,那么从纵向的角度,描述数据分布的平坦或尖峰程度(称为峰态),就要通过峰度系数来衡量。记为K。

    10.jpg 

    其中, 是样本4阶中心矩, 是样本标准差的四次方。对于分组数据,利用组中值 计算峰度系数, 代表组内的频数。

    11.jpg 

    峰态通常是与标准正态分布相比较而言的,如果一组数据服从标准正态分布,则峰度系数K=0;当分布比正态更加尖峰时,K>0;当分布比较扁平时,K<0。如图5.3所示,当K>0时,分布为尖峰形状,因此分布两侧的尾部数据较少(Thin tails);而K<0时,分布的峰值较低,造成尾部较厚(Fat tails)。

    12.jpg

    5.4.2  R语言实现

    在程序包timeDate中(或直接加载fBasics程序包),有直接计算偏度和峰度系数的函数,为skewness()kurtosis()

    也可以自己写一个函数function()进行验证,由于计算方法上的一些差别,两种方法计算的结果有出入,但不影响对样本分布形态的判断。

    >library(timeDate)  #加载程序包

    >skewness(price)  #计算偏度系数

    [1] 1.683351

    attr(,"method")

    [1] "moment"

    > SK=function(x){

    +   n=length(x);m=mean(x)

    +   C=n/((n-1)*(n-2))*sum((x-m)^3)/(sd(x))^3;C

    + }

    >SK(price)  #手动计算偏度系数

    [1] 1.686996

     

    >kurtosis(price)

    [1] 2.578657

    attr(,"method")

    [1] "excess"

    > K=function(x){

    +   n=length(x);m=mean(x);s=sd(x)

    +   g2=((n*(n+1))/((n-1)*(n-2)*(n-3))*sum((x-m)^4)/s^4-(3*(n-1)^2)/((n-2)*(n-3)))

    +   g2

    + }

    >K(price)

    [1] 2.600382

     

    偏度系数SK=1.687>0,说明样本是右偏分布,并且右偏程度比较严重。峰度系数K= 2.60>0,说明分布比正态更尖峰。

    5.5  图形分析及R实现

    电影《达芬奇密码》中有这样一句话:“A picture says more than a thousand words!”意思是,利用图形描述数据规律一目了然,胜过千言万语。图形显示的结果可以直观地概括上述指标所反映的分布特点,对于一组数据的描述,主要通过直方图、茎叶图等。


    5.5.1  直方图和密度函数图

    获得了一组样本数据,我们最直接的想法是通过频率分布直方图观察其样本的分布,常与直方图配套出现的是核密度估计函数density(),它可以根据已知样本,去估计样本的密度函数曲线。结合直方图和密度估计曲线,可以得到和统计指标所反映的相似结论:样本呈现严重的右偏分布,右尾拖得很长;数据有一较高的峰值。

    >hist(price,breaks=50,prob=T)  #参数breaks设置直方图的组距,prob=T规定绘制密度直方图

    >lines(density(price),col="blue")  #利用核密度估计函数density(),绘制密度曲线图

    绘制结果如图5.4所示。

    13.jpg

    5.5.2  QQ图
    QQ图用于直观验证一组数据是否来自某个分布,或者验证某两组数据是否来自同一族的分布。在教学和软件中常用QQ散点图来检验数据是否来自于正态分布。假定总体为正态分布 ,对于样本 ,其顺序统计量为 。 是标准正态分布 的分布函数,而 是其反函数,QQ图即是由以下的点构成的散点图:

    14.jpg

    R软件中的函数qqnorm()qqline()可以分别用于绘制正态QQ散点图和相应直线,其使用方法为:

    qqnorm(y, ylim, main="Normal Q-Q Plot", xlab="Theoretical Quantiles",

    ylab="Sample Quantiles", plot.it = TRUE, datax = FALSE, ...)

    qqline(y, datax = FALSE, distribution = qnorm, probs = c(0.25, 0.75), qtype = 7, ...)

    qqplot(x, y, plot.it = TRUE, xlab = deparse(substitute(x)), ylab = deparse(substitute(y)), ...)

    其中x,y为数据样本;xlab,ylabmain是图标签,分别用于设置X轴和Y轴的标签、图像标题。其它参数用法参见第四章plot()的参数设置。

    对股票价格样本绘制qq散点图和曲线图,判断它是否来自于正态总体。

    > qqnorm(price)

    > qqline(price)

    绘制结果如图5.5所示。

    15.jpg 

    从图5.5可以看出,QQ散点图并不均匀地分布在直线两侧,因此股价样本不服从正态分布。接下来举一个正态分布样本的示例。

    > a=c(21.0,21.4,22.5,21.6,19.6,20.6,20.3,19.2,20.2,21.3)

    > qqnorm(a);qqline(a)


    绘制结果如图5.6所示。

    16.jpg


                                                  图 5.6  正态QQ

    从图5.6可以看出,样本数据是来自于正态总体。


    5.5.3  茎叶图

    茎叶图也是考察样本分布的重要方法,由统计学家约翰·托奇设计。它是将数组中的数按位数进行比较,将数的大小基本不变或变化不大的位作为一个“茎”,将位变化大的数作为“叶”,列在茎的后面,这样就可以清楚地看到每个茎后面有多少样本数,以及具体数值是多少。

    茎叶图更适用于描述样本量较小的分布,在本例中,股票价格样本有逾千个,茎叶图不能完全显示,所以抽取其中的50个样本作图,R中用函数stem()绘制茎叶图。

    stem(x, scale = 1, width = 80, atom = 1e-08)

     

    其中,x是数据向量,scale控制茎叶图的长度,width控制绘图的宽度,atom是容差。

    >set.seed(111)  #设置抽样种子

    >s=sample(price,50)  #从数据集price中抽取50个样本

    > stem(s)

     

    结果如下所示:

      The decimal point is 1 digit(s) to the right of the |

      1 |

      1 | 5888999999999

      2 | 01112223334444

      2 | 555556788889

      3 | 022

      3 | 788

      4 | 1

      4 | 8

      5 | 3

      5 | 69

     

    在上面的结果中,左边的“茎”是股价的十位数字,右边的“叶”是个位数字。茎叶图从外观上来讲,比较像是横放的直方图,我们所抽取的样本也是一个右偏分布。“叶”的每一个数字都代表一个样本,显示频数的个数,所以从上向下数第2526个数字的平均可以体现样本中位数的值。

    5.5.4  箱线图

    箱线图在描述统计中也是非常重要的图形,可以说它的重要程度不亚于直方图。箱线图是“五数”的一个图形概括,可以用来对数据分布的形状进行大致判断,是直观展现数据分布主要特征的方式。在上一章已经介绍过,R中使用函数boxplot()绘制箱线图。

    函数boxplot()有三种使用方法,第一种最为直观和简单,因此也最常用:

    boxplot(x, ...)

    其中,x是数值型向量、列表或数据框。第二种形式为:

    boxplot(formula, data = NULL, ..., subset, na.action = NULL)

    formula是公式,形如y~grp,这里y是数值型向量,而grp通常为因子,用来表示数据的分组,这种形式的绘图结果是分类的箱线图,便于比较。第三种形式比较复杂:

    boxplot(x, ..., range = 1.5, width = NULL, varwidth = FALSE, notch = FALSE, outline = TRUE,

    names, plot = TRUE, border = par("fg"), col = NULL, log = "",

    pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5),

    horizontal = FALSE, add = FALSE, at = NULL)

    其中,x是数值型变量、列表或数据框;range是“触须”的范围,默认值为1.5notch是逻辑变量,默认值FALSE表示绘制的箱线图不带有切口;outline也是逻辑变量,默认值为TRUE,即标明异常值点;col用于设置不同颜色(根据不同的数值);horizontal是逻辑变量,默认值为FALSE,设置成TRUE时将箱线图绘制成水平状。

    要绘制出本章股票价格样本的箱线图,在R中输入如下指令:

    > boxplot(price,main="Boxplot of price")

    绘制结果如图5.7所示。

    1.jpg

    在图5.7的箱线图中,75%和25%四分位数分别为中间箱体的上下两条线,箱体中间的粗线段是中位数 所在的位置。箱体外的两条线是数据的最大值和最小值,但不得超过1.5倍四分位数间距,若是超出了则标记为异常值点,用“o”表示。
    在本例中,股价分布的右尾很长,因此就出现了较多的异常值点,这是在实际数据分析中很有可能出现的情况。

    5.5.5  经验分布图
    直方图主要适用于总体为连续分布的样本。对于更一般的总体分布,如果要估计其分布函数,可以使用经验分布函数(edf)。在R中函数ecdf()给出样本的经验分布,通过plot()绘制。
    ecdf(x)
    plot(x, ..., ylab="Fn(x)", verticals = FALSE,col.01line = "gray70", pch = 19)

    通过ecdf()生成经验分布函数 在各样本点的值,是一个数值型向量;plot()中的verticals是逻辑变量,若为TRUE表示画出竖线,默认是不画竖线。
    >plot(ecdf(price),main="empirical cdf",xlab="price",ylab="Fn(price)")
    > x=min(price):max(price)
    > lines(x,pnorm(x,mean(price),sd(price)),col="red")  #正态分布函数曲线
    > legend(60,0.4,legend=c("样本分布","正态分布"),lty=1,col=1:2)

    绘制结果如图5.8所示。

    2.jpg


    5.6  多组数据分析及R实现

    5.6.1  多组数据的统计分析

    当数据分为多个组别时,其描述统计与单组数据有相通之处,但在体现变量关系方面还是有一定差别的。上文中使用的例子是一组数据,假设按照年份将之分组,重新读入200920102011这三年的完整数据,在前面的理论基础上,对三组数据进行描述性统计分析。由于每年的交易日不完全相同,为简单处理,把有缺失值的样本删去。

    > group=read.csv("d:/data/09-11股价.csv")

    > group=na.omit(group)  #忽略缺失样本


    首先,与单组情形类似,直接使用summary()可以得到各组数据的均值和“五数”。通过观察横向数据,我们可以对比不同年份股票价格的基本统计量。以均值为例,它反映出股票价格的平均水平是逐年下降的。

    >summary(group)

            Price09          Price10          Price11    

    Min.    :18.67       Min.    :20.90       Min.    :14.74

    1st Qu. :23.08       1st Qu.      :23.25       1st Qu.      :16.98

    Median  :27.45       Median  :24.70       Median  :18.53 

     Mean    :26.51       Mean     :25.20       Mean     :18.72 

    3rd Qu. :29.96       3rd Qu. :27.40       3rd Qu. :21.05

     Max.    :34.01       Max.    :31.42       Max.     :22.33

    函数var()应用在多组数据上,得到的计算结果是一个协方差阵,其每个元素是各个向量之间的协方差。使用指令cor(group)也得到相同结果。

    > options(digits=3) #设置显示格式:数字只显示3

    >var(group)

            Price09 Price10 Price11

    Price09   16.55   -7.18   -6.75

    Price10   -7.18    5.99    4.16

    Price11   -6.75    4.16    4.84

    协方差的大小在一定程度上反映了变量之间的相互关系,但它还受变量本身度量单位的影响,因此我们还要计算相关系数来度量变量之间的线性相关程度。在R中使用函数cor()计算相关系数矩阵。

    cor(x, y = NULL, use = "everything",method = c("pearson", "kendall", "spearman"))

    其中,x,y是计算的对象,当x是一个数据框或列表时y可以省略;use指定如何处理缺失样本;method给出计算哪一种相关系数:默认的皮尔逊(Pearson)系数度量线性相关性,如果数据呈现的不是线性关系,而是单调的,则可以用肯德尔(Kendall)或斯皮尔曼(Spearman)相关系数,它们描述的是秩相关性。

    本例中没有理论基础可以说明两年的股价会呈线性关系,所以计算Spearman系数。

    >cor(group,method="spearman")

            Price09 Price10 Price11

    Price09   1.000  -0.687  -0.710

    Price10  -0.687   1.000   0.752

    Price11  -0.710   0.752   1.000


    在上面的矩阵中,对角线都是1,因为变量与自身是完全相关的。而2009年股价与2010年股价的相关系数是-0.687,说明这两年的股票价格呈负相关的关系。

    5.6.2  多组数据的图形分析

    常用的图形表示方法大多用于一维数据的描述,但实际问题中的数据集往往是多变量样本。接下来的这一节,将介绍在实践中常用的多组数据绘图。

    1)二维散点图

    首先,两组数据的关系用散点图可以清楚地描述。在散点图中加入一条拟合曲线有助于更好地把握变量关系。

    R中的函数lowess()可通过加权多项式回归对散点图进行平滑,拟合一条非线性的曲线,但其只能适用于二维情况。与之类似的loess()用于处理多维情况。

    lowess(x, y = NULL, f = 2/3, iter = 3, delta = 0.01 * diff(range(x)))

    x,y指定两个向量;f是平滑的跨度,值越大,曲线的平滑程度越高;iter控制应执行的迭代数,值越高平滑越精确,但使用较小的值会使程序跑得比较快。

    > attach(group)

    >plot(Price10~Price09,xlab="Price of 2009",ylab="Price of 2010")

    > lines(lowess(Price09,Price10),col="red",lwd=2)  #拟合曲线

    绘制结果如图5.9所示。

    3.jpg

    从散点图中可以看出,2009年和2010年的股票价格并不是完全线性的关系,这与由Spearman系数得出的结论相同,两年的股价具有负的相关性,价格变动趋势相反。

    2)等高线图

    有时候数据量很大,散点图上的数据点就会非常集中,不容易看出变量的关系或趋势,这就需要借助二维等高线图来描述。首先利用程序包MASS中的函数kde2d()来估计出二维数据的密度函数,再利用函数contour()画出密度的等高线图。如果不想画出图上的数据标签,可以将参数drawlabels=FALSE去掉。函数kde2d()的使用方法如下:


    kde2d(x, y, h, n = 25, lims = c(range(x), range(y)))

    其中x,y分别为横轴和纵轴的数据;n指定每个方向上的网格点数量,可以是标量或长度为2的一个正数向量;参数lims表示横纵轴的范围。
    接下来就利用上述的两个函数绘制2009年和2010年股价的二维等高线图。在R中输入指令:
    >library(MASS)
    > a=kde2d(Price09,Price10)
    >contour(a,col="blue",main="Contour plot",xlab="Price of 2009",ylab="Price of 2010")

    绘制结果如图5.10所示。

    4.jpg

    与地理上的等高线地形图相同,即等高线越靠近内部说明密度越高,散点分布越集中。

    (3)矩阵散点图
    以上两种图形主要描述二维数据,实际中的数据集往往是多维的,我们使用的例子也是一样,多组数据的图形也可以用散点图来展示,不同在于这里是矩阵散点图。对于一个数据框,R中可以直接使用plot()命令或pairs()绘制矩阵散点图。
    在R中输入如下指令来绘制2009—2011年多组股价数据的矩阵散点图:
    >plot(group,main="Scatterplot Matrices")


    >pairs(group)

    绘制结果如图5.11所示。
    图5.9绘制出了三个年份之间股价的矩阵散点图,其中上三角与下三角的三幅图是对称的,分别为2009—2010、2010—2011、2009—2011年中国人寿股价的二维散点图。矩阵散点图的特点主要是直观简便,把多个二维散点图以矩阵的形式排列,也有助于比较两两变量之间的相关关系。

    5.jpg











    (4)矩阵图
    在处理多组数据时,常将各组数据放在一起进行比较,matplot()可将各变量的散点图放在同一个绘图区域中。
    上文计算的相关系数矩阵反映出2009年和2010年的股价成负相关,而2010年2011年的股价则变动趋势相同,这些结论从图5.10中也可以得到,黑色曲线表示2009年股价呈上升趋势,而2010和2011年股票价格则整体下跌,在2011年更是创出了历史新低。
    >matplot(group,type="l",main="Matplot")  #type=“l”表示绘制曲线而不是散点
    > legend(0,35,legend=2009:2011,pch="——",cex=0.6,col=1:3)  #cex指定字体大小

    绘制结果如图5.12所示。

    6.jpg

    (5)箱线图
    在5.5.4节中已经详细介绍过箱线图,函数boxplot()也可以用于多组数据的绘图,在同一区域中画出各变量的箱线图,便于对比。箱线图的好处在于可以同时对比最值、均值、中位数和整体分布情况,尤其适用于时间序列的对比,从图5.13中的几条“线”可以看出2011年的股票价格从最大值、75%分位点到中位数、最小值等都低于2009年和2010年,因此2011年的股价水平整体低于前两年。
    >boxplot(group,cex.axis=0.6)

    1.jpg

    (6)星图(雷达图)
    假设变量是p维数据,有n个观测值,故第k次的观测值写作向量形式为

    2.jpg 

    星图作为一种多元数据的图示方法,可以对p维数据进行比较。由于星图(如图5.14所示)看起来很像雷达图像,因此也称为雷达图;星图也像一个蜘蛛网,所以有时也称为蜘蛛图。其绘制原理是:


    1)作一个圆,并将圆周p等分。


    2)连接圆心和圆周上的p个分点,把这p条半径依次视为变量坐标轴,并标上适当的刻度。


    3)对给定的每一次观测值,在上述p条坐标轴上分别标出p个变量的取值,然后将它们连接成一个p边形,即形成了一个“星”。


    4)对n次观测值都重复(3)的步骤,就形成了n个星图。


    R中的函数stars()可以绘制星图,其使用方法是:

    stars(x, full = TRUE, scale = TRUE, radius = TRUE, labels = dimnames(x)[[1]],

    locations = NULL, nrow = NULL, ncol = NULL, len = 1,

    key.loc = NULL, key.labels = dimnames(x)[[2]], key.xpd = TRUE,

    xlim = NULL, ylim = NULL, flip.labels = NULL, draw.segments = FALSE,

    col.segments = 1:n.seg, col.stars = NA, col.lines = NA, axes = FALSE,

    frame.plot = axes, main = NULL, sub = NULL, xlab = "", ylab = "",

    cex = 0.8, lwd = 0.25, lty = par("lty"), xpd = FALSE,

    mar = pmin(par("mar"), 1.1+ c(2*axes+ (xlab != ""), 2*axes+ (ylab != ""), 1, 0)),

    add = FALSE, plot = TRUE, ...)


    stars()函数中包括很多的参数设置,这里着重介绍其中比较重要的参数,其他请参考help文档。其中x是数据矩阵或数据框;full是逻辑变量,默认值为TRUE表示星图绘制成整圆的,FALSE表示星图绘制成上半圆的图形;scale也是逻辑变量,默认值TRUE表示数据矩阵的每一列是独立的,且每列的最大值为1,最小值为0,若值为FALSE则所有的星图会叠在一起;radius是逻辑变量,默认值为TRUE,表示画出构成星图半径的连线,FALSE则画出的星图没有半径构成的连线;len是半径刻度因子,设置星图的比例,默认值为1key.loc是由xy坐标值构成的向量(默认值为1),设置星的位置;draw.segments同样是逻辑变量,默认值为FALSE,即用直线连接p个半径上的点,若为TRUE则画出的星图是一段一段的弧。

    但是星图比较适用于维度较低的数据,方便比较。例如学校随机抽取6名学生的5门考试成绩,如表5.2所示,从D盘读入该数据集,我们将画出这6名学生成绩的星图。

    5.2  学生考试成绩


    科目1

    科目2

    科目3

    科目4

    科目5

    89

    90

    92

    95

    99

    90

    77

    74

    86

    89

    79

    88

    94

    98

    97

    100

    90

    85

    100

    81

    83

    87

    70

    77

    73

    100

    94

    97

    90

    89


    在R软件中输入如下指令:
    > score=read.table("d:/data/score.txt",header=T)  #读入数据
    > stars(score)  #绘制星图,所有参数均设置为默认值

    绘制结果如图5.14所示。
    星图的半径反映数值的大小,因此从图5.14中可以看出学生编号1和6的成绩较好,而第5名学生成绩最差,第2名其次。
    设置函数stars()中的参数,可以将上面的星图绘制成图5.15所示的另一种形式。在R中输入指令:
    > stars(score,full=FALSE,draw.segments=TRUE,key.loc=c(5,0.5),mar=c(2,0,0,0))  #full=F
    # 表示绘制成半圆的图形,draw.segments=T表示画出弧线

    3.jpg 

    (7)折线图
    和星图相比,折线图是一种更加直观地展示多维图形的方法,但同样地,折线图比较适用于数据量较小的数据样本。
    折线图由以下步骤绘制而成:
    (1)在直角坐标系的横轴上取p个点,表示p个变量;
    (2)对每一次观测值,p个点的纵坐标即表示变量的取值;
    (3)连接p个点可以得到一条折线,即为该次观测值的折线图;
    (4)对于n次观测值,均重复上述步骤,即可得到n次观测值的折线图。

    在R中并没有现成的绘制折线图的函数,因此需要我们自行编写,这里命名为函数outline()。
    outline=function(x){
      if(is.data.frame(x)==TRUE)
        x=as.matrix(x)  #若x为数据框,则先转换为矩阵形式
      m=nrow(x);n=ncol(x)  #提取x的行列数
      plot(c(1,n),c(min(x),max(x)),type="n",
    main="The outline graph of data",xlab="Number",ylab="Value")
      for(i in 1:m){
        lines(x[i,],col=i)
      }
    }

    其中的参数x是数据矩阵或数据框,函数的运行结果是n次观测值的折线图。例如对上面学生成绩的例子绘制折线图,则应在R中输入如下指令:
    > outline(score)

    绘制结果如图5.16所示。

    4.jpg 

    从图5.16中可以看出,越是靠近图形上方的学生成绩越好。本节仅给出一个编写函数的示例,若样本量较多,编写函数时应在绘图中加入样本编号。这种折线图可以用于聚类分析的初步判断。

    (8)调和曲线图
    调和曲线图是D.F.Andrews在1972年提出的三角多项式作图方法,所以又称为三角多项式图,其思想是把高维空间中的一个样本点对应于二维平面上的一条曲线。
    设p维数据 ,对应的曲线是

    5.jpg 

    上式中,当t在区间[-π,π] 上变化时,其轨迹是一条曲线。
    在多项式的图表示中,当各变量的数值太悬殊时,最好先标准化后再作图。这种图对聚类分析帮助很大,如果选择聚类统计量为距离的话,则同类的曲线非常靠近拧在一起,不同类的曲线相互分开,非常直观。

    调和曲线图有两点优良数学性质:一是保持线性关系,二是与一般的欧式距离之间的关系。第一点从上面的公式中就可以直观得到结论,第二个性质可通过计算得到。按照一般常用的范式,定义样本x和y之间的距离为如下的平方积分形式

    6.jpg 

    根据三角函数积分,通过运算最终可以得到这一距离与欧氏距离之间具有如下关系:

    7.jpg 

    按照上式的描述,我们可以在R中自己编写调和曲线图函数unison()。
    unison=function(x){
      if (is.data.frame(x)==TRUE)
        x=as.matrix(x)  #若x为数据框,则先转换为矩阵形式
      t=seq(-pi, pi, pi/30)  #设置t的变化范围
      m=nrow(x); n=ncol(x)   #提取x的行列数
      f=array(0, c(m,length(t)))  #f赋值为一个数组
      for(i in 1:m){
        f[i,]=x[i,1]/sqrt(2)
        for( j in 2:n){
          if (j%%2==0)
            f[i,]=f[i,]+x[i,j]*sin(j/2*t)
          else
            f[i,]=f[i,]+x[i,j]*cos(j%/%2*t)
        }
      }
      plot(c(-pi,pi),c(min(f),max(f)),type="n",main ="The Unison graph of Data",xlab="t",ylab="f(t)")
      for(i in 1:m) lines(t,f[i,],col=i)
    }

    其中,x是数据矩阵或数据框。函数的运行结果是调和曲线图(如图5.17所示)。

    8.jpg

    图5.17虽然不能用于判断学生成绩的好坏,但这种调和曲线图对聚类分析有很大帮助,可以用于初步判断,即同类的曲线会聚集在一起,而不同类的曲线则会拧成不同的曲线束,比较直观。


    展开全文
  • 数据的统计描述和分析

    千次阅读 多人点赞 2019-04-22 19:25:37
    描述性统计就是搜集、整理、加工和分析统计数据, 使之系统化、条理化,以显示出数据资料的趋势、特征和数量关系。它是统计推断的基础,实用性较强,在统计工作中经常使用。 面对一批数据如何进行描述与分...

    数理统计研究的对象是受随机因素影响的数据,以下数理统计就简称统计,统计是以概率论为基础的一门应用学科。 数据样本少则几个,多则成千上万,人们希望能用少数几个包含其多相关信息的数值来体现数据样本总体的规律。

    描述性统计就是搜集、整理、加工和分析统计数据, 使之系统化、条理化,以显示出数据资料的趋势、特征和数量关系。它是统计推断的基础,实用性较强,在统计工作中经常使用。 面对一批数据如何进行描述与分析,需要掌握参数估计和假设检验这两个数理统计的基本方法。 我们将用 Matlab 的统计工具箱(Statistics Toolbox)来实现数据的统计描述和分析.

    目录

    统计的基本概念 

    1.1  总体和样本             1.2  频数表和直方图             1.3  统计量 

    (i)表示位置的统计量—算术平均值和中位数      

    (ii)表示变异程度的统计量—标准差、方差和极差 

    (iii)中心矩、表示分布形状的统计量—偏度和峰度 

    1.4  统计中几个重要的概率分布 

    1.4.1  分布函数、密度函数和分位数  

    1.4.2  统计中几个重要的概率分布   

    (i)正态分布   (ii)  \small \chi ^{2}分布(Chi square)   (iii)t分布    (iv)F 分布 

    1.4.3  Matlab 统计工具箱(Toolbox\Stats)中的概率分布 

    1.5  正态总体统计量的分布 

    2 参数估计 

    2.1  点估计               2.2  区间估计               2.3  参数估计的 Matlab 实现

    3  假设检验

    3.1  单个总体  均值μ 的检验

      3.1.1    已知\small \sigma ^{2} ,关于μ 的检验(Z 检验)   3.1.2   σ未知,关于μ 的检验(t检验) 

    3.2  两个正态总体均值差的检验(t检验)   

    3.3  分布拟合检验 

    3.3.1   检验法   3.3.2  偏度、峰度检验(留作习题1) 

    3.4  其它非参数检验 

    3.4.1  Wilcoxon秩和检验  

    3.5  中位数检验

    3.5.1  signrank函数   3.5.2  signtest函数        习题:


    统计的基本概念 

    1.1  总体和样本 

    总体是人们研究对象的全体,又称母体,如工厂一天生产的全部产品(按合格品及 废品分类),学校全体学生的身高。 总体中的每一个基本单位称为个体,个体的特征用一个变量(如 x)来表示,如一 件产品是合格品记 x=0 ,是废品记 x=1 ;一个身高 170(cm)的学生记 x=170  。

    从总体中随机产生的若干个个体的集合称为样本,或子样,如n件产品,100 名学 生的身高,或者一根轴直径的 10 次测量。实际上这就是从总体中随机取得的一批数据, 不妨记作 \small x_{1}\, ,x_{2}\, ,\cdots ,x_{n}\, ,n称为样本容量。 简单地说,统计的任务是由样本推断总体。 

    1.2  频数表和直方图 

    一组数据(样本)往往是杂乱无章的,做出它的频数表和直方图,可以看作是对这 组数据的一个初步整理和直观描述将数据的取值范围划分为若干个区间,然后统计这组数据在每个区间中出现的次 数,称为频数,由此得到一个频数表。以数据的取值为横坐标,频数为纵坐标,画出一 个阶梯形的图,称为直方图,或频数分布图

    若样本容量不大,能够手工做出频数表和直方图,当样本容量较大时则可以借助 Matlab 这样的软件了。让我们以下面的例子为例,介绍频数表和直方图的作法。

    例 1  学生的身高和体重 学校随机抽取 100 名学生,测量他们的身高和体重,所得数据如表1.

    (i) 数据输入 

    数据输入通常有两种方法,一种是在交互环境中直接输入,如果在统计中数据量比 较大,这样作不太方便;另一种办法是先把数据写入一个纯文本数据文件 data.txt 中, 格式如例 1 的表 1,有 20 行、10 列,数据列之间用空格键或 Tab 键分割,该数据文件 data.txt 存放在 matlab\work 子目录下,在 Matlab 中用 load 命令读入数据,具体作法是:
     load data.txt

    这样在内存中建立了一个变量 data,它是一个包含有 20× 10个数据的矩阵。 为了得到我们需要的 100 个身高和体重各为一列的矩阵,应做如下的改变: 

    high=data(:,1:2:9);high=high(:) 
    weight=data(:,2:2:10);weight=weight(:) 

    (ii)作频数表及直方图

    求频数用 hist 命令实现,其用法是: [N,X] = hist(Y,M)

    得到数组(行、列均可)Y 的频数表。它将区间[min(Y),max(Y)]等分为 M 份(缺省时 M 设定为 10),N 返回 M 个小区间的频数,X 返回 M 个小区间的中点。  

     命令 hist(Y,M) 画出数组 Y 的直方图。

        对于例 1 的数据,编写程序如下: 

    load data.txt;
    high=data(:,1:2:9);high=high(:); 
    weight=data(:,2:2:10);weight=weight(:); 
    [n1,x1]=hist(high) 
    %下面语句与hist命令等价 
    %n1=[length(find(high<158.1)),... 
    %   length(find(high>=158.1&high<161.2)),... 
    %   length(find(high>=161.2&high<164.5)),... 
    %   length(find(high>=164.5&high<167.6)),... 
    %   length(find(high>=167.6&high<170.7)),... 
    %   length(find(high>=170.7&high<173.8)),... 
    %   length(find(high>=173.8&high<176.9)),... 
    %   length(find(high>=176.9&high<180)),... 
    %   length(find(high>=180&high<183.1)),... 
    %   length(find(high>=183.1))] 
    [n2,x2]=hist(weight) 
    subplot(1,2,1), hist(high) 
    subplot(1,2,2), hist(weight) 

    计算结果略,直方图如图 1 所示。 

    从直方图上可以看出,身高的分布大致呈中间高、两端低的钟形;而体重则看不出 什么规律。要想从数值上给出更确切的描述,需要进一步研究反映数据特征的所谓“统 计量”。直方图所展示的身高的分布形状可看作正态分布,当然也可以用这组数据对分 布作假设检验。

       例 2  统计下列五行字符串中字符 a、g、c、t 出现的频数 

    1.aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg

    2.cggaggacaaacgggatggcggtattggaggtggcggactgttcgggga

    3.gggacggatacggattctggccacggacggaaaggaggacacggcggacataca

    4.atggataacggaaacaaaccagacaaacttcggtagaaatacagaagctta 5.cggctggcggacaacggactggcggattccaaaaacggaggaggcggacggaggc

      解  把上述五行复制到一个纯文本数据文件 shuju.txt 中,放在 matlab\work 子目录 下,编写如下程序:

    clc 
    fid1=fopen('shuju.txt','r'); 
    i=1; 
    while (~feof(fid1)) 
        data=fgetl(fid1); 
        a=length(find(data==97)); 
        b=length(find(data==99)); 
        c=length(find(data==103)); 
        d=length(find(data==116)); 
        e=length(find(data>=97&data<=122)); 
        f(i,:)=[a  b  c  d  e  a+b+c+d]; 
        i=i+1; 
    end 
    f, he=sum(f) 
    dlmwrite('pinshu.txt',f); dlmwrite('pinshu.txt',he,'-append'); 
    fclose(fid1); 

       我们把统计结果后写到一个纯文本文件 pinshu.txt 中,在程序中多引进了几个变 量,是为了检验字符串是否只包含 a、g、c、t 四个字符。 

    1.3  统计量 

    假设有一个容量为n 的样本(即一组数据),记作  \small x_{1}\, ,x_{2}\, ,\cdots ,x_{n}\, ,需要对它进 行一定的加工,才能提出有用的信息,用作对总体(分布)参数的估计和检验。统计量 就是加工出来的、反映样本数量特征的函数,它不含任何未知量。 下面我们介绍几种常用的统计量。 

    (i)表示位置的统计量—算术平均值和中位数 

    (ii)表示变异程度的统计量—标准差、方差和极差 

    (iii)中心矩、表示分布形状的统计量—偏度和峰度 

    在以上用 Matlab 计算各个统计量的命令中,若 x 为矩阵,则作用于 x 的列,返回 一个行向量。

    对例 1 给出的学生身高和体重,用 Matlab 计算这些统计量,程序如下: 

    clc 
    load data.txt; 
    high=data(:,1:2:9);high=high(:); 
    weight=data(:,2:2:10);weight=weight(:); 
    shuju=[high weight]; 
    jun_zhi=mean(shuju) 
    zhong_wei_shu=median(shuju) 
    biao_zhun_cha=std(shuju) 
    ji_cha=range(shuju) 
    pian_du=skewness(shuju) 
    feng_du=kurtosis(shuju) 
     

    统计量中重要、常用的是均值和标准差,由于样本是随机变量,它们作为样本的函数自然也是随机变量,当用它们去推断总体时,有多大的可靠性就与统计量的概率 分布有关,因此我们需要知道几个重要分布的简单性质。 

    1.4  统计中几个重要的概率分布 

    1.4.1  分布函数、密度函数和分位数 

    我们前面画过的直方图是频数分布图,频数除以样本容量n,称为频率n充分大 时频率是概率的近似,因此直方图可以看作密度函数图形的(离散化)近似。 

    1.4.2  统计中几个重要的概率分布 

    (i)正态分布 

    正态分布可以说是常见的(连续型)概率分布,成批生产时零件的尺寸,射击中 弹着点的位置,仪器反复量测的结果,自然界中一种生物的数量特征等,多数情况下都 服从正态分布,这不仅是观察和经验的总结,而且有着深刻的理论依据,即在大量相互独立的、作用差不多大的随机因素影响下形成的随机变量,其极限分布为正态分布。 

    鉴于正态分布的随机变量在实际生活中如此地常见,记住下面 3 个数字是有用的:
     

    (ii) \small \chi ^{2} 分布(Chi square) 

    (iii)t分布 

     (iv)F 分布 

    1.4.3  Matlab 统计工具箱(Toolbox\Stats)中的概率分布 

          Matlab 统计工具箱中有 27 种概率分布,这里只对上面所述 4 种分布列出命令的字 符: 

              norm  正态分布;         chi2     \small \chi ^{2} 分布(Chi square)   ;       t   t分布            f    F 分布

    工具箱对每一种分布都提供 5 类函数,其命令的字符是:

    pdf 概率密度;  cdf 分布函数;  inv 分布函数的反函数; stat 均值与方差;  rnd 随机数生成

    当需要一种分布的某一类函数时,将以上所列的分布命令字符与函数命令字符接起 来,并输入自变量(可以是标量、数组或矩阵)和参数就行了,如: 

    p=normpdf(x,mu,sigma)   //均值 mu、标准差 sigma 的正态分布在 x 的密度函数 (mu=0,sigma=1 时可缺省)。  

     p=tcdf(x,n)        //  t分布(自由度 n)在 x 的分布函数。

    x=chi2inv(p,n)    //   \small \chi ^{2} 分布(自由度 n)使分布函数 F(x)=p 的 x(即 p 分位数)。

    [m,v]=fstat(n1,n2)     // F 分布(自由度 n1,n2)的均值 m 和方差 v。 

    几个分布的密度函数图形就可以用这些命令作出,如:

    x=-6:0.01:6; y=normpdf(x); z=normpdf(x,0,2);

    plot(x,y,x,z),gtext('N(0,1)'),gtext('N(0,2^2)')

    分布函数的反函数的意义从下例看出:

    1.5  正态总体统计量的分布 

    用样本来推断总体,需要知道样本统计量的分布,而样本又是一组与总体同分布的随机变量,所以样本统计量的分布依赖于总体的分布。当总体服从一般的分布时,求某个样本统计量的分布是很困难的,只有在总体服从正态分布时,一些重要的样本统计量 (均值、标准差)的分布才有便于使用的结果。另一方面,现实生活中需要进行统计推 断的总体,多数可以认为服从(或近似服从)正态分布,所以统计中人们在正态总体的假定下研究统计量的分布,是必要的与合理的。 

    2 参数估计 

    2.1  点估计 

    2.2  区间估计

    2.3  参数估计的 Matlab 实现

    Matlab 统计工具箱中,有专门计算总体均值、标准差的点估计和区间估计的函数。 对于正态总体,命令是

    [mu,sigma,muci,sigmaci]=normfit(x,alpha)

    其中 x 为样本(数组或矩阵),alpha 为显著性水平 α (alpha 缺省时设定为 0.05),返 回总体均值 μ 和标准差 σ 的点估计 mu 和 sigma,及总体均值 μ 和标准差 σ 的区间估计 muci 和 sigmaci。当 x 为矩阵时,x 的每一列作为一个样本。

    Matlab 统计工具箱中还提供了一些具有特定分布总体的区间估计的命令,如 expfit,poissfit,gamfit,你可以从这些字头猜出它们用于哪个分布,具体用法参见 帮助系统。

     

    3  假设检验

    统计推断的另一类重要问题是假设检验问题。在总体的分布函数完全未知或只知其 形式但不知其参数的情况,为了推断总体的某些性质,提出某些关于总体的假设。例如, 提出总体服从泊松分布的假设,又如对于正态总体提出数学期望等于 0 μ 的假设等。假设检验就是根据样本对所提出的假设做出判断:是接受还是拒绝。这就是所谓的假设检 验问题

    3.1  单个总体 \small N\left ( \mu ,\sigma ^{2} \right ) 均值μ 的检验

      3.1.1   \small \sigma ^{2} 已知,关于μ 的检验(Z 检验) 

    例 3  某车间用一台包装机包装糖果。包得的袋装糖重是一个随机变量,它服从正 态分布。当机器正常时,其均值为 0.5 公斤,标准差为 0.015 公斤。某日开工后为检验 包装机是否正常,随机地抽取它所包装的糖 9 袋,称得净重为(公斤): 0.497   0.506   0.518   0.524   0.498   0.511  0.520  0.515  0.512  问机器是否正常? 

    Matlab 实现如下:

    x=[0.497   0.506   0.518   0.524   0.498...    
       0.511  0.520  0.515  0.512]; 
    [h,p,ci]=ztest(x,0.5,0.015) 

    求得 h=1,p=0.0248,说明在 0.05 的水平下,可拒绝原假设,即认为这天包装机 工作不正常。 

    3.1.2   σ未知,关于μ 的检验(t检验) 

    x=[159  280  101  212  224  379  179  264 ...    
       222  362  168  250  149  260  485  170]; 
    [h,p,ci]=ttest(x,225,0.05,1) 

    求得 h=0,p=0.2570,说明在显著水平为 0.05 的情况下,不能拒绝原假设,认为 元件的平均寿命不大于 225 小时。

    3.2  两个正态总体均值差的检验(t检验) 

    还可以用t检验法检验具有相同方差的 2 个正态总体均值差的假设。在 Matlab 中 由函数 ttest2 实现,命令为:

    [h,p,ci]=ttest2(x,y,alpha,tail)

    与上面的 ttest 相比,不同处只在于输入的是两个样本 x,y(长度不一定相同), 而不是一个样本和它的总体均值;tail 的用法与 ttest 相似,可参看帮助系统。 

    x=[78.1  72.4  76.2  74.3  77.4  78.4  76.0  75.6  76.7  77.3]; 
    y=[79.1  81.0  77.3  79.1  80.0  79.1  79.1  77.3  80.2  82.1]; 
    [h,p,ci]=ttest2(x,y,0.05,-1) 

    3.3  分布拟合检验 

    在实际问题中,有时不能预知总体服从什么类型的分布,这时就需要根据样本来检 验关于分布的假设。下面介绍 \small \chi ^{2} 检验法和专用于检验分布是否为正态的“偏峰、峰度 检验法”。 

    3.3.1   \small \chi ^{2}检验法 

     例 6  下面列出了 84 个伊特拉斯坎(Etruscan)人男子的头颅的大宽度(mm), 试检验这些数据是否来自正态总体(取 \small \alpha =0.1  )

    141  148  132  138  154  142  150  146  155  158 150  140  147  148  144  150  149  145  149  158 143  141  144  144  126  140  144  142  141  140 145  135  147  146  141  136  140  146  142  137 148  154  137  139  143  140  131  143  141  149 148  135  148  152  143  144  141  143  147  146  150  132  142  142  143  153  149  146  149  138 142  149  142  137  134  144  146  147  140  142 140  137  152  145 

    解  编写 Matlab 程序如下: 

    clc 
    x=[141  148  132  138  154  142  150  146  155  158 ... 
       150  140  147  148  144  150  149  145  149  158 ... 
       143  141  144  144  126  140  144  142  141  140 ... 
       145  135  147  146  141  136  140  146  142  137 ... 
       148  154  137  139  143  140  131  143  141  149 ... 
       148  135  148  152  143  144  141  143  147  146 ... 
       150  132  142  142  143  153  149  146  149  138 ... 
       142  149  142  137  134  144  146  147  140  142 ... 
       140  137  152  145]; 
    mm=minmax(x)   %求数据中的小数和大数 
    hist(x,8)       %画直方图 
    fi=[length(find(x<135)),...    
        length(find(x>=135&x<138)),...    
        length(find(x>=138&x<142)),...    
        length(find(x>=142&x<146)),...    
        length(find(x>=146&x<150)),...    
        length(find(x>=150&x<154)),...    
        length(find(x>=154))]      %各区间上出现的频数 
    mu=mean(x),sigma=std(x)     %均值和标准差 
    fendian=[135,138,142,146,150,154]   %区间的分点 
    p0=normcdf(fendian,mu,sigma)         %分点处分布函数的值 
    p1=diff(p0)                              %中间各区间的概率 
    p=[p0(1),p1,1-p0(6)]                   %所有区间的概率 
    chi=(fi-84*p).^2./(84*p)               
    chisum=sum(chi)                         %皮尔逊统计量的值 
    x_a=chi2inv(0.9,4)     %chi2分布的0.9分位数 

     

    3.3.2  偏度、峰度检验(留作习题1) 

    3.4  其它非参数检验 

    Matlab还提供了一些非参数方法。 

    3.4.1  Wilcoxon秩和检验 

     例7  某商店为了确定向公司 A或公司B 购买某种产品,将 A, B公司以往各次进 货的次品率进行比较,数据如下所示,设两样本独立。问两公司的商品的质量有无显著 差异。设两公司的商品的次品的密度多只差一个平移,取 \small \alpha =0.05 

          求得p=0.8041,h=0,表明两样本总体均值相等的概率为0.8041,并不很接近于零, 且h=0说明可以接受原假设,即认为两个公司的商品的质量无明显差异。 

    3.5  中位数检验

    在假设检验中还有一种检验方法为中位数检验,在一般的教学中不一定介绍,但在 实际中也是被广泛应用到的。在Matlab中提供了这种检验的函数。函数的使用方法简单, 下面只给出函数介绍。 

    3.5.1  signrank函数 

    3.5.2  signtest函数 

    习题:

     

     

     

     

     

    展开全文
  • 4.存储空间的编号也就是内存编号取决于地址线还是数据线 总之: 运算能力数据总线位数=处理器字长:32位数据总线——计算机最多同时处理32位的数据 同时的意思是一个地址状态(如果地址线位数是20,就是20条地址...

    地址总线,字长,内存容量,寻址范围 之间的计算

    1.处理器字长与数据线位数的关系 2.存储容量和地址线位数的关系 3.寻址能力和地址线位数的关系 4.存储空间的编号也就是内存编号取决于地址线还是数据线

    总之:
    运算能力<-数据总线位数=处理器字长:32位数据总线——计算机最多同时处理32位的数据
    同时的意思是一个地址状态(如果地址线位数是20,就是20条地址线通断的一个序列)
    寻址能力<-地址总线位数:N根地址线可以访问2^N个存储单元(本质上是N条地址线排列组合可以有 2^N个状态)

    64位CPU和64位操作系统的关系?
    答:64位CPU指的是计算机通用寄存器的数据宽度是64位,即可以同时处理64bit的数据。但是必须配合64位操作系统和64位应用才可以发挥所能。32位操作系统只能用到3.29GB的内存。
    物理存储器VS存储地址空间?
    内存条等实际存在的具体存储器芯片是物理存储器;存储地址空间是编码范围。二者可以不相等,比如某层楼共有17个房间501-517. 但是采用了三位编码,500—599共有100个地址。

        处理机字长是指处理机能同时处理(或运算)的位数,即同时处理多少位(bit)数据。比如Intel Pentium 4处理器字长为32位,它能同时处理32位的数据,也即它的数据总线为32位。以前的处理器比如8086,则为16位处理器,现在新兴的64位处理器,它的数据吞吐能力更强,即能同时对64位数据进行运算。处理器的字长越大,说明它的运算能力越强。如果讲处理器的寻址范围,则要看处理器的地址总线的位数,而不是它的字长!这个要明白!比如Intel Pentium 4处理器的数据总线为32位,地址总线也是32位。8086的数据总线为16位,地址总线为20位。新兴的64位处理器的数据总线为64位,地址总线大部分是32位。这个清楚之后,再看地址总线与寻址范围的关系。存储单元是以字节(byte)为单位,N根地址总线能访问2的N次方个存储单元。于是有32位地址总线可以访问2的32次方个存储单元,即4GB。
    8086处理器字长是16位,它的地址总线是20位,所以能访问2的20次方个存储单元,即1MB。另外一点需要注意的就是,如果有些题目说:按“字”寻址,就说明是存储单元大小为字长的位数,按“字节”寻址,说明存储单元式字节的大小(个人理解,没有考证)

    下面通过举几个例子,来说明这些关系

    1、某计算机字长32位,存储容量8MB。按字编址,其寻址范围为(0~2M-1) 计算步骤:8MB字节=8*1024*1024*8位。所以8MB/32位=2M.

    2、某计算机字长32位,其存储容量为4MB,若按半字编址,它的寻址范围是(0-2M-1)计算步骤:若按半字就是16位了 4MB=4*1024*1024*8位,所以4MB/16 = 2M;

    3、字长为32位.存储器容量为64KB.按字编址的寻址范围是多少计算步骤:64K字节=64*1024*8位. 所以64KB/32位=(64*1024*8)/32=16*1024=16K 故寻址范围为: 0-16K-1

    4、某机字长32位,存储容量1MB,若按字编址,它的寻址范围是什么?

    解释:容量1M=2*1024*1024 位      一个字长是32 位
    所以,寻址范围是二者相除=256K

    5、对于存储器的容量扩展,有位扩展,字扩展,字位扩展三种形式。对于字位扩展,一个存储器的容量为M*N位,若使用L*K位存储器芯片,那么,这个存储器共需(M*N)/(L*K)个存储器芯片。

    下面分析一下字位扩展的习题:设有一个具有14位地址和8位字长的存储器,问该存储器容量有多大?如果存储器由 1K*1静态存储器组成,需多少芯片?多少位地址作芯片选择?

    分析:位扩展指的是用多个存储器对字长进行扩充。本题中所用的存储器芯片字长是1位,要扩展到8位,就得用8片。原题中说, “存储器由 1K*1静态存储器组成”,其中,1K指的是存储单元个数,它决定地址的位数,因为2的10次方是1K,所以它用10根地址线,4位地址线用来作芯片选择。

    字扩展指的是增加存储器中字的数量。

    解:该存储器的地址线有14位,它的可寻址范围是:2^14=2^4*2^10=16K,因为它是8位字长,所以可存储16K个字节的信息,即16K*8位;所需芯片总数为(16K*8)/(1K*1)=16*8=128个芯片; 芯片选择线为14-10=4。

     地址总线宽度决定了CPU可以访问的物理地址空间,简单地说就是CPU到底能够使用多大容量的内存。16位的微机我们就不用说了,但是对于386以上的微机系统,地址线的宽度为32位,最多可以直接访问4096 MB(4GB)的物理空间。而今天能够用上1GB内存的人还没有多少个呢(服务器除外)。

       数据总线负责整个系统的数据流量的大小,而数据总线宽度则决定了CPU与二级高速缓存、内存以及输入/输出设备之间一次数据传输的信息量。
         CPU做一次加法是多少位的。确切地说,CPU的位数,指的是CPU内ALU的数据字宽度。外部的数据总线也可以是16条,数据分高半字和低半字两次传输。可参Intel8088与8086之区别。
        CPU位数与地址字长无关。地址总线条数不一定等于地址字长。或许有人喜欢在一根地址总线上做32位串行传输,只要他有本事使地址传输能适应RAM芯片的速率。如果CPU内的ALU(算术逻辑单元)字长仍是32位,CPU就还是32位。

    CPU和内存之间的信息交换是通过数据总线和地址总线进行的

    内存储器的基本存储单位称为存储单元,今天的计算机内存小存储器单元的结构模式,每个单元正好存储一个字节的信息(8位二进制代码)。每个单元对应了一个唯一的编号,由此形成的单元编号称为存储单元的地址。计算机中央处理单元中的各部件通过一条公共信息通路连接,这条信息通路称为系统总线。CPU和内存之间的信息交换是通过数据总线和地址总线进行的。内存是按照地址访问的,给出即可得到存储在具有这个地址的内存单元里的信息。CPU可以随即访问任何内存单元的信息。且访问时间的长短不依赖所访问的地址。

    http://zhidao.baidu.com/question/7948930.html?si=3#

    一、字长

    字长是计算机内部一次可以处理的二进制数的位数。一般计算机的字长取决于它的通用寄存器、内存储器、ALU的位数和数据总线的宽度。微型计算机字长有4位、8位、16位,高档微机字长为32位或64位。

    二、主频

    主频是指微型计算机中CPU的时钟频率(CPU Clock Speed),也就是CPU运算时的工作频率。一般来说,主频越高,一个时钟周期里完成的指令数也越多,当然CPU的速度就越快。

    三、存储容量

    存储容量是衡量微型计算机中存储能力的一个指标,它包括内存容量和外存容量。内存容量以字节为单位,分最大容量和装机容量。最大容量由CPU的地址总线的位数决定,而装机容量按所使用软件环境来定。外存容量是指磁盘机和光盘机等容量,应根据实际应用的需要来配置。

    四、外设扩展能力

    一台微型计算机可配置外部设备的数量以及配置外部设备的类型,对整个系统的性能有重大影响。如显示器的分辨率、多媒体接口功能和打印机型号等,都是外部设备选择中要考虑的问题。

    五、软件配置情况

    软件配置情况直接影响微型计算机系统的使用和性能的发挥。通常应配置的软件有:操作系统、计算机语言以及工具软件等,另外还可配置数据库管理系统和各种应用软件。

    解决方案:根据情况硬软选高配置。

    http://zhidao.baidu.com/question/38171441.html?si=4

    影响计算机工作性能的因素有什么
    A.电磁干扰 B、温度 C、湿度 D、静电干扰

    应该是AB,静电干扰不了计算机工作! 客观的说就我们所生活的空间湿度来讲对计算机产生不了什么影响..而温度是指计算机的散热优良而言..物理温度也影响不了计算机工作!

    -------------------

    计算机的字长为什么取决于数据总线的宽度

    最佳答案

    字长是指计算机内部参与运算的数的位数。它决定着计算机内部寄存器、ALU和数据总线的位数,直接影响着机器的硬件规模和造价。字长直接反映了一台计算机的计算精度,为适应不同的要求及协调运算精度和硬件造价间的关系,大多数计算机均支持变字长运算,即机内可实现半字长、全字长(或单字长)和双倍字长运算。
    微型机的字长通常为4位、8位、16位和32位,64位字长的高性能微型计算机也已推出。

    字长对计算机计算精度的影响:
    4 位字长:24 = 16; 16 位字长:216 = 65,536 = 64K
    32 位字长:232 =4, 294, 967, 296 = 4G; 64 位字长:264 ≈ 1 .8445×10 19

    数据总线DB用于传送数据信息。数据总线是双向三态形式的总线,即他既可以把CPU的数据传送到存储器或I/O接口等其它部件,也可以将其它部件的数据传送到CPU。数据总线的位数是微型计算机的一个重要指标,通常与微处理的字长相一致。例如Intel 8086微处理器字长16位,其数据总线宽度也是16位。需要指出的是,数据的含义是广义的,它可以是真正的数据,也可以指令代码或状态信息,有时甚至是一个控制信息,因此,在实际工作中,数据总线上传送的并不一定仅仅是真正意义上的数据。
    地址总线AB是专门用来传送地址的,由于地址只能从CPU传向外部存储器或I/O端口,所以地址总线总是单向三态的,这与数据总线不同。地址总线的位数决定了CPU可直接寻址的内存空间大小,比如8位微机的地址总线为16位,则其最大可寻址空间为216=64KB,16位微型机的地址总线为20位,其可寻址空间为220=1MB。一般来说,若地址总线为n位,则可寻址空间为2n字节。
    控制总线CB用来传送控制信号和时序信号。控制信号中,有的是微处理器送往存储器和I/O接口电路的,如读/写信号,片选信号、中断响应信号等;也有是其它部件反馈给CPU的,比如:中断申请信号、复位信号、总线请求信号、限备就绪信号等。因此,控制总线的传送方向由具体控制信号而定,一般是双向的,控制总线的位数要根据系统的实际控制需要而定。实际上控制总线的具体情况主要取决于CPU。

    http://zhidao.baidu.com/question/7523098.html#

    --------------------------------------------------------------------------------------

    按总线的功能(传递信息的内容)分类,计算机中有三种类型的总线,即传送数据信息的数据总线、传送地址信息的地址总线和传送各种控制信息的控制总线。

    1.数据总线
    数据总线是CPU与存储器、CPU与I/O接口设备之间传送数据信息(各种指令数据信息)的总线,这些信号通过数据总线往返于CPU与存储器、CPU与I/O接口设备之间,因此,数据总线上的信息是双向传输的。

    2.地址总线
    地址总线上传送的是CPU向存储器、I/O接口设备发出的地址信息,寻址能力是CPU特有的功能,地址总线上传送的地址信息仅由CPU发出,因此,地址总线上的信息是单向传输的。

    3.控制总线
    控制总线传送的是各种控制信号,有CPU至存储器、I/O接口设备的控制信号,有I/O接口送向CPU的应答信号、请求信号,因此,控制总线是上的信息是双向传输的。控制信号包括时序信号、状态信号和命令信号(如读写信号、忙信号、中断信号)等。

    例如向内存中写入数据是通过内存总线(包括数据总线、地址总线和控制总线)进行的,数据信息需通过数据总线传递至内存中,具体将这些数据信息写入内存的哪些单元则必须向地址总线传送地址信息确定,而哪个时刻开始向内存中写入数据则由控制总线获得的控制信号决定。

    是64字1位静态存储器C850逻辑框图,向该存储器某一单元写入(或读出)数据时,一是需向由A0、A1、A2、A3、A4、A5构成的地址总线传送地址信息以确定对哪一存储器单元写入(或读出);二是需要向CE端传送片选控制信号使该存储器芯片处于工作状态;三是需要在R/W端传送读写控制信号确定进行写入(或读出)操作;这样才能从数据输入端Din(或数据输出端Dout)写入(或读出)数据。上述操作向地址线、控制线和数据线均传送了信息。

    有些特殊的总线虽然也需要传递数据信息、地址信息和控制信号,但由于结构简单,没有单独提供数据总线、地址总线和控制总线。如通用串行总线USB,包括电源线、接地线在内总共只提供了四条连线,只能以串行输送方式分时传送数据信息、地址信息和控制信息。

    阅读更多
    展开全文
  • 摘要从自然图像生成自动描述是一个具有挑战性的问题,近来受到计算机视觉和自然语言处理... 此外,我们概述了评估机器生成图像描述质量的基准图像数据集和评估措施。 最后,我们推断自动图像描述生成领域的未来方向。
  • 0 前言 1 输出端口的设计 端口的设计,区别主要在于输出端口是默认的wire还是自定义的reg,本篇...数据描述其实是隐式地使用门级原语,因为他是直接描述数据在寄存器直接的流动关系,本质上,还是在阐述逻辑门的使...
  • 数据分析师一定要掌握的基础——描述性统计分析

    千次阅读 多人点赞 2020-03-31 23:20:54
    以下博客内容讲解了描述性统计分析的所有知识点,以及利用鸢尾花数据集的分析加强各个统计量的理解。 数理统计基础-描述性统计分析1、数理统计基础2、描述性统计分析概述(1)概念(2)变量的类型3、统计量(1)...
  • 玩转数据结构 java描述 一 概况

    万次阅读 多人点赞 2019-06-13 18:50:07
    数据结构研究的是数据如何在计算机进行组织和存储,使得我们可以高效的获取数据或者修改数据数据结构可以分为三种结构: 线性结构: 数组;栈;队列;链表;哈希表 树结构: 二叉树,二分搜索树,AVL,...
  • 一、简介 1.本篇博文是一篇关于线性回归的基本操作;...二、数据描述性统计分析 1.导入数据 (1)打开StataIC软件,在软件的上栏目中找到下图圈出的图标,那个图标就是导入数据的入口 (2)点进去之后,StataIC
  •  内容列表中可进行镶嵌数据集结构查看,原始的镶嵌数据集包括Boundary(边界)、Footprint(轮廓线)以及Image(影像数据)。 图:镶嵌数据集构成  1)轮廓线  影像轮廓线基于镶嵌数据集的空间参考,...
  • matlab通过数据进行曲线拟合 导出公式

    万次阅读 多人点赞 2020-11-15 16:14:27
    通过 matlab 命令行 cftool 调出拟合工具箱,可以存储在矩阵、数组中的变量群体进行多种数学方式的拟合,导出数据公式供以其他用途。 Matlab是一个很强大的数据处理软件,是人们进行数据分析的得力助手。...
  • Spark机器学习数据流水线

    万次阅读 2017-03-14 16:27:00
    了解机器学习数据流水线有关内容。 怎么用Apache Spark机器学习包来实现机器学习数据流水线数据价值链处理的步骤。 Spark机器学习流水线模块和API。 文字分类和广告检测用例。 在之前的“用Apache Spark...
  • Arcgis利用dem数据生成等高线

    千次阅读 多人点赞 2020-02-27 23:22:23
    Arcgis利用dem数据生成等高线 如果你在网上查,如何利用dem生成等高线,那么所有教程基本都是一样的,告诉你在工作箱中找到等值线工具,填入参数即可生成等高线。贴几个网上的链接教程: arcgis中DEM如何生成等高线 ...
  • Verilog的数据流、行为、结构化与RTL级描述

    万次阅读 多人点赞 2015-02-08 09:54:52
    Verilog语言可以有多种方式来描述硬件,同时,使用这些描述...数据描述:采用assign连续赋值语句 行为描述:使用always语句或initial语句块中的过程赋值语句(推荐掌握) 结构化描述:实例化已有的功能模块或原语
  • 诶,人们发现圆是画出来了,但是有个问题,就是这个圆囊括了好多没用的地方,就是不够紧致(论文里面用的是tight),不能够贴切的描述整个数据的分布情况。 后来人们想到了高维空间。 大概的思路就是: 把...
  • python 数据、曲线平滑处理——方法总结Savitzky-Golay 滤波器实现曲线平滑插值法折线进行平滑曲线处理基于Numpy.convolve实现滑动平均滤波数据平滑处理——log()和exp()函数 问题描述: 在寻找曲线的波峰、波谷时...
  •  数据选择是指经过选择,把多路数据中的某一路传送到公共数据线上,实现数据选择功能的逻辑电路称为数据选择器。它的作用相当于多输入的单刀多掷开关。    2,集成电路数据选择器  常用的集成电路数据选择器...
  • 只有行列相等的矩阵即方阵才有主、副线,其格式如下:如图, 计算主线元素之和即计算:a11+a12+...+anna_{11} + a_{12}+...+a_{nn} 计算副线元素之和即计算:a1n+a2(n−1)+...+an1a_{1n} + a_{2(n-1)}...
  • 从零开始学USB(十、USB的描述符)

    万次阅读 多人点赞 2018-12-23 14:10:27
    USB设备使用描述符报告其属性。描述符是具有定义格式的数据结构。每个描述符都以字节宽度字段开头,该字段包含描述符中的总字节数,后跟...适当时,描述符包含字符串描述符的引用,这些字符串描述符提供以可读形式...
  • PostgreSql空间数据的操作函数

    万次阅读 热门讨论 2016-12-18 21:52:40
    GIS开发对数据的操作,主要是空间数据的操作。PostgreSql提供了一些处理空间数据的函数,操作起来是比较方便的。下面就记录一下,最近做项目里面用到的一些,也是比较常用的。   空间数据    介绍这些函数...
  • 通过JfreeChart实现数据的实时动态曲线显示 需要解决的问题 JfreeChart如何生成折线图? JfreeChart如何生成动态图? 如何改变JfreeChart的动态图的X轴? JfreeChart如何生成折线图? JfreeChart提供了一个...
  • 用 Python 对数据进行相关性分析

    万次阅读 多人点赞 2020-07-08 08:32:00
    在进行数据分析时,我们所用到的数据往往都不是一维的,而这些数据在分析时难度就增加了不少,因为我们需要考虑维度之间的关系。而这些维度关系的分析就需要用一些方法来进行衡量,相关性分析就是其中...
  • 数据转成Arcgis线、面文件

    千次阅读 2014-12-04 23:28:08
    [转载]点数据转成Arcgis线、面文件   (2012-08-02 16:26:58) 转载▼ 标签:  转载 分类: 学习资料 原文地址:点数据转成Arcgis线、面文件作者:哈哈猫 一、创建execl点...
  • 数据结构基础概念篇

    万次阅读 多人点赞 2017-11-14 13:44:24
    数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。数据:所有能被输入到计算机中,且能被计算机处理的...
  • 数据的酷炫可视化

    万次阅读 2017-03-16 15:45:54
    看到一篇写的非常好的关于数据可视化的博客,转载给各位看官。...1)传递更多的信息,一张图能够传递的信息可能需要长篇大论才能写清楚,如你要描述最近一年公司收入情况,那你就需要说明每个月收入是多少,同比
  • rdt 3.0 协议性能分析 假设有两台主机,分别位于美国西...包括首部字段和数据的分组长 L 为 1000 bytes(8000 bits),所以发送一个分组进入 1Gbps 链路实际所需时间是: t_trans = L / R = (8000 bit/pkt) / (10^9 ...
  • 取得突破进展的关键一点是研究者们可以收集巨量的数据并「学习」这些数据,从而将错误率降低到可接受范围以内。 简而言之,大数据大为改观了人工智能的发展,将其推到一个几乎难以置信的高度。 区块链技术同样能够...
  • 数据集:KITTI数据集分析

    千次阅读 2017-11-03 10:34:17
    The KITTI Vision Benchmark Suite和Vision meets Robotics: The KITTI Dataset两篇论文的内容,主要介绍KITTI数据集概述,数据采集平台,数据集详细描述,评价准则以及具体使用案例。本文KITTI数据集提供一个...
  • 深入理解数据压缩与重复数据删除

    万次阅读 热门讨论 2011-04-14 20:29:00
    数据压缩与重复数据删除两种技术有何区别与联系呢?实际中又该如何正确应用呢?笔者之前对数据压缩原理和技术没有研究,因此做了点功课,查阅整理了相关资料,并与重复数据删除技术进行对比分析。
  • 案例上手 Python 数据可视化

    万次阅读 多人点赞 2019-02-27 23:30:05
    课程亮点 ...数据可视化是数据分析和机器学习的重要环节,比如数据清洗、特征工程、机器学习、数据分析(特别是报告)、评估等环节都会用到“数据可视化”技术。 数据可视化同时还广泛存在于各...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 213,146
精华内容 85,258
关键字:

下面对数据线的描述