zoukankan      html  css  js  c++  java
  • KNN

    一、 k-近邻法

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

    粗暴性KNN实现:

     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树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

  • 相关阅读:
    man LVCREATE
    Pyhton---基础---递归
    Python---基础---循环,函数
    Python---基础---dict_tuple_set
    Python---基础---dict和set2
    安卓网络编程学习(1)——java原生网络编程(1)
    使用python爬取B站弹幕和三连
    maven项目整合工具学习
    读阿里巴巴泰山版《java开发手册》总结(2)
    第十三周学习进度
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/9948863.html
Copyright © 2011-2022 走看看