k近邻算法(knn) 学习

来源:互联网 发布:红叶知弦小说 编辑:程序博客网 时间:2024/06/06 03:38

思路

k-近邻算法(kNN)的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。

特点

  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:计算复杂度高、空间复杂度高。
  • 适用数据范围:数值型和标称型。

代码例子

# -*- coding: utf-8 -*-# __author__ = 'wangbowen'from numpy import *import operatordef createDataSet():    """ 创建数据集和标签 """    group = array([[1.0, 1.1],                   [1.0, 1.0],                   [0, 0],                   [0, 0.1]                   ]                  )    labels = ['A', 'A', 'B', 'B']    return group, labelsdef classfiy0(inX, data_set, labels, k):    """ k近邻算法    params:        inX: 用于分类的输入向量        data_set: 训练样本        labels: 标签向量与data_set的行数相同        k:选择最近邻居的数目,总是正整数    """    # 计算距离    data_set_size = data_set.shape[0]    diff_mat = tile(inX, (data_set_size, 1)) - data_set    sq_diff_mat = diff_mat**2  # **2对每个元素平方    sq_distances = sq_diff_mat.sum(axis=1)    distances = sq_distances**0.5    print distances    sorted_dintance_indexs = distances.argsort()    print sorted_dintance_indexs    class_count = {}    for i in range(k):        # 选择距离最小的k个点        vote_label = labels[sorted_dintance_indexs[i]]        class_count[vote_label] = class_count.get(vote_label, 0) + 1    # 排序    sorted_class_count = sorted(class_count.iteritems(), key=operator.itemgetter(1), reverse=True)    # 返回频率发生最高的元素标签    return sorted_class_count[0][0]if __name__ == '__main__':    group, labels = createDataSet()    print classfiy0([0, 0], group, labels, 3)  # 输出: B