机器学习实战——K-近邻算法原理与代码解析

kNN原理:

         通俗理解:采用测量与不同特征值之间的距离的方法进行分类。

         具体描述:存在一个样本数据集合,也称作训练样本集,并且样本集中都存在标签,即我们知道样本集中的每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处。通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

优缺点:

        优点:精度高、对异常值不敏感、无数据输入假定

        缺点:计算复杂度高、空间复杂度高。

使用数据范围:

                     数值型和标称型

kNN.py代码解析:

from numpy import *                 #科学计算包Numpy
import operator                     # 运算符模块
def createDataSet():                #定义函数createDataSet()
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])            #定义数组
    labels = ['A','A','B','B']       #定义列表
    return group,labels         #返回数组和列表

def classify0(inX,dataSet,labels,k):
            #定义函数classify0(),包含是四个参数,第一个向量是需要用算法分类的,第二个是训练样本集,第三个是标签向量,最后一个是选择最近邻居的数目
            #距离计算,采用欧式距离公式
   dataSetSize = dataSet.shape[0]
           '''
               shape是numpy函数库中的方法,用于查看矩阵或者数组的维素
               shape(array) 若矩阵有m行n列,则返回(m,n)
               array.shape[0] 返回矩阵的行数m,参数为1的话返回列数n
               '''
   diffMat = tile(inX,(dataSetSize,1)) - dataSet
           '''tile是numpy函数库中的方法,用法如下:
               tile(A,(m,n))  将数组A作为元素构造出m行n列的数组
               '''
   sqDiffMat = diffMat**2
   sqDistances = sqDiffMat.sum(axis=1)
           '''array.sum(axis=1)按行累加,axis=0为按列累加
           '''
   distances = sqDistances**0.5 #开方
   sortedDistances = distances.argsort()
           '''argsort()是numpy中的方法,得到矩阵中每个元素的排序序号
               A=array.argsort()  A[0]表示排序后 排在第一个的那个数在原来数组中的下标
               '''
   classCount = {}
   for i in range(k):#选择距离最小的k个点
       voteIlabel = labels[sortedDistances[i]]
       classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
           '''python中字典的方法,get(key,x)从字典中获取key对应的value,字典中没有key的话返回0
           '''
           #排序,此处应为classCount.items(),而不是iteritems()
   sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
           #sorted(),python中的方法
           '''numpy中有min()、max()方法,用法如下
               array.min(0)  返回一个数组,数组中每个数都是它所在列的所有数的最小值
               array.min(1)  返回一个数组,数组中每个数都是它所在行的所有数的最小值
                listdir('str'),python的operator中的方法
                strlist=listdir('str')  读取目录str下的所有文件名,返回一个字符串列表
                split(),python中的方法,切片函数
                string.split('str')以字符str为分隔符切片,返回list
                '''
   return sortedClassCount[0][0]

在控制台输入import  kNN

                    group,labels=kNN.createDataSet()

                   kNN.classify0([0,0],group,;labels,3)

                  输出结果为B。

                    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值