k-近邻算法

2018-10-25  本文已影响0人  yshhuang

算法简介

k-近邻算法可以说是我接触过的最简单的机器学习算法了,其思路非常直白:给定一个训练集,输入一个实例,在训练集中找到和输入实例最近的k个点,这k个点中数量最多的类就是输入实例的类。可以看出来,k邻近算法的关键就是怎么样找到这最近的k个点。通过遍历训练集挨个计算与输入实例的距离肯定是可以做的,那就先用这种方法来实现一次。

python实现

from numpy import *
import operator

def create_data_set():
    """
    创建数据集
    :return group: 数据集
    :return labels: 分类标签
    """
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 1.0]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

模拟训练集忠有4条数据,用数组表示,数组的每个元素代表训练实例的一个属性值。这里先不关注它的实际意义,把它当做二维坐标中的点即可。

def classify0(in_x, data_set, labels, k):
    """
    kNN算法,分类器
    :param in_x: 测试集
    :param data_set: 训练集
    :param labels: 分类标签
    :param k: kNN算法参数,选择距离最小的k个点
    :return:
    """
    data_set_size = data_set.shape[0]  # numpy函数shape返回array每一维的长度,shape[0]即第一维的长度
    diff_mat = tile(in_x, (data_set_size, 1)) - data_set  # numpy函数tile将数组in_x在行方向上重复data_set_size次,列方向上一次
    sq_diff_mat = diff_mat ** 2
    sq_distance = sq_diff_mat.sum(axis=1)  # 在第二维上进行求和(即每一列相加,axis只能是0或1
    distance = sq_distance ** 0.5  # 算出欧氏距离
    sorted_dist_indices = distance.argsort()  # 返回排序后的索引

    class_count = {}  # 记录标签出现的次数
    for i in range(k):
        vote_i_label = labels[sorted_dist_indices[i]]
        class_count[vote_i_label] = class_count.get(vote_i_label, 0) + 1
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1),
                                reverse=True)  # 字典排序itemgetter(0)根据key排序,itemgetter(1)根据value排序
    return sorted_class_count[0][0]

注意的问题:

def auto_norm(data_set):
    """
    数据归一化
    :param data_set:原特征矩阵
    :return norm_data_set: 归一化后的特征矩阵
    :return ranges: 每一列的数据最大值最小值之差
    :return min_vals: 每一列的最小值
    """
    min_vals = data_set.min(0)  # min(0)以行为维度,即计算每一列的最小值
    max_vals = data_set.max(0)
    ranges = max_vals - min_vals
    m = data_set.shape[0]
    norm_data_set = data_set - tile(min_vals, (m, 1))
    norm_data_set = norm_data_set / tile(ranges, (m, 1))  # numpy 的"/"表示矩阵的每一个元素相除,矩阵的除法用linalg.solve(matA,matB)
    return norm_data_set, ranges, min_vals

完整代码

https://github.com/yshhuang/practice-code/tree/master/ml-in-action/02-kNN

参考文章:

【量化课堂】一只兔子帮你理解 kNN
Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
一文搞懂k近邻(k-NN)算法(一)

上一篇下一篇

猜你喜欢

热点阅读