Python机器学习k-近邻算法(K Nearest Neighbor)实例详解

作者:Eric Chan 时间:2023-07-12 10:50:17 

本文实例讲述了Python机器学习k-近邻算法。分享给大家供大家参考,具体如下:

工作原理

存在一份训练样本集,并且每个样本都有属于自己的标签,即我们知道每个样本集中所属于的类别。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后提取样本集中与之最相近的k个样本。观察并统计这k个样本的标签,选择数量最大的标签作为这个新数据的标签。

用以下这幅图可以很好的解释kNN算法:

Python机器学习k-近邻算法(K Nearest Neighbor)实例详解

不同形状的点,为不同标签的点。其中绿色点为未知标签的数据点。现在要对绿色点进行预测。由图不难得出:

  • 如果k=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形。

  • 如果k=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形。

kNN算法实施

伪代码

对未知属性的数据集中的每个点执行以下操作

1. 计算已知类型类别数据集中的点与当前点之间的距离
2. 按照距离递增次序排序
3. 选取与当前点距离最小的k个点
4. 确定前k个点所在类别的出现频率
5. 返回前k个点出现频率最高的类别作为当前点的预测分类

欧式距离(计算两点之间的距离公式)

计算点x与点y之间欧式距离

Python机器学习k-近邻算法(K Nearest Neighbor)实例详解

python代码实现


# -*- coding:utf-8 -*-
#! python2
import numpy as np
import operator
# 训练集
data_set = np.array([[1., 1.1],
          [1.0, 1.0],
          [0., 0.],
          [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
def classify_knn(in_vector, training_data, training_label, k):
 """
 :param in_vector: 待分类向量
 :param training_data: 训练集向量
 :param training_label: 训练集标签
 :param k: 选择最近邻居的数目
 :return: 分类器对 in_vector 分类的类别
 """
 data_size = training_data.shape[0] # .shape[0] 返回二维数组的行数
 diff_mat = np.tile(in_vector, (data_size, 1)) - data_set # np.tile(array, (3, 2)) 对 array 进行 3×2 扩展为二维数组
 sq_diff_mat = diff_mat ** 2
 sq_distances = sq_diff_mat.sum(axis=1) # .sum(axis=1) 矩阵以列求和
 # distances = sq_distances ** 0.5 # 主要是通过比较求最近点,所以没有必要求平方根
 distances_sorted_index = sq_distances.argsort() # .argsort() 对array进行排序 返回排序后对应的索引
 class_count_dict = {} # 用于统计类别的个数
 for i in range(k):
   label = training_label[distances_sorted_index[i]]
   try:
     class_count_dict[label] += 1
   except KeyError:
     class_count_dict[label] = 1
 class_count_dict = sorted(class_count_dict.iteritems(), key=operator.itemgetter(1), reverse=True) # 根据字典的value值对字典进行逆序排序
 return class_count_dict[0][0]
if __name__ == '__main__':
 vector = [0, 0] # 待分类数据集
 print classify_knn(in_vector=vector, training_data=data_set, training_label=labels, k=3)

运行结果:B

算法评价

  • 优点:精度高、对异常值不敏感、无数据输入假定

  • 缺点:计算复杂度高、空间复杂度高

  • 使用数据范围:数据型和标称型

  • 适用:kNN方法通常用于一个更复杂分类算法的一部分。例如,我们可以用它的估计值做为一个对象的特征。有时候,一个简单的kNN算法在良好选择的特征上会有很出色的表现。

希望本文所述对大家Python程序设计有所帮助。

来源:http://hareric.com/2016/04/29/k-%E8%BF%91%E9%82%BB%E7%AE%97%E6%B3%95(K%20Nearest%20Neighbor)/

标签:Python,机器学习,k-近邻算法
0
投稿

猜你喜欢

  • 解决tensorflow/keras时出现数组维度不匹配问题

    2023-01-01 04:16:24
  • golang爬虫colly 发送post请求

    2024-02-05 09:35:03
  • mint-ui在vue中的使用示例

    2023-07-02 16:52:17
  • 详解在SpringBoot如何优雅的使用多线程

    2021-07-27 13:02:39
  • 讲解如何利用 Python完成 Saga 分布式事务

    2021-08-19 00:03:48
  • Python3读取zip文件信息的方法

    2022-08-15 01:54:20
  • Mysql数据表中的蠕虫复制使用方法

    2024-01-24 15:06:06
  • SQL Server 事务,异常和游标详解

    2024-01-18 19:25:19
  • 详解pandas绘制矩阵散点图(scatter_matrix)的方法

    2022-06-09 18:52:34
  • 如何获知用户的IP?

    2009-11-24 20:52:00
  • 一文详解Go语言单元测试的原理与使用

    2024-05-09 10:08:03
  • php快递单号查询接口使用示例

    2023-10-25 07:39:55
  • 如何批量消除网页超级链接上的“虚线框”

    2008-10-15 12:55:00
  • sql2008评估期已过的解决办法及序列号

    2024-01-13 10:32:11
  • python基础教程之udp端口扫描

    2022-01-10 01:03:22
  • Python openpyxl 遍历所有sheet 查找特定字符串的方法

    2023-08-25 10:22:47
  • 图文详解vscode配置运行php项目完整版

    2023-05-28 22:56:03
  • php浅析反序列化结构

    2023-11-17 17:34:37
  • oracle下巧用bulk collect实现cursor批量fetch的sql语句

    2009-03-04 10:43:00
  • Python PyQt4实现QQ抽屉效果

    2023-10-08 08:06:42
  • asp之家 网络编程 m.aspxhome.com