KNN

Posted geoffreyone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KNN相关的知识,希望对你有一定的参考价值。

一、 k-近邻法

选择未知样本一定范围内确定个数的K个样本,该K个样本大多数属于某一类型,则未知样本判定为该类型。

粗暴性RNN实现:

 1 #!/usr/bin/env python
 2 # encoding: utf-8
 3 
 4 """
 5 @version: python37
 6 @author: Geoffrey
 7 @file: KNN.py
 8 @time: 18-11-12 下午2:53
 9 """
10 
11 ‘‘‘
12 需求:使用KNN预测分类
13 样本集:
14 1,  1,  a
15 1,  2,  a
16 1.5,1.5,a
17 3,  4,  b
18 4,  4,  b
19 预测数据:
20 2, 2
21 ‘‘‘
22 
23 import numpy as np
24 import pandas as pd
25 import matplotlib.pyplot as plt
26 # import matplotlib.font_manager as fm
27 
28 # 计算距离函数
29 def Minkowski_distication(data, point, m=2):
30     num, dim = data.shape
31     result = 0
32     if len(point) == dim:
33         for i in range(dim):
34             result += ((abs(data[i] - point[i])) ** m)
35         return result ** (1 / m)
36 
37 # KNN分类
38 def KNN_classify(data, distance, k):
39     index = np.argsort(distance, axis=0)
40     data[distance]  =  index
41     data = data.sort_values(distance).head(k)[2]
42 
43     return data.value_counts().head(1).index
44 
45 if __name__ == __main__:
46     sample = [
47         [1, 1, a],
48         [1, 2, a],
49         [1.5, 1.5, a],
50         [3, 4, b],
51         [4, 4, b],
52     ]
53     df_sample = pd.DataFrame(sample)
54     point = (2, 2)
55 
56     distance = Minkowski_distication(df_sample.drop(2, axis=1), point=point)
57     result = KNN_classify(df_sample, distance, k=4)
58 
59     # 绘图
60     fig = plt.figure()
61     plt.scatter(df_sample[0], df_sample[1])
62     plt.scatter(*point, color=red)
63     plt.show()

适用情况:

1) 样本容量比较大,切各个分类数量差异不大;

2) 类域重叠交叉较多;

缺点:

1)需要存储全部的训练样本,耗内存

2)  计算量较大

3)样本数量少或者各个种类数量不均衡,对稀有种类的预测性能差

 

二、 KD树

kd树(K-dimension tree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是是一种二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分,构成一系列的K维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

技术分享图片

以上是关于KNN的主要内容,如果未能解决你的问题,请参考以下文章

knn的python代码

(理论和代码相结合)KNN(最近邻)算法⭐

Python机器学习(十六)KNN原理与代码实现

如何将此 KNN 代码应用于我的数据集?

KNN算法的代码实现

KNN算法的实现