# KNN算法

KNN算法的输入基于对实例的学习,或称作懒惰学习(Lazy Learning),在处理训练集的时候没有建立模型,在开始归类的时候,根据之前的比较再进行归类。

# 例子

电影名称 打斗场景数 结婚场景数 电影类型
a 20 77 爱情片
b 12 55 爱情片
c 90 21 动作片
d 13 88 爱情片
未知 76 12 未知

根据之前的实例,对未知的电影进行归类。

对于这个问题,可以简化为以下的数学模型。

x坐标 y坐标 点类型
a 20 77 爱情片
b 12 55 爱情片
c 90 21 动作片
d 13 88 爱情片
e 76 12 未知

# 算法描述

  • 算法步骤
  1. 为了判断未知实例的类型,用已知类别的实例作为参考
  2. 选择一个参数K(K代表选取这个未知类型最近的K个元素)
  3. 计算所有点到未知点的距离
  4. 在所有距离中,选择出K个最近的距离
  5. 根据少数服从多数的法则,让未知实例的类型是K个中实例最多的那个类型
  • 算法的细节
  1. 对于距离,有很多种定义方式,比如最普遍的欧式距离(两点之间的直线距离)、曼哈顿距离、相关度等等。

# 优缺点及改进

# 优点

简单、易于理解、容易实现、可以选择不同的K值增强算法的健壮性。

# 缺点

  • 需要大量的空间去存储已知实例的距离
  • 算法的复杂度高
  • 当某一类的样本数过多的时候,未知实例容易被归为样本多的那个类别。

# 改进

优化距离,距离加上一个权重,比如权重 = 1/距离