归一化
一般来说呢我们获得了数据想要学习规律或者统计结果。多个维度的特征需要统一为一个值。但是不同维度之间特征的量纲或量级可能相差的非常大。这个时候量级大的数据可能会使我们在学习的时候忽略量级小的数据。
举个例子。我们针对于某一轮赛事获得的数据来计算每位选手的造成伤害能力(行为选手,列为每一轮制造的总伤害值):
Game1 | Game2 | Game3 | Game4 | Game5 | |
Rex | 24139 | 19643 | 32864 | 27285 | 86173 |
Shan | 25643 | 22376 | 19764 | 24732 | 38243 |
Tong | 18364 | 20423 | 8763 | 16824 | 34374 |
Bai | 24731 | 5200 | 18345 | 20734 | 103487 |
Luo | 7241 | 6315 | 7352 | 4563 | 14735 |
一个直观的思路是每个选手针对于每轮比赛求平均值:
Game1 | Game2 | Game3 | Game4 | Game5 | average | |
Rex | 24139 | 19643 | 32864 | 27285 | 86173 | 38020.8 |
Shan | 25643 | 22376 | 19764 | 24732 | 38243 | 26151.6 |
Tong | 18364 | 20423 | 8763 | 16824 | 34374 | 19749.6 |
Bai | 24731 | 5200 | 18345 | 20734 | 103487 | 34499.4 |
Luo | 7241 | 6315 | 7352 | 4563 | 14735 | 8041.2 |
我们可以发现一个问题,Game5的伤害量级太大了,可能是因为比赛时间过长或者其他的各种原因。导致的最终结果就是game5的伤害排名就是最终统计数据的伤害排名。但是实际上,每场比赛对于最后统计都是同等重要的。那我们该如何去处理数据呢。
常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间,变换函数为:
不同变量往往量纲不同,归一化可以消除量纲对最终结果的影响,使不同变量具有可比性。在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。
上述数据在经过这种处理后变为:
Game1 | Game2 | Game3 | Game4 | Game5 | average | |
Rex | 0.918269753 | 0.840882627 | 1 | 1 | 0.804917072 | 0.912813891 |
Shan | 1 | 1 | 0.486516149 | 0.887641933 | 0.264872904 | 0.727806197 |
Tong | 0.604445169 | 0.88629483 | 0.055307306 | 0.539609189 | 0.22127952 | 0.461387203 |
Bai | 0.95044017 | 0 | 0.430895265 | 0.711689112 | 1 | 0.618604909 |
Luo | 0 | 0.064916162 | 0 | 0 | 0 | 0.012983232 |
这样第五局对于结果的影响就与其他局保持一致了。
标准化
上面介绍的归一化其实有一个很明显的缺点,不知道大家看公式有没有发现。就是异常极值对数据产生的影响过大。比如说我们还是统计选手的伤害能力,不过扩展到100位选手。然后在一轮游戏中,有某两位选手的伤害在100000左右,其余选手的伤害值都在10000-20000。可能是这两位选手在比赛对局中时间过长并且队伍采用了其他选手全体保护核心选手制造伤害的战术,导致这两位选手的伤害值高的不正常。我们称之为异常值。这时候使用归一化之后这两位选手的输出能力在1左右而其他选手所有的输出能力都在0.1到0.2之间。这导致两个结果:
1.这两个选手的实际输出能力并没有比别的选手高5-10倍,只是因为一些比较极端的情况导致的。
2.其余选手的在这一场的输出能力并没有做到很好的差分。全部挤在0.1-0.2之间,使这一轮的比赛数据没有差分度,这个数据就直接浪费掉了。
为了解决这个问题,我们便采用标准化,公式为:
其中为原始数据的均值,为原始数据的标准差。
经过处理的数据的均值为0,标准差为1。我们可以直观的发现:
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生较大改变。
而对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
标准化是当前用得最多的数据标准化方式。标准差分数可以回答这样一个问题:"给定数据距离其均值多少个标准差"的问题,在均值之上的数据会得到一个正的标准化分数,反之会得到一个负的标准化分数。