方差计算公式的变形及应用

方差计算公式

对于一组数据 x 1 , x 2 . . . x n x_1,x_2...x_n x1,x2...xn,若其平均数为 x ‾ \overline x x则方差公式为
S 2 = 1 n [ ( x 1 − x ‾ ) 2 + ( x 2 − x ‾ ) 2 + . . . + ( x 3 − x ‾ ) 2 ] S^2=\frac 1n[(x_1-\overline x)^2+(x_2-\overline x)^2+...+(x_3-\overline x)^2] S2=n1[(x1x)2+(x2x)2+...+(x3x)2]

方差计算公式变形

S 2 = 1 n [ ( x 1 2 + x ‾ 2 − 2 x 1 x ‾ ) + ( x 2 2 + x ‾ 2 − 2 x 2 x ‾ ) + . . . + ( x n 2 + x ‾ 2 − 2 x n x ‾ ) ] = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) + n x ‾ 2 − 2 x ‾ ( x 1 + x 2 + . . . + x n ) ] = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) + n x ‾ 2 − 2 n x ‾ 2 ] = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) − n x ‾ 2 ] = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) − 1 n ( x 1 + x 2 + . . . + x n ) 2 ] S^2=\frac 1n[(x_1^2+\overline x^2-2x_1\overline x)+(x_2^2+\overline x^2-2x_2\overline x)+...+(x_n^2+\overline x^2-2x_n\overline x)]=\frac 1n[(x_1^2+x_2^2+...+x_n^2)+n\overline x^2-2\overline x(x_1+x_2+...+x_n)]=\frac 1n[(x_1^2+x_2^2+...+x_n^2)+n\overline x^2-2n\overline x^2]=\frac 1n[(x_1^2+x_2^2+...+x_n^2)-n\overline x^2]=\frac 1n[(x_1^2+x_2^2+...+x_n^2)-\frac 1n(x_1+x_2+...+x_n)^2] S2=n1[(x12+x22x1x)+(x22+x22x2x)+...+(xn2+x22xnx)]=n1[(x12+x22+...+xn2)+nx22x(x1+x2+...+xn)]=n1[(x12+x22+...+xn2)+nx22nx2]=n1[(x12+x22+...+xn2)nx2]=n1[(x12+x22+...+xn2)n1(x1+x2+...+xn)2]

也就是:
S 2 = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) − 1 n ( x 1 + x 2 + . . . + x n ) 2 ] S^2=\frac 1n[(x_1^2+x_2^2+...+x_n^2)-\frac 1n(x_1+x_2+...+x_n)^2] S2=n1[(x12+x22+...+xn2)n1(x1+x2+...+xn)2]

方差计算公式变形的应用

这算是机器学习中常用的trick。树模型中会经常用到,一下两个场景是我自己实现算法过程中用到的。

增量的计算样本集的方差

最近在调研增量学习的相关内容,其中heoffding tree 是一个用于学习流的数结构,也就是数据集不再是一个完整的集合进行批处理。而是以流的形式一部分一部分加入数中实现训练。

树的分裂过程需要计算样本的方差来求出最大增益。
而当数位变成的形式,无法整个计算平均值或者相加,需要对上述公式进行变形。这算是机器学习中常用的trick。

S 2 = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) − 1 n ( x 1 + x 2 + . . . + x n ) 2 ] S^2=\frac 1n[(x_1^2+x_2^2+...+x_n^2)-\frac 1n(x_1+x_2+...+x_n)^2] S2=n1[(x12+x22+...+xn2)n1(x1+x2+...+xn)2]
树的节点中存储之前所有数据的和以及平法和,后加入的数据只需利用上述公式就可以更新平法差。

直方图加速法

实现传统树模型时,计算最佳分裂点时需要遍历所有属性的所有值来确定如何分裂信息增益最大,遍历的每次都需要重新分割,重新计算方差耗时很长。使用 S 2 = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) − 1 n ( x 1 + x 2 + . . . + x n ) 2 ] S^2=\frac 1n[(x_1^2+x_2^2+...+x_n^2)-\frac 1n(x_1+x_2+...+x_n)^2] S2=n1[(x12+x22+...+xn2)n1(x1+x2+...+xn)2]需要反复求分割的左右两部分平均值。

使用变形公式
S 2 = 1 n [ ( x 1 2 + x 2 2 + . . . + x n 2 ) − 1 n ( x 1 + x 2 + . . . + x n ) 2 ] S^2=\frac 1n[(x_1^2+x_2^2+...+x_n^2)-\frac 1n(x_1+x_2+...+x_n)^2] S2=n1[(x12+x22+...+xn2)n1(x1+x2+...+xn)2]遍历每个属性时提前按照样本的该属性值排序,计算好所样本label值和平法,直方图的形式存储,遍历该属性只需要切割直方图就可以左右部分的label和平法求和,带入变形公式,求分割两部分的方差只需计算加法,无需反复计算平均值。节点分裂速度可以提升好几倍。

猜你喜欢

转载自blog.csdn.net/weixin_42280274/article/details/109047204