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作为输出。
当然,有可能存在这种情况,当使用公式:
(∑