K-近邻算法又称KNN算法(K-Nearest Neighbors),既可以用来解决分类问题,也可以用来解决回归问题。
如标题所言,KNN算法的核心原理就是让距离最近的“邻居们”来帮忙投票,邻居们决定预测对象的分类或者取值。
假设我们有一个已经标记好的数据集,我们知道这个数据集中每个样本的类别(标记),现在有一个新的样本,我们不知道它的分类(标记)是什么,我们的任务就是预测它所属的分类。按照KNN的方法,我们要计算这个新样本到数据集中每个样本的距离,并按照距离逆序排列,取前K个样本的分类,以多数战胜少数的原则来决定新样本的分类。
当分类只有两个的时候,这个K值一般会选择一个单数,这样就不会出现两个分类投票数量相等的情况。但是当有多个分类时,很可能会出现多个分类等票的情况。
一个很常见的处理是减小K的值,直到最终只有1个分类胜出;使用这种方法时,如果最后有两个或者多个邻居与新样本的距离相等,那我们可以随机选择一个样本,或者通过别的策略从其中抽取一个。
另一个常用的处理方法是根据距离做一个加权,比如A点距离测试样本1厘米,B点距离测试样本2厘米,那么我认为A点的投票更重要,我就可以给他更大的权重;
KNN算法有很多优点,比如可解释性非常强、精度高、对异常值不敏感、没有数据输入假设(有一些模型要求数据符合特定的分布,或者属于特定的数据类型),原理也很简单,但它也存在一些问题。
它最大的问题就是需要大量的计算。对于每个待预测的样本,都要计算它和所有已知样本之间的距离,这会消耗大量的计算资源。因此它适合在探索初期做一个基准模型,或者是在小数据样本量时使用。
一、scikit-learn实战:鸢尾花数据集
我们先使用scikit-learn提供的分类器来看一下如何使用KNN分类模型。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasets
# 设定邻居数量
n_neighbors = 15
# 鸢尾花数据集
iris = datasets.load_iris()
# 使用数据集的前两列
X = iris.data[:, :2]
y = iris.target
# step size
h = 0.02
# color map
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '