KNN-距离-数据归一化 Feature Scaling
学习视频
在线数学公式的编辑工具
Q: 为什么要数据归一化?
A: 于量纲不同,此时主要衡量的值不一定是预期衡量的值
样本 | 肿瘤大小(厘米) | 发现时间(天) |
---|---|---|
样本1 | 1 | 200 |
样本2 | 5 | 100 |
采用欧拉距离:
,这值被发现时间
所主导,虽然肿瘤大小
相差5倍,但是由于量纲不同,此时主要衡量的发现天数
差值;
如果调整天->年
:
样本 | 肿瘤大小(厘米) | 发现时间(天) |
---|---|---|
样本1 | 1 | 200=0.55年 |
样本2 | 5 | 100=0.27年 |
此时欧拉距离被肿瘤大小所主导。
所以要对源数据归一化处理,而所谓的数据归一化处理就是将数据都映射到同一尺度中,
其中最简单的是最值归一化[normalizition],把所有数据都映射到0-1之间
:
最值归一化[normalizition] 公式:
公式解释
: 对每一个特征求出特征对应的最大值和最小值,对于每一个特征点减去最小值,
相当于将整个数据都映射到[0-(
)]的范围,求特征x相比于整个范围的占比,这样都映射到0-1之间了。
最值归一化[normalizition] 适用于分布有明显边界的情况;
比如:成绩分布[0-100],像素点[0-255],
缺点:受outlier的影响较大,比如没有明显边界的月收入[0-100万],大多数人都是1万,只有一个是100万,都映射到0-1之间的话,月收入100万的是1,大多数月收入1万的都聚集在0.01附近。此时数据映射不够好,相应的一个改进方式是使用均值方差归一化[standardization]
均值方差归一化[standardization]:把所有数据归一到均值为 0 方差为 1 的分布中,此时并不能保证所有数据在0-1之间,但是均值是在0,方差为1
适用于没有边界,存在极端值的数据集。
所以一般采用
均值方差归一化[standardization]。
均值方差归一化[standardization] 公式:
公式解释
: 对每一个特征减去特征均值,再除以特征值对应的方差
具体代码实现,参考原视频,此处仅演示后一种代码实现,
X2 = np.random.randint(0, 100, (50, 2)) # 0-100,2个特征值
X2 = np.array(X1, dtype=float)
X2[:,0] = (X2[:,0] - np.mean(X2[:,0])) / np.std(X2[:,0])
X2[:,1] = (X2[:,1] - np.mean(X2[:,1])) / np.std(X2[:,1])
# X2[:,0] - np.mean(X2[:,0]) 结果是第一列特征的向量
# np.std(X2[:,0]) 结果是第一列特征的方差值
# 向量 / 值 = 向量 ==> 归一化第一列的特征值
# 绘图
plt.scatter(X2[:,0], X2[:,1])
plt.show()