简介
K-近邻(K-Nearest Neighbors, KNN)是一个非常简单的机器学习算法,很多机器学习算法书籍都喜欢将该算法作为入门的算法作为介绍。
KNN分类问题是找出一个数据集中与给定查询数据点最近的K个数据点。这个操作也成为KNN连接(KNN-join)。可以定义为:给定两个数据集R合S,对R中的每一个对象,我们希望从S中找出K个最近的相邻对象。
在数据挖掘中,R和S分别称为查询和训练(traning)数据集。训练数据集S表示已经分类的数据,而查询数据集R表示利用S中的分类来进行分类的数据。
KNN是一个比较重要的聚类算法,在数据挖掘(图像识别)、生物信息(如乳腺癌诊断)、天气数据生成模型和商品推荐系统中有很多应用。
缺点:开销大。特别是有一个庞大的训练集时。正是这个原因,使用MapReduce运行该算法显得非常的有用。
1、KNN算法
1.1、KNN分类
KNN的中心思想是建立一个分类方法,使得对于将y(响应变量)与x(预测变量)关联的平滑函数f的形式映射。假设:
y = f ( x ) , x = ( x 1 , x 2 , . . . , x n ) y = f(x),x = (x_{1},x_{2},...,x_{n}) y=f(x),x=(x1,x2,...,xn)
函数f是非参数化的,因为它不涉及任何形式的参数估计。在KNN中,给定一个新的点 p = ( p 1 , p 2 , . . . , p n ) p=(p_{1},p_{2},...,p_{n}) p=(p1,p2,...,pn),要动态的识别训练集数据集中与p相似的K个观察(k个近邻)。近邻由一个距离或相似度来定义。可以根据独立变量计算不同观察之间的距离,我们采用欧氏距离进行计算:
( x 1 − p 1 ) 2 + ( x 2 − p 2 ) 2 + . . . + ( x n − p n ) 2 \sqrt{(x_{1} - p_{1})^2 + (x_{2} - p_{2})^2 + ... + (x_{n}-p_{n})^2} (x1−p1)2+(x2−p2)2+...+(xn−pn)2
关于距离的算法以及种类有很多,本章节我们采用欧氏距离,即坐标系距离计算方法。
那么如何找出k个近邻呢?
我们先计算出欧氏距离的集合,然后将这个查询对象分配到k个最近训练数据中大多数对象所在的类。
1.2、距离函数
假设有两个n维对象:
X = ( X 1 , X 2 , . . . , X n ) X = (X_{1},X_{2},...,X_{n}) X=(X1,X2,...,Xn)
Y = ( Y 1 , Y 2 , . . . , Y n ) Y = (Y_{1},Y_{2},...,Y_{n}) Y=(Y1