一、 计算 N 维数据关系
统计学里最基本的概念就是样本的均值、方差、标准差、协方差等,下面我们给定一个包含 n
个样本的集合,分别进行分析。
1 均值
未经分组的均值计算公式:
![1002400773403235a1fd5b10fa6d32f4.png](https://i-blog.csdnimg.cn/blog_migrate/9ee1e2f84faec162f5c586b1b6bec938.jpeg)
2 方差
均值描述的是样本集合的中间点,它告诉我们的信息是有限的,而方差给我们描述的是样本集合
的各个样本点到均值之间的平均距离。单一正态总体方差计算公式:
![bdc3f27853120622f33bae25f9a5b6ad.png](https://i-blog.csdnimg.cn/blog_migrate/fcb1b8905ad138e0b2e9d464504159e8.png)
3 标准差
方差对平均距离计算了平方,为了还原回原来的数量级,就有了标准差,标准差是对方差开根
号,计算公式:
![52cf2450d5e35e44afeba90df20b7736.png](https://i-blog.csdnimg.cn/blog_migrate/d3c65ffb0c2a7ecfa0361089454c16da.png)
标准差描述各个点与均值距离的平均值,值越小表示数据越集中,例如:[0,8,12,20]和[8, 9,11,12],两个集合的均值都是 10,但显然两个集合各个值差别是很大的,计算两者的标准差, 前者是 8.3,后者是 1.8,显然后者较为集中。
4 协方差
如果有另一个样本集合,也就是两个以上的样本集合,那么这两个样本集合间的各个点在时间 或空间上有什么关系,其中一个样本中的点会不会像另一个样本中的点保持着一样的变化趋势,均值、方差、标准差都是解决一维内部各数据间的相关性问题(我们村的贫富差距问题)。当出现多维集合时,各个维度间的数据有无关联,可以参照一维的方法,首先将每个维度样本集合中每一个点的数据值减去该维度的平均值,再乘以另外一个维度的同样的差值,最后除以 n-1 就是协方差(n就是每个维度样本个数,各维度一样),这个协方差就可以反映两个维度间各数据的相关性,计算公式:
![f9c1d2d971790d2dddd8dc4b6a222793.png](https://i-blog.csdnimg.cn/blog_migrate/f4d0d66dbebd039ba8b7c27243ea4008.png)
协方差的结果有什么意义?如果结果为正值,则说明两者是正相关的,如果结果为负值,则说 明两者是负相关的,如果结果为 0,则表示两者之间没有关系。协方差只是说明了线性相关的方向问题,即从正无穷到负无穷,不能说明相关的程度,因为这个值可能很大也可能很小,所以还引出了相关系数=两个维度的协方差/(两个维度的标准差),其值始终在-1 到 1 之间变化。
当出现多维数据时,若要对多维数据的相关性进行分析,那么就要用到协方差矩阵
![6e13ce79f2e5cba777c078c4484f6449.png](https://i-blog.csdnimg.cn/blog_migrate/3197a848d78915d2b94303acccaefca4.jpeg)
![b5487474645cfb17993347c79edfed18.png](https://i-blog.csdnimg.cn/blog_migrate/6a86bff96ba03cb24869c39ce4335186.jpeg)
![a67b90939cc2f6eabf16b17dc29df021.png](https://i-blog.csdnimg.cn/blog_migrate/5241f5aa22a3e17c7b90c37252799631.jpeg)
通过 opencv 接口完成计算的例子:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char const *argv[])
{
Mat samples = (Mat_<double>(5, 3) << 90, 60, 90, 90, 90, 30, 60, 60, 60, 60, 60, 90, 30, 30, 30);
Mat cov, mu; //mu:保存均值 //cov:保存协方差
calcCovarMatrix(samples, cov, mu, CV_COVAR_NORMAL | CV_COVAR_ROWS);//CV_COVAR_COLS
cout << "means : "<< endl;
cout << mu << endl;
cout << cov << endl;
cout << "cov : " << endl;
cout << cov/5 << endl;
waitKey(0);
return 0;
}
执行结果
![79dd34a373766f1e749a4a4bfea62f3f.png](https://i-blog.csdnimg.cn/blog_migrate/da4ecbd3e77f1bd77cbc4748cb2b3ee3.jpeg)
建议:该系列教程可参照本人视频对应观看!
10_n维数据之间数学关系
11_协议差矩阵概念
12_协方差矩阵代码实现