zoukankan      html  css  js  c++  java
  • 【1】KNN(K-nearest neighbors algorithm)

    基本原理

    KNN算法又叫最近邻居法,是一种非常简单易于掌握的分类算法。
    其基本原理是,存在一个已知标签的数据集合,也就是训练样本集。
    这个样本集中的每一个数据所属的分类都是已知的。
    当一个没有标签的新数据需要确定自己属于哪个分类的时候,
    只需要把新数据的每个特征和训练集中的每个数据的特征进行比较,
    找出其中和新数据最相似(最近邻)的k个数据,
    算法取这k个数据中出现次数最多的标签作为新数据的类别。
    通常k不大于20。

    代码实现

    假如现在又四个已知点[1.01.1], [1.01.0], [00], [00.1],类别标签分别是A、A、B、B
    如果给定一个新的点[0, 0],那么怎么判断它属于A还是B呢?
    按照KNN算法原理,需要执行以下操作:
    计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离)
    1. 计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离)
    2. 按照距离递增次序对各点排序
    3. 选取与当前点距离最小的k个点
    4. 确定前k个点所在类别的出现频率
    5. 返回前k个点出现频率最高的类别,即为分类结果。

    以下代码实现了KNN算法的分类过程
    1. # 创建训练数据集
    2. def creatDataSet():
    3. group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    4. labels = ['A', 'A', 'B', 'B']
    5. return group, labels
    6. # ========================================
    7. # inX:输入待分类向量
    8. # dataSet:输入的训练样本集
    9. # labels:标签向量
    10. # k:用于选择最近邻居的数目
    11. # 分类器得出类别标签然后返回
    12. # =========================================
    13. def classify0 (inX, dataSet, labels, k):
    14. # shape返回表示行列数的元组,shape[0]获得行数
    15. dataSetSize = dataSet.shape[0]
    16. # 以inX为元素重复(dataSetSize, 1)次构成新的数组
    17. diffMat = tile(inX, (dataSetSize, 1))-dataSet
    18. sqDiffMat = diffMat**2
    19. # 矩阵行元素相加(如果axis = 0的话表示列相加)
    20. sqDistance = sqDiffMat.sum(axis = 1)
    21. distances = sqDistance**0.5
    22. # argsort()得到排序后原来位置的下标
    23. sortedDisIndicies = distances.argsort()
    24. classCount = {}
    25. for i in range(k):
    26. voteIlabel = labels[sortedDisIndicies[i]]
    27. classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    28. sortedClassCount = sorted(classCount.iteritems(),
    29. # 构造函数key,获取对象的第1个域的值
    30. key = operator.itemgetter(1),
    31. # 升序排列
    32. reverse = True)
    33. # 返回分类器得出类别标签
    34. return sortedClassCount[0][0]

    如果把上面问题中的待测试点[0, 0]和训练集生成函数的返回值group和labels作为参数输入分类器,选择k=3
    即:
    1. classify0 ([0, 0], group, labels, 3):
    会得到其标签为B

    这就完成了一个基于KNN分类算法的简单分类器。
    当然,在现实中的应用场景的复杂程度比这个例子大多了
    保持傻,保持饿
  • 相关阅读:
    .NET Core 使用Dapper 操作MySQL
    .NET Core HtmlAgilityPack HTML解析利器
    ASP.NET Core 开发-缓存(Caching)
    .NET Core 调用WCF 服务
    ASP.NET Core 开发-Logging 使用NLog 写日志文件
    Qt动态生成界面并通过拉姆达获取其返回值
    Qt启动C++线程并在线程中修改界面
    Vector求最大值最小值
    C/C++取消结构体字节对齐
    Matlab定时器
  • 原文地址:https://www.cnblogs.com/mooba/p/5412553.html
Copyright © 2011-2022 走看看