【算法】-001 数据处理-均值、方差、协方差、相关系数

【算法】-001 数据处理-均值、方差、协方差、相关系数

  最近在项目中需要对数据进行简单处理,要求计算数据的均值、方差、相关系数等数据关系。

1、 均值

  这里数据的均值只的是数据的算术均值(Arithmetic Mean),只所有数据之和再除以数据的个数,反应的是数据集中趋势的一个指标。

  对于 n 个数据的数据集 N ,算数平均值计算公式如下:

A n = a 1 + a 2 + a 3 + + a n 1 + a n n

  C++计算代码如下:

double CalculateArithmeticMean(std::vector<double> vData)
{
    double dMean = 0;
    if (vData.size() == 0)
    {
        return 0;
    }
    for (int i = 0; i < vData.size(); i++)
    {
        dMean += vData[i];
    }
    dMean = dMean / vData.size();
    return dMean;
}

2、 方差

  在统计学与概率论中,方差用于横向数据的集中程度。分为总体方差和样本方差。在统计描述中,方差用来计算每一个变量(观察值)与总体均数之间的差异。为避免出现离均差总和为零,离均差平方和受样本含量的影响,统计学采用平均离均差平方和来描述变量的变异程度。总体方差计算公式:

σ 2 = ( X μ ) 2 N

   σ 2 为总体方差, X 为样本数据, μ 为总体均值, N 为样本数目。
  实际工作中,总体均数难以得到时,应用样本统计量代替总体参数,经校正后,样本方差计算公式:
S 2 = i = 1 n ( X i X ¯ ) 2 n 1

  其中 S 2 为样本方差, X ¯ 为样本均值, n 为样本例数。
  C++计算代码如下:


double CalculateVariance(std::vector<double> vData)
{
    if (vData.size() <= 1)
    {
        return 0;
    }
    double dMean = CalculateArithmeticMean(vData);
    double dDiff = 0;
    for (int i = 0; i < vData.size(); i++)
    {
        dDiff += (vData[i] - dMean)*(vData[i] - dMean);
    }
    dDiff = dDiff / (vData.size()-1);
    return dDiff;
}

3、 标准差

  标准差是方差的平方根。

S = i = 1 n ( X i X ¯ ) 2 n 1

double CalculateStandardDeviation(std::vector<double> vData)
{
    if (vData.size() <= 1)
    {
        return 0;
    }
    double dSD = 0;
    dSD = CalculateVariance(vData);
    dSD = sqrt(dSD);
    return dSD;
}

4、 协方差

  协协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
  协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。

c o v ( X , Y ) = i = 1 n ( X i X ¯ ) ( Y i Y ¯ ) n 1

  C++计算方法如下:

bool CalculateCovariance(std::vector<double> vX, std::vector<double> vY,double& dCor)
{
    if (vX.size() <=1 || vY.size() <=1 || vX.size() != vY.size())
    {
        return false;
    }

    double dMeanX = CalculateArithmeticMean(vX);
    double dMeanY = CalculateArithmeticMean(vY);

    double dCorvariance = 0;
    for (int i = 0; i <vX.size(); i++)
    {
        dCorvariance += ((vX[i] - dMeanX)*(vY[i] - dMeanY));
    }
    dCorvariance /= (vX.size() - 1);
    dCor = dCorvariance;
    return true;
}

5、 相关系数

  相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。又叫相关系数或线性相关系数,一般用字母 r 表示,用来度量两个变量间的线性关系。
  相关系数的计算公式如下:

r ( X , Y ) = C o v ( X , y ) V a r ( X ) V a r ( Y )

  其中 C o v ( X , Y ) 表示数据 X Y 的协方差, V a r ( X ) V a r ( Y ) 表示数据 X Y 的方差。
  C++的实现方式如下:

bool CalculateCorrelationCoefficient(std::vector<double> vX, std::vector<double> vY, double& dCorCoe)
{
    if (vX.size() <= 1 || vY.size() <= 1 || vX.size() != vY.size())
    {
        return false;
    }
    double dCor = 0;
    bool hr = CalculateCovariance(vX, vY, dCor);
    if (!hr)
    {
        return false;
    }
    double dVarianceX = CalculateVariance(vX);
    if (dVarianceX == 0)
    {
        return false;
    }
    double dVarianceY = CalculateVariance(vY);
    if (dVarianceY == 0)
    {
        return false;
    }
    double dCorrelationCoefficient = 0;
    dCorrelationCoefficient = dCor / sqrt(dVarianceX*dVarianceY);
    dCorCoe = dCorrelationCoefficient;
    return true;
}

猜你喜欢

转载自blog.csdn.net/freehawkzk/article/details/82112553