Machine Learning In Action

KNN近邻算法

  1. 计算目标点与样本集中的点的距离
  2. 按距离递增排序
  3. 选取与目标点距离最下的K个点
  4. 确定前K个所在类别的频率
  5. 返回前K个出现频率最高的类别作为目标点的预测分类
from numpy import  * #导入numpy函数库
import  operator#导入操作符

    #创建数据集
def createDateSet():
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=['A','A','B','B']
    return group,labels

#算法核心
#inX:用于分类的输入向量。即将对其进行分类。
# DataSet:训练样本集
#labels :标签向量
def classify0(inX,dataSet,labels,k):
    #距离计算
    dataSetSize=dataSet.shape[0] #得到数组的行数。即知道有几个训练数据
    diffMat=tile(inX,(dataSetSize,1))-dataSet # tile:numpy中的函数。
    # tile将原来的一个数组扩充成了4个一模一样的数组
    # (tile有重复的功能,dataSetSize是重复4次,后面的1保证重复完了4行,而不是一样里面有四个一样的)
    # 。diffMat得到了目标与训练数值之间的差值。
    sqDiffMat=diffMat**2#得到的diffMat,平方
    sqDiffMatDistances=sqDiffMat.sum(axis=1)#axis=1是列相加,即(x1-x2)^2+(y1-y2)^2
    distances =sqDiffMatDistances**0.5#开方,得到的是距离
    sortedDistIndicies=distances.argsort()#argsort() 是排序,将元素按照升序排列,返回的是升序过后的下标
    #如:[5,7,3],返回的是[2,0,1],其中2,0,1分别代表3,5,7
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]#取离样本集最近的样本,存放在voteIlabel中,也就是样本字典
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
        #get是取字典里的元素,如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,如果没有就返回0(括号里面的0)
        #这行代码的意思就是算距离目标距离最近的k个点ed类别,这个点是哪个类别那个类别就加一
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    # key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(AB是第0个),即‘1’‘2’排序。reverse=True是降序排序
    #key=operator.itemgetter(1)的意思是按照字典里的第一个排序,即{A:2,,B:3}要按照第一个(A,B是元素的第0 个),也就是按照2,3排序。reverse=True是降序排序
    return sortedClassCount[0][0]#返回最多的类别,即sortedClassCount[0]是A:2,sortedClassCount[0][0]是A

注:  如果出现

AttributeError: 'dict' object has no attribute 'iteritems'   原因是

Python3.5中:iteritems变为items,2.7中iteritems可以使用的




进入Python工作区间,也就是该文件存放的路径,进入cmd-->>运行python-->导入类 import Test_python-->> group,leabels=Test_python.createDateSet()--->> Test_python.classify0([0,0],group,leabels,3)
output:  'B'







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiki_taka_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值