机器学习-笔记(k-近邻算法)

算法思想

KNN是最简单的机器学习算法之一,该方法思路非常简单:存在一个样本集,在该样本集中每个数据都存在标签。此时输入一个没有标签的新数据后,将新数据与该样本集中数据对应的特征进行比较,选择前k个最相似的数据,且在该k个数据中大多数数据所属的标签可以认定为该数据的标签。

优点:就是思路简单,易于理解,易于实现。对异常值不敏感,倘若有一个异常值不会有太大影响,因为取得k个值。

算法步骤

  1. 准备数据:对数据进行预处理
  2. 计算测试样本(即新数据)到其他样本点的距离
  3. 在第二步完成之后,对所有的距离进行排序,选择出距离最近的k个样本点(即k-近邻)
  4. 对k个点所属标签进行比较,那么这个新样本所属标签可以归于这k个样本中所属的标签占比最高的类别

这里要说一下怎么求2中测试样本到其他样本的距离,对于距离可以用欧式距离(也称欧几里得度量)

代码实现

此处的代码实现是参考 Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文),由于正在学习机器学习的初级阶段,因此只是实现了较为简单的代码,该博主还有一个约会网站配对效果判定,写的非常详细。

数据准备:
判别新输入的样本是属于爱情片还是动作片,训练集只准备了四组数据,每组数据中有两个特征值

def createDataSet():
    #四组二维特征
    group = np.array([[1,101],[5,89],[108,5],[115,8]])
    labels = ['爱情片','爱情片','动作片','动作片']
    return group,labels

KNN算法

def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]   #numpy函数shape[0]返回dataSet的行数
    diffMat = np.tile(inX,(dataSetSize,1)) - dataSet #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
    sqDiffMat = diffMat**2   #二维特征相减后平方
    sqDistances = sqDiffMat.sum(axis=1)  #sun()所有元素相加,sum()行相加
    distances = sqDistances**0.5   #开方,计算出距离
    sortedDistIndices = distances.argsort()   #返回distances中元素从小到大排序后的索引值
    classCount = {}
    for i in range(k):
        votelabel = labels[sortedDistIndices[i]]  #取出前K个元素的类别
        classCount[votelabel] = classCount.get(votelabel,0) + 1  #字典的get方法,返回指定键的值,如果值不在字典中返回默认值


    #key=operator.itemgetter(0)根据字典的值进行排序
    # key=operator.itemgetter(1)根据字典的键进行排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

那么根据上面的代码可以看到KNN的缺点,它的计算是非常庞大的,且需要存储所有数据点,因而对于存储器的要求也很高。

后续会继续补充。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值