机器学习实战之k-近邻算法(附python3代码)

本文介绍了k-近邻(kNN)算法,包括其优点、缺点和适用范围。通过详细解释算法工作原理和流程,展示了kNN在约会网站和手写识别系统的应用。同时,提供了Python代码实现,包括数据预处理、距离计算和错误率评估,以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整代码见github

kNN(k-Nearest Neighbors,kNN)算法

优点: 精度高,对异常值不敏感,无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用范围:数值型和标称型

工作原理:存在一个样本数据集合,也称作训练样本,并且样本集中的每个数据都存在标签,即我们知道样本集中每一条数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与训练样本集中的对应的特征进行比较,然后算法提取训练样本集中特征最相似的数据(最近邻)的分类标签为新数据的标签。一般来说,只选择样本集中前k个最相似的数据,即k-近邻中的k,通常k是不大于20的整数,最后,选择k个最相似的数据中出现次数最多的类别,作为新数据的类别。

kNN算法似乎没有现实的训练过程,是一种“懒惰学习”(lazy learning)的著名代表,此类学习技术在训练阶段仅仅是把样本保存起来,训练时间开销为0,待收到测试样本后再进行处理,
在训练阶段就对样本进行学习处理的方法称为“急切学习”(eager learning)。

kNN算法的重要参数是k和距离计算公式

k-近邻算法的一般流程

  1. 收集数据:可以使用任何方法
  2. 准备数据:距离计算所需要的数值,最好是结构化的数据格式
  3. 分析数据:可以使用任何方法(如适用matplotlib画二维扩散图
  4. 训练算法:此步骤不适用于k-近邻算法
  5. 测试算法,计算错误率
  6. 使用算法:首先需要输入样本数据和结构化输出结果,使用算法:首先需要输入样本数据和结构化输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

kNN分类算法伪代码

对未知类别属性的数据集中的每个点执行以下操作:
	1 计算已知类别数据集中的点与当前点的距离
	2 按照距离大小递增排序
	3 选取与当前距离最小的k个点
	4 确定前k个点所在类别出现的频率
	5 返回前k个点出现频率最高的类别作为当前点的类别

kNN分类算法python代码实现

def classify0(dataset, labels, inX, k):
    '''

    :param dataset: 训练数据向量
    :param labels: 训练数据的标签标签向量
    :param inX: 用于分类的输入向量
    :param k: 选择最近邻的数目
    :return: 分类标签
    '''
    datasetSize = dataset.shape[0]
    # 距离计算
    diffMat = np.tile(inX, (datasetSize, 1))-dataset  # np.tile(inX, (datasetSize, 1)) 表示inX在行上重复datasetSize次,列上重复1次。
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)  # axis = 1 每一行相加,axis = 0每一列相加
    distances = sqDistances**0.5
    sortedDistances = distances.argsort()  # 将元素从小到大排列,并输出下标的index

    classCount = {}
    for i in range(k):
        votelabel = labels[sortedDistances[i]]
        classCount[votelabel] = classCount.get(votelabel, 0)+1  # 存入当前label以及对应的类别值,d.get(k, v)意思是如果k在d中,则返回d[k],否则返回v
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

其中距离计算使用欧式距离公式,计算两个向量点A和B之间的距离:
在这里插入图片描述
例如,点(0,0)和点(1, 2)之间的距离计算为
在这里插入图片描述

在约会网站上使用k-近邻算法

准备数据:从文本中解析数据

datingTestSet2.txt 是约会所用的数据集
每个样本占据一行,总共1000行,样本包含以下3种特征:

  • 每年获得的飞行常客里程数
  • 玩视频游戏所消耗时间百分比
  • 每周消费冰淇淋公升数

类型:不喜欢的人,魅力一般的人,极具魅力的人

在将上述特征输入到分类器之前,需要将待处理数据的格式改变为分类器可以接受的格式。处理函数python代码如下:

def file2matrix(filename):

    '''
    将文件中的数据集转成矩阵形式
    :param filename: 文件名
    :return: 数据矩阵和标签向量
    '''

    fr = open(filename)
    oneArrays = fr.readlines()
    m = len(oneArrays)
    dataSet = np.zeros((m, 3))
    labels = []
    index = 0
    for line in oneArrays:
        line = line.strip().split('\t')
        dataSet[index, :] = line[0:3]
        labels.append(int(line[3]))
        index += 1
    return dataSet, labels
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值