一、均值
均值是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。它是映数据集中趋势的一项指标。均值和标准差是描述数据集中趋势和离散程度的两个最重要的测度值。
二、方差,标准差
方差(variance)是 衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是各个数据分别与其平均数之差的平方的和的平均数。在许多实际问题中,研究方差即偏离程度有着重要意义。方差是衡量源数据和期望值相差的度量值。而标准差给我们描述的是样本集合的各个样本点到均值的距离之平均。
标准差:方差则仅仅是标准差的平方
举例:
以这两个集合为例,[0, 8, 12, 20]和[8, 9, 11, 12],两个集合的均值都是10,但显然两个集合的差别是很大的,计算两者的标准差,前者是8.3后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是n,是因为这样能使我们以较小的样本集更好地逼近总体的标准差,即统计上所谓的“无偏估计”。
三、协方差
标准差和方差一般是用来描述一维数据的,但现实生活中我们常常会遇到含有多维数据的数据集,最简单的是大家上学时免不了要统计多个学科的考试成绩。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子的欢迎程度是否存在一些联系。协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:
来度量各个维度偏离其均值的程度,协方差可以这样来定义:
协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐越受女孩欢迎。如果结果为负值, 就说明两者是负相关,越猥琐女孩子越讨厌。如果为0,则两者之间没有关系,猥琐不猥琐和女孩子喜不喜欢之间没有关联,就是统计上说的“相互独立”。从协方差的定义上我们也可以看出一些显而易见的性质,如:
四、协方差矩阵
前面提到的猥琐和受欢迎的问题是典型的二维问题,而协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算:
个协方差,那自然而然我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:
这个定义还是很容易理解的,我们可以举一个三维的例子,假设数据集有三个维度,则协方差矩阵为:
可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差。理解协方差矩阵的关键就在于牢记它的计算是不同维度之间的协方差,而不是不同样本之间。拿到一个样本矩阵,最先要明确的就是一行是一个样本还是一个维度。
求 一个矩阵的协方差矩阵的代码
#include<iostream> #include<Eigen/dense> using namespace std; using namespace Eigen; int main() { //输入为input,输出为input的协方差矩阵covMat Eigen::MatrixXf input(3,3); input<<1,22,3,4,55,6,7,23,9; Eigen::MatrixXf meanVec = input.colwise().mean(); Eigen::RowVectorXf meanVecRow(Eigen::RowVectorXf::Map(meanVec.data(),input.cols())); Eigen::MatrixXf zeroMeanMat = input; zeroMeanMat.rowwise()-=meanVecRow; if(input.rows()==1) Eigen::MatrixXf covMat = (zeroMeanMat.adjoint()*zeroMeanMat)/double(input.rows()); else Eigen::MatrixXf covMat = (zeroMeanMat.adjoint()*zeroMeanMat)/double(input.rows()-1); cout<<covMat<<endl; } /*利用g++编译输出结果: 9 1.5 9 1.5 352.333 1.5 9 1.5 9 MATLAB: >> cov(input) ans = 9.0000 1.5000 9.0000 1.5000 352.3333 1.5000 9.0000 1.5000 9.0000 结果一致*/
求 一个向量的协方差矩阵的代码
VectorXd X;
int size = X.size();
double meanVec = X.mean();
VectorXd X_mean;
MatrixXd covMat = MatrixXd::Zero(size,size);
for(int i=0; i<size; i++ )
{
X_mean(i) = X(i) - meanVec ;
}
covMat = X_mean * X_mean.transpose()/(size - 1);
参考:https://blog.csdn.net/qq_20965753/article/details/52760539