三、KNN与决策边界
KNN 与决策边界
KNN -- 经典的机器学习算法,基于距离
决策边界 -- 在一些分类算法(比如:两类)中一个可视化的(这两类的)一个边界点
(一)KNN 算法
1. 定义
K近邻法(K-Nearest Neighbor,KNN)算法是一种基于实例的学习,通过测量不同数据点之间的距离进行分类或回归分析
根据距离其“最近的邻居”来推断出其类别
2. 原理 -- “近朱者赤”
基于实例的学习(instance-based learning),属于懒惰学习(lazy learning),即 KNN 没有显式的学习过程,也就是说没有训练阶段,它是通过测量不同数据点之间的距离进行分类或回归分析
3. 特点
KNN算法简单易懂,易于实现- 无需训练阶段,直接进行分类或回归
- 适用于多分类问题
- 对数据集的大小和维度不敏感
(二)决策边界
1. 定义
决策边界是分类算法中用于区分不同类别的虚拟边界,即上一章节所指出的“房间”
2. 边界效果
决策边界是否合理,直接影响到分类效果的好坏
3. KNN与决策边界
KNN算法通过计算待分类样本与已知样本之间的距离,找到最近的k个样本,并根据这些样本的类别信息进行投票,以确定待分类样本的类别
(三)KNN 的决策边界计算
1. 步骤
计算待分类的点(新的点)与已知点的距离
取出距离最近的点,找到新的点与哪一类更接近,观察分类结果
2. 新的点
在预测过程中:新的点就是某一个真实的二维坐标的点
在绘制决策边界时:新的点是二维坐标中所有的点(为了使其可计算,每隔距离x取一个点
3. 如何更加准确的用距离分类
K近邻法(K-Nearest Neighbor,KNN):
计算新的点(测试点)到每一个已知点(标签点)的距离,并比对距离,不能只寻找最近的1个标签点作为测试点的标签
KNN 最简单的思想是:
找到与预测数据最相近的 K 个数据,然后对预测数据进行投票,票数最高的标签作为预测数据的标签。当 k=1 时,K 近邻算法就变成了近邻算法
4. 结论
(1)K值选择太小
优点:复杂的数据集,K值较小可能会提供更详细的决策边界,因为模型更加灵活
缺点:容易受到局部结构的影响,模型对噪声和异常值的影响更大
(2)K值选择太大
优点:考虑了更多的全局信息,对于平滑的数据集,较大的K值可以提供更稳定的决策边界
缺点:对于复杂的数据集,较大的K值可能会导致模型过于简单,无法准确捕获数据的局部特征
(3)K叫什么
在KNN中,需要人为选择不同的K的不同取值,这个参数是需要人为选择的。需要人为确定的参数称为超参数(hyperparameter)
5. 交叉验证
准备数据集
准备好包含特征和标签的数据集
==》 K折交叉验证
确定K的值,例如选择 5 或 7 作为K值
==》 划分数据集
将数据集划分为 K 个大小相似的子集
==》 循环训练和评估
使用 K-1 个子集作为训练集,剩余的 1 个子集作为测试集
在训练集上训练KNN模型。使用训练好的模型对测试集进行预测
使用性能指标评估
==》 计算平均性能
将K次验证的性能指标取平均值,作为KNN模型的最终性能评估
==》 选择最佳K值
可以尝试不同的K值,并通过交叉验证选择性能最好的K值
然后选择在交叉验证中表现最佳的K值
==》 选定最终的K值
使用选择的最佳K值,在整个训练集上重新训练KNN模型,以获得最终的模型
(四)距离方案
1. 曼哈顿距离 -- L1距离
L1 距离公式为:
2. 欧式距离 -- L2距离
L2 距离公式为:
(五)代码实现
# 导入必须的库
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import matplotlib.pyplot as plt
# 1. 定义数据集 -- 来源:人为定义、sklearn库等等
# 定义三个点集
point1 = [[7.7,6.1],[3.1,5.9],[8.6,8.8],[9.5,7.3],[3.9,7.4],[5,5.3],[1,7.3]]
point2 = [[0.2,2.2],[4.5,4.1],[0.5,1.1],[2.7,3],[4.7,0.2],[2.9,3.3],[7.3,7.9]]
point3 = [[9.2,0.7],[9.2,2.1],[7.3,4.5],[8.9,2.9],[9.5,3.7],[7.7,3.7],[9.4,2.4]]
# 点集特征的合并
np_train_data = np.concatenate([point1,point2,point3])
# print(np_train_data)
# 根据输入的数据创建标签
np_train_label = np.array([0] * len(point1) + [1] * len(point2) + [2] * len(point3))
# print(np_train_label)
# 2. 构建 KNN 网络,实例化 KNN 算法,使用 KNN 进行训练
"""
KNN 没有训练,是基于实例的,懒惰的算法
那么为什么又说【使用 KNN 进行训练】呢?
因为 SKlearn 库需要将数据集中已知的点放到内存当中,这个赋值的操作被称为训练
还因为 SKlearn 中依然用的 fit 这个单词
"""
# 初始化 K 近邻分类器
knn_clf = KNeighborsClassifier(3)
# 训练
knn_clf.fit(np_train_data,np_train_label)
# 3. 决策边界,设定未知点【每隔 x 的距离取一个点】,设置坐标点网络
# 定义坐标轴的范围
axis = [0, 10, 0, 10]
# 生成坐标点网络
x0, x1 = np.meshgrid(
np.linspace(axis[0],axis[1],100), # x 轴上均匀的点
np.linspace(axis[2],axis[3],100) # y 轴上均匀的点
)
# print(x0,"\n\n",x1)
axis_xy = np.c_[x0.ravel(), x1.ravel()]
# print(axis_xy)
# 4. KNN 的预测与绘制决策边界
# 预测
y_predict = knn_clf.predict(axis_xy)
y_predict = y_predict.reshape(x0.shape)
# 等高线的绘制
plt.contourf(x0,x1,y_predict)
# 绘制原始散点
plt.scatter(np_train_data[np_train_label==0,0],np_train_data[np_train_label==0,1],marker="^")
plt.scatter(np_train_data[np_train_label==1,0],np_train_data[np_train_label==1,1],marker="*")
plt.scatter(np_train_data[np_train_label==2,0],np_train_data[np_train_label==2,1],marker="s")
# 绘制图形
plt.show()
本文来自博客园,作者:桑年,转载请注明原文链接:https://www.cnblogs.com/clover-1105/p/23537295

浙公网安备 33010602011771号