• K最近邻算法


    一、原理
            K最近邻算法(K-Nearest Neighbor, KNN)是最基本的分类算法,其基本原理是:从最近的K个邻居(样本)中,选择出现次数最多的类别作为判定类别。K最近邻算法可以理解为是一个分类算法,常用于标签的预测,如性别。

    实现KNN算法核心的一般思路:

    1. 相似度计算——计算未知样本和每个训练样本的距离;
    2. 排序——按照距离的递增关系排序;
    3. 统计标签——得到距离最小的前K个样本,统计K最近邻样本中每个样本出现的次数;
    4. 预测标签——选择出现频率最高的类标号作为未知样本的类标号;

            K值的选择是选择统计的样本数量,K值得选择会对KNN算法产生较大得影响。

    • 如果K值较小,则意味着:只有当需要进行预测的样本和训练的样本较接近时,才能有较好的效果;
    • 如果K值较大,则意味着:算法分类的近似误差增大。这时,与输入样本距离较远的样本也会对结果产生作用。

    在实际上,K值一般选择较小的数,也可以选择交叉验证的方法寻找最优K值。
    二、实例Python实现

    利用KNN算法实现性别判定:很多时候,用户在注册的时候,没有填写性别,这个时候,可以通过KNN预测。

    import numpy as np
     
    class KNN:
        def __init__(self, k):
            self.k = k
     
        def createData(self):
            features = np.array([[180,76],[158,43],[176,78],[161,49]])
            labels = ["","","",""]
            return features, labels
     
        def Normalization(self, data):
            # print("data:
    ",data)
            maxs = np.max(data, axis=0)
            # print("maxs:
    ",maxs)
            mins = np.min(data, axis=0)
            # print("mins
    ",mins)
            new_data = (data - mins) / (maxs - mins)
            # print("new_data:
    ",new_data)
            return new_data, maxs, mins
     
        def classify(self, one, data, labels):
            # 计算新样本与数据集每个样本之间的距离,这里采用欧式距离
            differenceData = data - one
            squareData = (differenceData ** 2).sum(axis=1)
            distance = squareData ** 0.5
            # 从小到大排序
            sortDistanceIndex = distance.argsort()
            labelCount = dict()
            for i in range(self.k):
                label = labels[sortDistanceIndex[i]]
                labelCount.setdefault(label,0)
                labelCount[label] += 1
            print("labelCount:
    ",labelCount)
            sortLabelCount = sorted(labelCount.items(),key=lambda x:x[1], reverse=True)
            print(sortLabelCount)
            return sortLabelCount[0][0]
     
    if __name__ == '__main__':
        # 初始化类对象,前k个里面,哪个标签最多,就预计是那个
        knn = KNN(3)
        # 创建数据集
        features, labels = knn.createData()
        # 数据集标准化
        new_data, maxs, mins = knn.Normalization(features)
        # 新数据的标准化
        one = np.array([176,76])
        new_one = (one - mins) / (maxs - mins)
     
        result = knn.classify(new_one, new_data, labels)
        print("数据{}的预测性别为:{}".format(one, result))
     

    运行结果:

  • 相关阅读:
    2016-12-7
    使用netty4.x客户端接收较大数据量报文时发生的读取不完整bug修复记录
    AngularJS
    使用Netty收发二进制报文问题记
    如何在Linux中查看所有正在运行的进程
    面试连环炮系列(十四): HTTP状态码302的跳转逻辑
    算法天天练1:计算最长子串
    面试连环炮系列(十三):实现一个线程有几种方法
    面试连环炮系列(十二):说说Atomiclnteger的使用场景
    面试连环炮系列(十一):说说你们的分布式ID设计方案
  • 原文地址:https://www.cnblogs.com/SysoCjs/p/11595715.html
Copyright © 2020-2023  润新知