KNN(K-Nearest Neighbor)——k近邻算法

  • skearn_learn 代码实现

 建模+预测:

from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train,y_train)
y_predict = knn_clf.predict(X_test)

 评价模型:准确率

knn_clf.score(X_test)

 

  • 相关概念

 1.近邻法是基本且简单的分类与回归方法。近邻法的基本做法是:对给定的训练实例点和输入实例点,首         先确定输入实例点的个最近邻训练实例点,然后利用这个训练实例点的类的多数来预测输入实例点的类。

2.近邻模型对应于基于训练数据集对特征空间的一个划分。近邻法中,当训练集、距离度量、值及分类决策规则确定后,其结果唯一确定。

 3.近邻法三要素:距离度量、值的选择和分类决策规则。常用的距离度量是欧氏距离及更一般的pL距离。值小时,近邻模型更复杂,预测结果对实例点非常敏感,过拟合;值大时,近邻模型更简单,学习误差小,近似误差大。值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的。常用的分类决策规则是多数表决,对应于经验风险最小化。

4.近邻法的实现需要考虑如何快速搜索 k 个最近邻点。kd树是一种便于对 k 维空间中的数据进行快速检索的数据结构。kd 树是二叉树,表示对维空间的一个划分,其每个结点对应于维空间划分中的一个超矩形区域。利用kd树可以省去对大部分数据点的搜索, 从而减少搜索的计算量。

 

  • 距离度量

KNN(K-Nearest Neighbor)——k近邻算法_第1张图片

 

  • 调库   Scikit-learn 实例

from sklearn.neighbors import KNeighborsClassifier

clf_sk = KNeighborsClassifier()

clf_sk.fit(X_train, y_train)

clf_sk.score(X_test, y_test)

  • kd 树

kd树是一种对 k 维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。

kd树是二叉树,表示对维空间的一个划分(partition)。构造kd树相当于不断地用垂直于坐标轴的超平面将维空间切分,构成一系列的 k 维超矩形区域。kd 树的每个结点对应于一个维超矩形区域。

构造kd树的方法如下:

构造根结点,使根结点对应于维空间中包含所有实例点的超矩形区域;通过下面的递归方法,不断地对维空间进行切分,生成子结点。在超矩形区域(结点)上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域 (子结点);这时,实例被分到两个子区域。这个过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。

通常,依次选择坐标轴对空间切分,选择训练实例点在选定坐标轴上的中位数 (median)为切分点,这样得到的kd树是平衡的。注意,平衡的kd树搜索时的效率未必是最优的。

  • 构造平衡 kd 树算法

输入:维空间数据集=,,

其中 ,=;

输出:kd树。

(1)开始:构造根结点,根结点对应于包含的维空间的超矩形区域。

选择为坐标轴,以 T 中所有实例的坐标的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴垂直的超平面实现。

由根结点生成深度为 1 的左、右子结点:左子结点对应坐标小于切分点的子区域, 右子结点对应于坐标大于切分点的子区域。

将落在切分超平面上的实例点保存在根结点。

(2)重复:对深度为的结点,选择为切分的坐标轴,=,以该结点的区域中所有实例的坐标的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴垂直的超平面实现。

由该结点生成深度为的左、右子结点:左子结点对应坐标小于切分点的子区域,右子结点对应坐标大于切分点的子区域。

将落在切分超平面上的实例点保存在该结点。

(3)直到两个子区域没有实例存在时停止。从而形成kd树的区域划分。

  •  

你可能感兴趣的:(KNN(K-Nearest Neighbor)——k近邻算法)