knn算法-归一化(七)

举报
咔吧咔吧 发表于 2020/11/16 16:19:17 2020/11/16
【摘要】 归一化 1.1 归一化的定义及其代码实现 问题: 观察如下样本数据,我们有两个样本,每个样本有两个特征,一个是肿瘤大小,一个是肿瘤的发现时间。 如利用欧拉距离计算上述两个样本的距离,由于两个特征的值差距较大,距离结果的值大小由发现时间决定。 如果此时修改发现时间的单位为年,则最终距离结果又由肿瘤大小决定。 综上所述,我们在训练模型时...

归一化

    1.1 归一化的定义及其代码实现

    问题:

    观察如下样本数据,我们有两个样本,每个样本有两个特征,一个是肿瘤大小,一个是肿瘤的发现时间。

    如利用欧拉距离计算上述两个样本的距离,由于两个特征的值差距较大,距离结果的值大小由发现时间决定。

    image.png

    如果此时修改发现时间的单位为年,则最终距离结果又由肿瘤大小决定。

    image.png

    

    综上所述,我们在训练模型时,如果特征之间的值差距较大,不能直接传入模型,需要对数据做归一化处理。

    作用:将所有数据映射到同一尺度。

    归一化的分类

最值归一化(Normalization):把所有数据映射到(0,1)之间

计算流程:先计算所有样本的每个特征的最大值和最小值计算出来,用每个样本的特征值减去对应的最小值,再计算最大值和最小值的差值,最后将两个结果            进 行除法操作,得到最终的特征归一化结果。


    适用情况:分布有明显边界


    举例:学生分数0-100有明显边界,图片像素点的值0-255有明显边界。


    缺点:受outlier影响较大


    观察公式,结果受image.pngimage.png影响严重

    image.png


    均值方差归一化(standardization):把所有数据归一到均值为0方差为1的分布中


    适用情况:数据分布没有明显边界

    优点:不容易受到极端数据值的影响

    image.png

    

    利用每个特征值减去特征值均值再除以特征值的方差得到均值方差归一化结果


    最值归一化实现

import numpy as np
  import matplotlib.pyplot as plt

  #随机生成长度为100的数值范围在0-100的一维数组
  x = np.random.randint(0,100,size=100)

  #归一化代码实现
  (x-np.min(x))/(np.max(x)-np.min(x))

  #随机生成shape为(50,2)的值范围在0-100范围内的二维数组
  X = np.random.randint(0,100,(50,2))
  X[:10,:]

  #转换数值类型为float
  X = np.array(X,dtype=float)
  X[:10,:]

  #对两个样本进行最值归一化
  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]))

  #绘图观察数据分布
  plt.scatter(X[:,0],X[:,1])
  plt.show()

  #观察均值和方差
  np.mean(X[:,0])
  np.std(X[:,0])

  np.mean(X[:,1])
  np.std(X[:,1])

    均值方差归一化实现

#随机生成shape为(50,2)数值范围在0-100范围内的二维数组
  X2 = np.random.randint(0,100,(50,2))
  #转换为float类型
  X2 = np.array(X2,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])

  #绘图显示
  plt.scatter(X2[:,0],X2[:,1])
  plt.show()

  #观察均值和方差
  np.mean(X2[:,0])
  np.std(X2[:,0])

  np.mean(X2[:,1])
  np.std(X2[:,1])

    通过对比发现,均值方差归一化能够将所有数据转换为均值为0,方差为1的范围内,更适合数据中存在极端数据的情况。


    1.2 sklearn中的归一化

    训练集和测试集的归一化

    image.png

    

    利用训练集得到均值和方差,训练集和测试集均利用训练集得到的均值和方差来进行归一化处理

    

    sklearn中的归一化

    image.png


    

    将训练集交给scaler类,调用fit方法,将关键信息(均值、方差等)保存在scaler类中,再调用scaler类的transform方法,将训练集和测试集进行归一化转换。

    代码实现:

import numpy as np
  from sklearn import datasets

  iris = datasets.load_iris()
  X = iris.data
  y = iris.target

  X[:10,:]

  from sklearn.model_selection import train_test_split
  X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=1)

  #进行均值方差归一化处理
  from sklearn.preprocessing import StandardScaler
  ss = StandardScaler()
  ss.fit(X_train,y_train)
  ss.mean_
  ss.scale_

  #转换训练集和测试集
  X_train1 = ss.transform(X_train)
  X_test1 = ss.transform(X_test)

  #对比准确率
  from sklearn.neighbors import KNeighborsClassifier
  knn_clf = KNeighborsClassifier(n_neighbors=3)
  knn_clf.fit(X_train1,y_train)
  knn_clf.score(X_test1,y_test)
  knn_clf.score(X_test,y_test)


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。