kNN算法的原理以及Python实现

kNN原理分析

kNN(k-NearestNeighbor),又叫邻近算法,顾名思义,是通过计算出k个邻居来进行分类或者回归的算法。这两种情况下数据集都需要满足存在k个最近节点。算法的输出取决于需要进行的是分类还是回归:

  • 当使用kNN算法进行分类时,输出的结果将会是一个类别。算法会通过计算输入节点和整个数据集的节点距离,通过距离最近的k个节点进行投票来确定输入节点的类别,最终输出该类别作为结果
  • 当使用kNN算法进行回归时,输出的结果会是一组数值。此时的输入是某个类别,输出值则会是当前所有数据该类别节点的平均值

作为一种属于lazy learning的算法,kNN的优点和缺点不言而喻,
先来说说优点:

  • 目标函数将会有很强的适应性。由于并不是通过训练模型来进行预测,所以对于增加新的样本和执行算法时,都是需要重新计算的,所以给了kNN忽略变化的能力。

说到kNN算法的缺点:
- 当使用的样本集非常大的时候,kNN中的节点计算会带来非常巨大的消耗,同时噪点样本数量增加也会影响邻近算法的投票过程,造成分类效果降低等。

kNN分类器

好说了这么多,下面就用Python实现kNN分类器算法:

/**
 * @param input_x ndarray 输入的节点特征值
 * @param data_set ndarray 样本集合
 * @param labels String 类型标签
 * @param k 用于vote的邻近节点数 
 */
def classify(input_x, data_set, labels, k):
    data_set_size = data_set.shape[0]
    diff_mat = tile(input_x, (data_set_size,1)) - data_set
    sq_diff_mat = diff_mat**2
    sq_distances = sq_diff_mat.sum(axis=1)
    distances = sq_distances**0.5
    sorted_dist_indicies = distances.argsort()
    class_count={}
    for i in range(k):
        voteIlabel = labels[sorted_dist_indicies[i]]
        class_count[voteIlabel] = class_count.get(voteIlabel,0) + 1 
        sorted_class_count =  sorted(class_count.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sorted_class_count[0][0]

代码的核心就是通过矩阵操作计算欧几里德几何距离,取出前k个点进行vote,vote数量最多的label作为输出。


当然,有可能存在这种情况,当使用公式:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值