机器学习(6)- K近邻算法

1. KNN

1.1.K-近邻算法简介[*]

  1. 定义: 一个样本在特征空间中K个最相似(距离最小)的样本中, 大多数属于那个类别, 这个属于那个类别
  2. 距离: 一般使用就是欧式距离: 各个维度的差值平方和开根号
  3. K值: 最相似的样本数量.

1.2 k近邻算法api初步使用[☆☆☆]

  1. Scikit-learn工具安装:
    • pip3 install scikit-learn==0.19.1
  2. api :
    • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
    • n_neighbors: k值, 最近邻居数量
  • 注意: K近邻是一种惰性算法.

1.3 距离度量[☆☆]

  1. 欧式距离:
    • 各个维度差值的平方和开根号
  2. 曼哈顿距离(城市街区距离)
    • 各个维度差值的绝对值的和
  3. 切比雪夫距离(国王最少移动的步数):
    • 各个维度差值的绝对值的最大值
  4. 闵可夫斯基距离:
    • 当p=1时, 是曼哈顿距离
    • 当p=2时, 是欧式距离
    • 当p->∞时, 是切比雪夫距离
    • 是一个距离综合表现形式
    • 总结: 前面的四个距离, 都没有做无量纲化处理
  • 所有特征都同等单位看待了
    • 没有考虑各个特征的均值和方差.
  1. 标准化欧氏距离
    • 解决: 统一各个维度量纲(单位), 相当于把各个维度调整到了均值为0, 方差为1的分布中了.
    • 公式: 各个维度差值除以这个维度的标准差, 再平方求和, 开根号.
  2. 余弦距离:
    • 公式: 两个向量内积除以两个向量模的乘积
  • 意义: 范围是[-1, 1], 这个值大于>0表示正相关, 小于0表示负相关, 等于0不相关. 这个值的绝对越接近与1, 相关性就越高, 越接近于0, 相关性越低.
  1. 汉明距离(Hamming Distance)【了解】
    • 两个等长的字符串, 一个替换为另外一个, 最少需要替换的次数.
  2. 杰卡德距离(Jaccard Distance)【了解】
    • 杰卡德相似系数: 两个集合交集的数量/ 两个集合并集的数量.
  • 杰卡德距离:( 两个集合并集数量-交集数量) /两个集合并集的数量.
    • 公式: 杰卡德距离 = 1 - 杰卡德相似系数
    • 意义: 杰卡德距离越小就越相似, 越大就越不相似.
  1. 马氏距离(Mahalanobis Distance)【了解】
    • 基于样本分布一种距离.

1.4 k值的选择[☆☆☆]

  • K值过小:

    • 容易受到异常点影响
    • K过小, 相当于模型变复杂了, 可能会产生过拟合
  • k值过大:

    • 容易受到样本均衡的影响
    • K过大, 相当于模型变简单了, 可会产生欠拟合.
  • 实际中: 一般会选择一个比较小的K值, 需要通过网格搜索和交叉验证来选择一个合适参数.

  • 扩展:

    • 近似误差: 训练集的误差, 训练集误差小, 但是测试集上误差可能会比较大, 这个模型就不是一个最佳的模型
    • 估计误差: 测试集的误差, 模型对未知数据的预测能力比较强, 这个模型就接近于最佳模型
    • 估计误差小, 才是真的好!!!

1.5 kd树[☆☆]

  • 作用: 提高K近邻搜索的速度
  1. 树的建立;

    1. 选择向量的哪一维进行划分 ?
      • 方差大的维度来划分
    2. 如何划分数据?
      • 使用中位数划分左右子树, 小于分割线的左子树, 大于分割线就是右子树.
      • 如果中位数有两个, 就随机选一个.
    3. 树建立过程
    4. 把所有样本, 放到一个超矩形区域中
      1. 计算各个维度方差, 选择方差大的维度划分
      2. 计算这个维度中位数, 如果有两个中位数, 就随机选择一个;
      3. 小于分割线的点为左子树, 大于分割线为右子树
      4. 在左子树和右子树的样本中, 继续划分, 在剩余维度中选择一个方差比较大维度划分
      5. 直到所有的点都挂在树上了.
  2. 最近邻域搜索(Nearest-Neighbor Lookup)

    1. 根据查找点, 去KD树上查找, 如果查找维度 < 分割线去左子树查找, 大于分割线就去右子树查找-> 直到遇到叶子节点位置
    2. 把查找过程中经过点, 添加栈中
    3. 回溯, 元素出栈, 计算查找点 到这个元素的距离, 记录这个点为最近点, 这个距离为最近距离
    4. 元素继续出栈, 以查找点为圆心, 以最近距离为半径, 画圆, 如果圆和分割相交了, 说明分割线上或分割另外一侧, 可能存在更近点, 把分割线左侧的点压到栈中 , 如果不相交就说明这点, 已经是这个维度最近的点了
    5. 继续出栈, 重复3,4, 直到栈空了为止.

1.6 案例: 数据集介绍与划分

  1. 数据集介绍 [☆☆☆]

    • 获取数据集: sklearn.datasets
    1. 获取小数据集:
      • load_*()
      • 本地加载
    2. 获取大数据集:
      • fetch_*(subset=‘train’)
      • 第一次, 需要从网络上下载数据
    • subset: train训练集, test测试集, all(训练集+测试集)
    1. 返回值都是Bunch, 字典格式
      • 特征数据: data ☆
      • 目标数据: target ☆
      • 特征的名称: feature_names
      • 目标名称: target_names
      • 数据描述: DESCR
  2. 数据可视化

    • seaborn.lmplot(x, y, data, hue, fit_reg) : 用于绘制散点图, 观察数据的关系

      • x: 横轴的列名
      • y: 纵轴的列名
      • data: DataFrame的数据
      • hue: 类别名称
    • fit_reg: 是否线性拟合.

      from sklearn.datasets import load_iris
      import pandas as pd
      import
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值