如图1所示,假设现在有两个样本,分别拥有两个特征,如下:
肿瘤的大小(厘米)的 | 发现时间(天) | |
样本1 | 1 | 200 |
样本2 | 五 | 100 |
计算两个样本之间的欧拉距离:
D =
,这个计算结果很明显是被时间主导的。
所以,将时间以年为单位,那么两个样本之间的欧拉距离就是:
D =
,这个计算结果又很明显的是被肿瘤大小主导的。
根据这个问题,我们提出了数值归一化:将所有的数据映射到同一个尺度。
2,数据归一化的方式有两种:
最值归一化(归一化),将所有的数据映射到0-1之间。它是最简单的数据归一化。求出每个特征的最大值和最小值,先将数据映射到O-(的的Xmax-Xmin时时)中,再求特征点X在该范围长度中所占的比例。
这种方式适用于有明显边界的情况,因为受异常值的影响比较大。
比如有一组特征表示学生的成绩分数,分数是有明显边界的,最低0分,最高100分。在图像中,每个像素点的像素值也是有明显边界的,范围是-255。这些都适合用最值归一化处理数据的。像工资的话,就不适用,工资高的归一化接近1,工资低的归一化接近0,属于极端数据了。
均值方差归一化(标准化):把所有的数据归一到均值是0,方差是1的分布中。
这个方式适用于数据分布没有明显的边界,有可能存在极端数据值。
3,简单的代码介绍。
其一,最值归一化,随机生成一个有100个数的矩阵,数据的范围是0-100。根据公式将数据归一化。
X = np.random.randint(0,100,size = 100)
array = (x - np.min(x))/(np.max(x) - np.min(x))
对矩阵进行归一化。定义一个50 * 2的矩阵,每个数字的范围是0-100,由于归一化的数据是浮点型,所以要先将矩阵转换成浮点型。最后根据公式,对每一列的数据进行归一化。
X = np.random.randint(0,100,(50,2))
X = np.array(X,dtype = float)
X[:,0] = (X[:,0] - np.min(X[:,0]))/(np.max(X[:,0]) - np.min(X[:,0]))
X[:,1] = (X[:,1] - np.min(X[:,1]))/(np.max(X[:,1]) - np.min(X[:,1]))
其二,均值方差归一化,根据公式,对每一列的数据进行归一化。
X = np.random.randint(0,100,(50,2))
X = np.array(X,dtype = float)
X[:,0] =(X[:,0] - np.mean(X[:,0])) / np.std(X[:,0])
X[:,1] =(X[:,0] - np.mean(X[:,0])) / np.std(X[:,0])