基础版K-近邻算法

想写机器学习的基础算法代码实现很久了,差不多有1年了,但是自己太懒了,一直没有下笔,好不容易今天又来了兴趣,再不写,估计以后也不会写了哈哈哈,所以还是每天写一点吧,早点搞好机器学习,才能安心转到深度学习,不然心理老是感觉有个疙瘩,哈哈哈,加油李启飞,做最开心的自己!

下面的代码都是自己的理解,如有错误请大家批评指正!

K-近邻

我眼中的K-近邻共有三步:

       1、计算待测样本A与数据集dataset中所有样本的欧式距离

             欧式距离计算公式就是高中数学所学的计算向量距离的公式d = \sqrt{\left ( x_{a}- x_{b}\right )^{2}+\left ( y_{a}- y_{b\}\right )^{2}}

        2、距离排序

        3、选取最近的K个点,返回K个点出现频率最高的类别作为当前点的预测类别

代码详解:

import numpy as np
import operator

def knn(test, dataset,labels,k):   
    """
    #计算test样本与dataset中所有样的距离,首先我们要想将test的维度变成和数据集dataset的维度一样
    例如dataset=([[0, 1],
                   [2, 3],
                   [4, 5],
                   [6, 7]])有四个样本,两个特征属性
    test = [0,0]
    我们将test转变成test= ([[0, 0],
                   [0, 0],
                   [0, 0],
                   [0, 0]])
    这样就可以批量就算距离了
    test[0,0]与样本1[0,1]的距离,test[0,0]与样本2[2,3]的距离,
    test[0,0]与样本3[4,5]的距离,test[0,0]与样本4[6,7]的距离
    """
    #将test转变成与dataset一样的维度
    test = np.tile(test,(dataset.shape[0],1))
    """
    计算距离:第一步先算减法
             subresult = test - dataset
             第二步,计算平方
             square = subresult**2
             第三步,计算根号,根据公式先计算平方和,再开平方
             sqdistance = square.sum(axis=1)
             distance = sqdistance**0.5          
    """
    subresult = test - dataset
    square = subresult**2
    sqdistance = square.sum(axis=1)
    distance = sqdistance**0.5
    
    #到目前为止计算完距离,接下来是第二步,排序
    Sorted = distance.argsort()
    #sorted里存放的是排好序号的样本编号例:[4,2,3,1]表示样本一最远,以此类推
    #选取最近的K个点,返回K个点出现频率最高的类别作为当前点的预测类别
    classcount = {}
    #字典key表示类别名,对应的值为类别出现的次数
    for i in range(k):
        #获取前k个距离最近的类的标签
        classlabel = labels[int(np.argwhere(Sorted == i))]
        #将出现的标签一次加入字典classcount中,出现一次累加一次此标签的个数
        classcount[classlabel] = classcount.get(classlabel,0)+1
    #标签出现的次数最多的就是此类    
    sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),
                              reverse=True)
    
        
    return sortedclasscount[0][0]

 

             

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值