1. KNN
1.1.K-近邻算法简介[*]
- 定义: 一个样本在特征空间中K个最相似(距离最小)的样本中, 大多数属于那个类别, 这个属于那个类别
- 距离: 一般使用就是欧式距离: 各个维度的差值平方和开根号
- K值: 最相似的样本数量.
1.2 k近邻算法api初步使用[☆☆☆]
- Scikit-learn工具安装:
- pip3 install scikit-learn==0.19.1
- api :
- sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
- n_neighbors: k值, 最近邻居数量
- 注意: K近邻是一种惰性算法.
1.3 距离度量[☆☆]
- 欧式距离:
- 各个维度差值的平方和开根号
- 曼哈顿距离(城市街区距离)
- 各个维度差值的绝对值的和
- 切比雪夫距离(国王最少移动的步数):
- 各个维度差值的绝对值的最大值
- 闵可夫斯基距离:
- 当p=1时, 是曼哈顿距离
- 当p=2时, 是欧式距离
- 当p->∞时, 是切比雪夫距离
- 是一个距离综合表现形式
- 总结: 前面的四个距离, 都没有做无量纲化处理
- 所有特征都同等单位看待了
- 没有考虑各个特征的均值和方差.
- 标准化欧氏距离
- 解决: 统一各个维度量纲(单位), 相当于把各个维度调整到了均值为0, 方差为1的分布中了.
- 公式: 各个维度差值除以这个维度的标准差, 再平方求和, 开根号.
- 余弦距离:
- 公式: 两个向量内积除以两个向量模的乘积
- 意义: 范围是[-1, 1], 这个值大于>0表示正相关, 小于0表示负相关, 等于0不相关. 这个值的绝对越接近与1, 相关性就越高, 越接近于0, 相关性越低.
- 汉明距离(Hamming Distance)【了解】
- 两个等长的字符串, 一个替换为另外一个, 最少需要替换的次数.
- 杰卡德距离(Jaccard Distance)【了解】
- 杰卡德相似系数: 两个集合交集的数量/ 两个集合并集的数量.
- 杰卡德距离:( 两个集合并集数量-交集数量) /两个集合并集的数量.
- 公式: 杰卡德距离 = 1 - 杰卡德相似系数
- 意义: 杰卡德距离越小就越相似, 越大就越不相似.
- 马氏距离(Mahalanobis Distance)【了解】
- 基于样本分布一种距离.
1.4 k值的选择[☆☆☆]
-
K值过小:
- 容易受到异常点影响
- K过小, 相当于模型变复杂了, 可能会产生过拟合
-
k值过大:
- 容易受到样本均衡的影响
- K过大, 相当于模型变简单了, 可会产生欠拟合.
-
实际中: 一般会选择一个比较小的K值, 需要通过网格搜索和交叉验证来选择一个合适参数.
-
扩展:
- 近似误差: 训练集的误差, 训练集误差小, 但是测试集上误差可能会比较大, 这个模型就不是一个最佳的模型
- 估计误差: 测试集的误差, 模型对未知数据的预测能力比较强, 这个模型就接近于最佳模型
- 估计误差小, 才是真的好!!!
1.5 kd树[☆☆]
- 作用: 提高K近邻搜索的速度
-
树的建立;
- 选择向量的哪一维进行划分 ?
- 方差大的维度来划分
- 如何划分数据?
- 使用中位数划分左右子树, 小于分割线的左子树, 大于分割线就是右子树.
- 如果中位数有两个, 就随机选一个.
- 树建立过程
- 把所有样本, 放到一个超矩形区域中
- 计算各个维度方差, 选择方差大的维度划分
- 计算这个维度中位数, 如果有两个中位数, 就随机选择一个;
- 小于分割线的点为左子树, 大于分割线为右子树
- 在左子树和右子树的样本中, 继续划分, 在剩余维度中选择一个方差比较大维度划分
- 直到所有的点都挂在树上了.
- 选择向量的哪一维进行划分 ?
-
最近邻域搜索(Nearest-Neighbor Lookup)
- 根据查找点, 去KD树上查找, 如果查找维度 < 分割线去左子树查找, 大于分割线就去右子树查找-> 直到遇到叶子节点位置
- 把查找过程中经过点, 添加栈中
- 回溯, 元素出栈, 计算查找点 到这个元素的距离, 记录这个点为最近点, 这个距离为最近距离
- 元素继续出栈, 以查找点为圆心, 以最近距离为半径, 画圆, 如果圆和分割相交了, 说明分割线上或分割另外一侧, 可能存在更近点, 把分割线左侧的点压到栈中 , 如果不相交就说明这点, 已经是这个维度最近的点了
- 继续出栈, 重复3,4, 直到栈空了为止.
1.6 案例: 数据集介绍与划分
-
数据集介绍 [☆☆☆]
- 获取数据集: sklearn.datasets
- 获取小数据集:
- load_*()
- 本地加载
- 获取大数据集:
- fetch_*(subset=‘train’)
- 第一次, 需要从网络上下载数据
- subset: train训练集, test测试集, all(训练集+测试集)
- 返回值都是Bunch, 字典格式
- 特征数据: data ☆
- 目标数据: target ☆
- 特征的名称: feature_names
- 目标名称: target_names
- 数据描述: DESCR
-
数据可视化
-
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
-