6-基于python3.6实现KNN的算法(枚举思路)

参考《机器学习实战》

    本文是用枚举法实现KNN算法的,并非用KD树。枚举法即计算出全部的已有输入实例点到目标实例点的距离,排序后选出距离最小的K个点,就是最邻近的K个点。本文的输入实例只有两维,用欧氏距离公式去度量距离的。本文是针对像我这样的新手,对每句代码都进行详细的解释,若看不懂,请留言让我改进。

from numpy import *
#导入numpy模块中的所有内容
import operator
#导入operator模块,该模块定义了逻辑,比较,算术等操作函数,如not_()等


#生成数据集


def create_data():
    dataset = array([[1.1,1],[1,1.1],[0,0.1],[0.1,0]])
#输入实例点X(二维),4个
#array函数位于numpy模块,这里用法是将多个序列组成二维数组
    lables = ['A','A','B','B']
#X对应Y值,即输入实例点对应的类别
    return dataset,lables


#定义KNN分类器


#d=新的输入实例点,data=已有的输入实例点,lable=data对应的类别,k = 要找到离d最近的k个点
#假设d=[1,1]
def classify(d,data,lable,k):
    num = data.shape[0]
#找出二维data数组的行数,本例中行数就是已有的输入实例点数,4个点
#shape函数位于numpy模块,用于查看矩阵或者数组的维数。shape[1]查看列数
    d_array = tile(d, (num,1))
#构造出来的数组是array([1,1],[1,1],[1,1],[1,1])
#tile函数位于numpy模块,tile(x, (m,n)即用x作为元素,构造m行n列数组
    dif = data - d_array
#已有的输入实例点和目标实例点d的坐标差值,本例为array([0.1,0],[0,0.1],[-1,-0.9],[-0.9,-1])
    dif = dif ** 2
#每个坐标差值都取平方,本例为array([0.01,0],[0,0.01],[1,0.81],[0.81,1])
    dif = dif.sum(axis=1)
#本例为array(0.01,0.01,1.81,1.81)
#sum函数位于numpy模块,sum(axis=1)即将数组的每一行的行内元素相加
    distance = dif ** 0.5
#计算目标输入实例点与已有的每个输入实例点的距离,本例为array(0.1,0.1,1.34,1.34)
    distance = dif.argsort()
#将距离从小到大排序,排序返回结果是每个距离对应的索引(0,1,2,3)
    print(distance)
#打印结果

#找出最近的k个点
    class_count = {}
#创建字典,键是类别Y值,值是类别出现的次数
    for i in range(k):
#取排序后的前k个输入实例点
        temp = lable[distance[i]]
#取出输入实例点对应的类别
        class_count[temp] = class_count.get(temp,0) + 1
#对该类别进行统计
#get()是dict的函数,dict.get(键,默认值),若键存在,则返回键对应的值;若键不存在,则返回设置好的默认值
    result = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)
#sorted(排序对象,按第几个属性排序,True是逆序)
    return result[0][0]
#返回结果的第一个元素的第一个属性,也就是类别


#实现KNN


dataset,lables = create_data()
result = classify([1,1],dataset,lables,3)
print(result)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值