统计学习笔记 - KNN原理、python实现

1. KNN实现

我的理解就是,找到最接近的K个邻居,根据邻居的类别,确定自己的类别。怎么确定呢?K个邻居进行投票。
包括:

  • 输入一个新的实例
  • 在已知的训练数据集中计算该新的实例与训练数据集中数据点之间的距离
  • 按照距离进行排序
  • 选择距离最短的也就是最相似的前K个邻居
  • 这K个邻居根据自己的类别进行投票,票数最多的类别就是该新的实例的类别。

2 关于可哈希(hashable)

简要的说可哈希的数据类型,即不可变的数据结构(字符串str、元组tuple、对象集objects)。它是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以用在固定的时间复杂度下查询它,所以,哈希对高效的算法和数据结构很重要。同理,不可哈希的数据类型,即可变的数据结构 (字典dict,列表list,集合set)

3 KNN原理

截图摘自李航老师的《统计学习方法》。
在这里插入图片描述

4 KNN代码实现

这部分代码根据训练集中样本的类别,确定一个新的数据点(5,3)的类别。
新的数据点(5,3)对应着上述算法描述中的实例特征向量 x x x.
训练集只有两类数据,+1和-1.
自己在测试的时候,将 x_ = np.array([5,3]) #需要预测的数据 改变即可。

import numpy as np
import pandas as pd
from collections import Counter

if __name__ =='__main__':
    x_train = np.array([[5,4],[9,6],[4,7],[2,3],[8,1],[7,2]]) # 训练数据的特征值
    y_train = np.array([1,1,1,-1,-1,-1])                      # 训练数据的标签

    x_ = np.array([5,3]) #需要预测的数据

    lp_distance = [[np.linalg.norm(x_new-x_train[i],ord=2),y_train[i]] for i in range(np.size(y_train))] # 这是一个list数据,每一个元素是一个tuple
    # 对lp_distance进行排序 sort函数
    lp_distance.sort(key = lambda x:x[0]) # 排序后,原本的lp——distance也变化了,每一个位置处存储的数据也发生了变化
    # key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    # 上面也就是按照距离进行排序,距离是list数据的第一个元素,列表的第一列进行排序
    k_label = np.asarray(lp_distance)[:,-1]
    ## 前k个邻居进行投票
    k = 5
    ## 使用counter函数进行计数,
    counter = Counter(k_label[:k]) #邻居进行投票
    print('The label of the new data is: %d'% int(counter.most_common()[0][0]))       

运行结果:
在这里插入图片描述

5 总结

原理中提到KNN训练时不可显示的,也是,就是根据距离度量的结果,比较判断,然后输出一个结果。
在KNN实现时,用到了python中几个重要的函数,sort()函数,Counter()函数,涉及到了数据类型的变换,比如list,dict等可变的数据类型是不可哈希的,就是不能够查找的。
tuple类型的数据结构,其中的元素是不可修改的,不过如果tuple中包含list等可变数类型,对应的可变的数据类型是可以修改的。数据结构就相当于一个大的存储容器,存储的数据类型各不相同,有的可以改,有的不可以改。

实验踩坑记录:
lp_distance = [[np.linalg.norm(x_new-x_train[i],ord=2),y_train[i]] for i in range(np.size(y_train))] # 这是一个list数据,每一个元素也是一个list。
上面这个是自己写的代码,这是一个list的数据
lp_distance = [(np.linalg.norm(x_new-x_train[i],ord=2),y_train[i]) for i in range(np.size(y_train))] # 这是一个list数据,每一个元素是一个tuple
tuple类型的数据可以哈希的了

Talk is cheap, show me your code!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值