K紧邻
-
通俗的讲: 就是通过你的邻居来判断你是那个类别的
-
通过距离来计算 一般是欧氏距离
- sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
- n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
- sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
-
sklearn的优势:
- 文档多,且规范
- 包含的算法多
- 实现起来容易
-
各种距离公式(主要)
- 欧氏距离 (就是两点之间的距离)
- 曼哈顿距离 (两点之间的实际距离)
-
切比雪夫距离 (取同一维度距离的最大值)
-
闵可夫斯基距离(一组距离的定义,对多个距离度量公式的概括性表述)
其中p是一个变参数:
当p=1时,就是曼哈顿距离;
当p=2时,就是欧氏距离;
当p→∞时,就是切比雪夫距离。
根据p的不同,闵氏距离可以表示某一类/种的距离。
小结:
1 闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点:
e.g. 二维样本(身高[单位:cm],体重[单位:kg]),现有三个样本:a(180,50),b(190,50),c(180,60)。
a与b的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c的闵氏距离。但实际上身高的10cm并不能和体重的10kg划等号。
2 闵氏距离的缺点:
(1)将各个分量的量纲(scale),也就是“单位”相同的看待了; (2)未考虑各个分量的分布(期望,方差等)可能是不同的。
-
标准化欧式距离(针对欧氏距离的缺点而改进)
既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。
Sk表示各个维度的标准差
6. 余弦距离(可以衡量样本的差异 取值[1,-1] -1说明两个样本差异最大)- 二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式
-
两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦为
即:
-
汉明距离(Hamming Distance):
- 一个字符串到另一个字符串需要变换几个字母,进行统计
-
杰卡德距离(Jaccard Distance):
- 通过交并集进行统计
-
马氏距离(Mahalanobis Distance)
- 通过样本分布进行计算
-
K值的选择
就是邻居的个数选择
- 小了 会受到异常点影响 容易过拟合
- 大了 受到样本均衡的影响 容易欠拟合
-
KD树 数据量大了,我们该如何对我们训练的数据进行快速的查询
KD树中的每个节点都是一个向量
二叉树是直接折中 再折中取筛选 KD则是每一次都要选中向量的某一维度来划分
- 1.二叉树搜索比较待查询节点和分裂节点的分裂维的值,(小于等于就进入左子树分支,大于就进入右子树分支直到叶子结点)
- 2.顺着“搜索路径”找到最近邻的近似点
- 3.回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索
- 4.重复这个过程直到搜索路径为空
-
特征工程
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
-
特征预处理
-
归一化(对原始数据进行变换把数据映射到[0, 1]之间)
容易受到异常值的影响 例如有的点很大的数据
适合精确小数据场景
-
标准化(对原始数据进行变换把数据变换到均值为0,标准查为1)
异常值的影响小
适合嘈杂的大数据场景
-
-
-
K紧邻算法的总结
- 有点:
- 简单有效
- 重新训练的代价地
- 适合类域交叉样本
- 因为K紧邻算法主要靠周围的邻近样本,所以遇到类域的交叉或者重叠较多的样本来说, K紧邻算法更合适
- 适合大样本自动分类
- K紧邻适合一些样本容量大的类域自动分类,样本量小的会产生误分
- 缺点:
- 惰性学习 所以比一些积极的算法慢很多
- 类别评分不是规格化
- 不像一些通过概率的分类
- 输出解释性不强
- 对不均衡的样本不擅长
- 对大样本可以使用,但是一些小样本就会出现误分
- 计算量大
- 目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本
- 有点:
-
交叉验证
把寻来你数据又分成训练集和验证集
目的:为了被评估的模型更加准确可信