我是靠谱客的博主 紧张发卡,最近开发中收集的这篇文章主要介绍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)

最后

以上就是紧张发卡为你收集整理的6-基于python3.6实现KNN的算法(枚举思路)的全部内容,希望文章能够帮你解决6-基于python3.6实现KNN的算法(枚举思路)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部