KNN算法的数据归一化--Feature Scaling

如图1所示,假设现在有两个样本,分别拥有两个特征,如下:

 肿瘤的大小(厘米)的发现时间(天)
样本11200
样本2100

计算两个样本之间的欧拉距离:

D =  \ SQRT {(1-5)^ 2 +(200-100)^ 2},这个计算结果很明显是被时间主导的。

所以,将时间以年为单位,那么两个样本之间的欧拉距离就是:

D =  \ SQRT {(1-5)^ 2 +(0.55-0.27)^ 2},这个计算结果又很明显的是被肿瘤大小主导的。

根据这个问题,我们提出了数值归一化:将所有的数据映射到同一个尺度。

 

2,数据归一化的方式有两种:

       最值归一化(归一化),将所有的数据映射到0-1之间。它是最简单的数据归一化。求出每个特征的最大值和最小值,先将数据映射到O-(的的Xmax-Xmin时时)中,再求特征点X在该范围长度中所占的比例。

                                                                    Xscale = \ frac {X-Xmin} {Xmax -Xmin}

这种方式适用于有明显边界的情况,因为受异常值的影响比较大。

比如有一组特征表示学生的成绩分数,分数是有明显边界的,最低0分,最高100分。在图像中,每个像素点的像素值也是有明显边界的,范围是-255。这些都适合用最值归一化处理数据的。像工资的话,就不适用,工资高的归一化接近1,工资低的归一化接近0,属于极端数据了。

       均值方差归一化(标准化):把所有的数据归一到均值是0,方差是1的分布中。

                                                       Xscale = \ frac {X  -  Xmean} {S}

这个方式适用于数据分布没有明显的边界,有可能存在极端数据值。

 

 

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])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值