KNN 算法学习

一、算法核心概念

K 近邻算法(KNN,k-Nearest Neighbor)是一种直观的分类方法,核心思路是:每个样本的类别可以由它周围最接近的 k 个样本的类别来决定。简单来说,就是 "物以类聚"------ 新数据的分类会参考它最相似的 k 个已知数据的类别。

二、算法步骤

  1. 计算距离:算出新数据与已知数据集中所有样本的 "相似程度"(距离)。
  2. 排序:按距离从近到远给这些已知样本排序。
  3. 选邻居:挑选距离最近的 k 个样本(k 通常不超过 20)。
  4. 看多数:统计这 k 个样本中最常见的类别。
  5. 定类别:把这个最常见的类别作为新数据的分类结果。

三、距离度量方式

  1. 欧式距离:最常用的距离计算方式,类似我们日常理解的 "直线距离"。比如在地图上两个点之间的直线距离,在多维数据中也是类似的逻辑,衡量两点之间的绝对远近距离。

  2. 曼哈顿距离:类似城市中出租车的行驶路线,只沿水平和垂直方向移动,计算的是两点在各个方向上的距离总和。比如从(x1,y1)到(x2,y2),距离是水平方向差与垂直方向差的和。

四、k 值的影响

  • k 值是人为设定的参数,不同的 k 值可能导致不同的分类结果。
  • 例如:当 k=3 时,会参考最近的 3 个样本,以这 3 个样本中最多的类别作为结果;当 k=5 时,则参考最近的 5 个样本。
  • 实际应用中,需要通过尝试不同 k 值找到最优解(比如交叉验证法)。

五、实践案例:鸢尾花分类

  1. 数据集加载 :通过iris = datasets.load_iris()加载鸢尾花数据集,包含三种鸢尾花的特征数据。

  2. 数据集信息

    • 特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度(均为厘米)。
    • 标签:iris.target(用数字代表三种鸢尾花类别)。
    • 特征名称:iris.feature_names(上述四个特征的具体名称)。
    • 类别名称:iris.target_names(三种鸢尾花的具体品种名称)。
  3. 数据划分 :用train_test_split将数据分为训练集(70%)和测试集(30%),分别用于模型训练和评估。

  4. 模型训练

    python 复制代码
    # 创建KNN模型实例,设置k=5,使用欧式距离
    knn = KNeighborsClassifier(n_neighbors=5, metric="euclidean")
    # 用训练集训练模型
    knn.fit(x_train, y_train)
  5. 模型评估

    • 训练集得分:knn.score(x_train, y_train)(模型在训练数据上的表现)。
    • 测试集得分:knn.score(x_test, y_test)(模型在新数据上的泛化能力)。
    • 预测结果:y_pred = knn.predict(x_test)(用模型预测测试集的类别)。

六、应用示例:电影分类

  1. 问题:根据电影中 "打斗镜头数量" 和 "接吻镜头数量",判断电影是 "爱情片" 还是 "动作片"。
  2. 已知数据:部分电影的两类镜头数量及对应的类型(如爱情片通常接吻镜头多、打斗镜头少;动作片则相反)。
  3. 分类方法:计算未知电影与已知电影的距离,找到最近的 k 部电影,以这些电影中最多的类型作为未知电影的类型(例如某未知电影的最近 3 部电影都是爱情片,则预测它为爱情片)。