Python--《机器学习实战》学习笔记之k-近邻

本文详细介绍了k-近邻(kNN)算法在机器学习中的应用,包括约会网站配对效果改进和手写数字识别。通过数据归一化提高精确度,利用欧式距离计算特征值之间的距离。文章还提供了算法实现和测试过程,展示了如何将图像数据转换为kNN算法可使用的格式,并探讨了k值选择对算法性能的影响。
摘要由CSDN通过智能技术生成

从机器学习的门缝开始窥了那一眼

一.kNN–通用分类器

计算输入向量与训练样本的特征值的距离----欧式距离公式
两个特征值—二维两点间的距离
sqrt((Ax-Bx)^2 +(Ax-Bx) ^2)—sqrt开根号
4个特征值
比如:
(1,0,0,1),(7,6,9,4)
sqrt((7-1)^ 2+(6-0) ^ 2+(9-0)^ 2+(4-0)^2)

# classify:分类(器)
def classify0(inx, data_set, labels, k):
    """
    kNN
    :param inx: 用于分类的输入向量,待分类数据
    :param data_set: 输入的训练样本集
    :param labels: 标签向量,个数与训练样本集矩阵的行数相同
    :param k: 用于选择最近邻的数目
    :return:
    """
    # shape:从外往内获取数组分别在一维,二维,三维....
    #   的元素的个数(一维是最外层),返回值是一个元组,元素的元素个数
    #   与待处理数据的维度一致
    data_set_size = data_set.shape[0]  # shape[0]返回数组在一维的元素个数
    # tile:按digest参数,维度对照来平铺数组
    #    维度对照的元组的元素值,即为对应维度平铺的倍数,同shape,分别为一维,二维,三维....

    # 平铺待处理向量与训练样本集一致,并进行数组内元素的值对位相减----求差
    diff_mat = tile(inx, (data_set_size, 1)) - data_set
    # 数组内元素值平方----平方
    sq_diff_mat = diff_mat ** 2
    # 按行(横轴)合并数据-----求和
    # axis:轴
    sq_distances = sq_diff_mat.sum(axis=1)
    # 各元素开根号---开根号
    distances = sq_distances ** 0.5  # 获取到的特征值距离的序列
    # argsort----升序排序:将数据升序排序,将数据的值替换成原数据所在数组中的索引值
    # ,即原数据,升序排序后的数组在原数据中索引的映射序列
    # [1.48660687 1.41421356 0.         0.1       ]
    # [2 3 1 0]
    sorted_dist_indicies = distances.argsort()
    # 构造一个空的字典
    class_count = {
   }
    for i in range(k):
        # sorted_dist_indicies[i] 取出距离从小到大排序的第i+1个值在数据源中的索引
        # 并取出其对应的标签(数据源的索引和标签一一对应)
        vote_ilabel = labels[sorted_dist_indicies[i]]
        # 如果标签存在则获取到标签你的value,并加一,若不存在,则将其value设为1
        class_count[vote_ilabel] = class_count.get(vote_ilabel, 0) + 1

    # operator.itemgetter(x)---定义一个函数,取到其作用到的对象身上的第x域的值,域==索引
    # 关于排序的通用解法,参考cookbook,此处使用域来排序,是因为,字典转成元组之后,第0域的key都是不同的,无法直接使用key作为参照
    # items---将对象转成元组列表
    sorted_class_count = sorted(class_count.items(),
                                key=operator.itemgetter(1), reverse=True)  # 排序再反转

    # 去第一个元组的,第1个元素,即频率最高的标签
    return sorted_class_count[0][0]

二.实例:使用k-近邻算法改进约会网站的配对效果

流程:
(1)收集数据:提供文本文件
(2)准备数据:使用Python解析文本数据
(3)分析数据:使用Matplotlib绘制二维扩散图
(4)训练算法:此步骤不适用于k-近邻算法
(5)测试算法:使用提供的部分数据作为测试数据
测试样本与非测试样本的区别在于,测试样本是已经分类的数据,如果预测分类与实际分类不同,则标记一个错误
(6)使用算法:产生简单的命令行程序,输入一些特征值以判断对方是否为喜欢的类型

def file2matrix(filename
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值