一、算法核心概念
K 近邻算法(KNN,k-Nearest Neighbor)是一种直观的分类方法,核心思路是:每个样本的类别可以由它周围最接近的 k 个样本的类别来决定。简单来说,就是 "物以类聚"------ 新数据的分类会参考它最相似的 k 个已知数据的类别。
二、算法步骤
- 计算距离:算出新数据与已知数据集中所有样本的 "相似程度"(距离)。
- 排序:按距离从近到远给这些已知样本排序。
- 选邻居:挑选距离最近的 k 个样本(k 通常不超过 20)。
- 看多数:统计这 k 个样本中最常见的类别。
- 定类别:把这个最常见的类别作为新数据的分类结果。
三、距离度量方式
-
欧式距离:最常用的距离计算方式,类似我们日常理解的 "直线距离"。比如在地图上两个点之间的直线距离,在多维数据中也是类似的逻辑,衡量两点之间的绝对远近距离。
-
曼哈顿距离:类似城市中出租车的行驶路线,只沿水平和垂直方向移动,计算的是两点在各个方向上的距离总和。比如从(x1,y1)到(x2,y2),距离是水平方向差与垂直方向差的和。
四、k 值的影响
- k 值是人为设定的参数,不同的 k 值可能导致不同的分类结果。
- 例如:当 k=3 时,会参考最近的 3 个样本,以这 3 个样本中最多的类别作为结果;当 k=5 时,则参考最近的 5 个样本。
- 实际应用中,需要通过尝试不同 k 值找到最优解(比如交叉验证法)。
五、实践案例:鸢尾花分类
-
数据集加载 :通过
iris = datasets.load_iris()
加载鸢尾花数据集,包含三种鸢尾花的特征数据。 -
数据集信息 :
- 特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度(均为厘米)。
- 标签:
iris.target
(用数字代表三种鸢尾花类别)。 - 特征名称:
iris.feature_names
(上述四个特征的具体名称)。 - 类别名称:
iris.target_names
(三种鸢尾花的具体品种名称)。
-
数据划分 :用
train_test_split
将数据分为训练集(70%)和测试集(30%),分别用于模型训练和评估。 -
模型训练 :
python# 创建KNN模型实例,设置k=5,使用欧式距离 knn = KNeighborsClassifier(n_neighbors=5, metric="euclidean") # 用训练集训练模型 knn.fit(x_train, y_train)
-
模型评估 :
- 训练集得分:
knn.score(x_train, y_train)
(模型在训练数据上的表现)。 - 测试集得分:
knn.score(x_test, y_test)
(模型在新数据上的泛化能力)。 - 预测结果:
y_pred = knn.predict(x_test)
(用模型预测测试集的类别)。
- 训练集得分:
六、应用示例:电影分类
- 问题:根据电影中 "打斗镜头数量" 和 "接吻镜头数量",判断电影是 "爱情片" 还是 "动作片"。
- 已知数据:部分电影的两类镜头数量及对应的类型(如爱情片通常接吻镜头多、打斗镜头少;动作片则相反)。
- 分类方法:计算未知电影与已知电影的距离,找到最近的 k 部电影,以这些电影中最多的类型作为未知电影的类型(例如某未知电影的最近 3 部电影都是爱情片,则预测它为爱情片)。