最近在项目中需要对数据进行简单处理,要求计算数据的均值、方差、相关系数等数据关系。
这里数据的均值只的是数据的算术均值(Arithmetic Mean),只所有数据之和再除以数据的个数,反应的是数据集中趋势的一个指标。
对于 n n 个数据的数据集 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;
}
在统计学与概率论中,方差用于横向数据的集中程度。分为总体方差和样本方差。在统计描述中,方差用来计算每一个变量(观察值)与总体均数之间的差异。为避免出现离均差总和为零,离均差平方和受样本含量的影响,统计学采用平均离均差平方和来描述变量的变异程度。总体方差计算公式:
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;
}
标准差是方差的平方根。
double CalculateStandardDeviation(std::vector<double> vData)
{
if (vData.size() <= 1)
{
return 0;
}
double dSD = 0;
dSD = CalculateVariance(vData);
dSD = sqrt(dSD);
return dSD;
}
协协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
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 1);
dCor = dCorvariance;
return true;
}
相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。又叫相关系数或线性相关系数,一般用字母 r r 表示,用来度量两个变量间的线性关系。
相关系数的计算公式如下:
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;
}