• 数据挖掘经典十大算法_KNN算法


    数据挖掘经典十大算法_KNN算法

    一、从案例入手
    已知一组数据:

    电影名称亲热次数打斗次数电影类型
    California Man1043爱情电影
    He is Not Really into Dudes1002爱情电影
    Beautiful Woman811爱情电影
    Kevin Longblade10101动作电影
    Robo Slayer 3000599动作电影
    Amped Ⅱ298动作电影
    未知9018

    (一)划分训练集与测试集
    训练集

    电影名称亲热次数打斗次数电影类型
    California Man1043爱情电影
    He is Not Really into Dudes1002爱情电影
    Beautiful Woman811爱情电影
    Kevin Longblade10101动作电影
    Robo Slayer 3000599动作电影
    Amped Ⅱ298动作电影

    测试集

    电影名称亲热次数打斗次数电影类型
    未知9018

    (二)计算未知样本和每个训练集样本的距离(欧氏距离)
    dist(x,y) =
    (三)设定参数,k值
    设定K = 3
    (四)将距离升序排列
    1.Beautiful Woman
    2.He is Not Really into Dudes
    3.California Man
    4.Kevin Longblade
    5.Robo Slayer 3000
    6.Amped Ⅱ
    (五)选取距离最小的k个点
    1.Beautiful Woman
    2.He is Not Really into Dudes
    3.California Man
    (六)统计前k个最近邻样本点所在类别出现的次数
    爱情电影 3次 动作电影 0 次
    (七)选择出现频率最大的类别作为未知样本的类别
    未知电影 为 爱情电影类型
    二、从程序理解
    (一)导入训练数据

    import numpy as np
    import matplotlib.pyplot as plt
    fight = [3,2,1,101,99,98]
    kiss = [104,100,81,10,5,2]
    filmtype = [1,1,1,2,2,2]
    plt.scatter(fight,kiss,c=filmtype)
    plt.xlabel('fight')
    plt.ylabel('kiss')
    plt.title('movie')
    plt.show()
    x = np.array([fight,kiss])
    x = x.T # 转置
    y = np.array(filmtype)
    print(x)
    print(y)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    x 转置后的矩阵,每一行代表一条数据样本
    在这里插入图片描述
    y 矩阵
    在这里插入图片描述
    (二)计算测试数据与训练数据的欧氏距离

    xx = np.array([18,90]) # 将测试数据转换为array
    # 计算欧氏距离 
    # sum(0) 按列求和 sum(1)按行求和 由于前面将矩阵进行转置 所以每一行代表一条样本
    dist = (((x-xx)**2).sum(1))**0.5
    print(dist)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    (三)将距离升序排序

    sortedDist = dist.argsort()
    print(sortedDist) # 输出的是排序索引
    
    • 1
    • 2

    在这里插入图片描述
    (四)设置K值,选取距离最小的k个点,统计前k个点所在类别出现的次数

    k = 4
    classCount = {} # 建立一个空的字典来统计每种类型出现的次数
    for i in range(k):
        voteLabel = y[sortedDist[i]] # 利用排序索引映射到y矩阵中,获得索引对应的电影类型
        classCount[voteLabel] = classCount.get(voteLabel,0) + 1 # 利用get函数取键值 并在基础上加1达到计数效果  累加操作
    print('class:count',classCount)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    (五)多数表决,输出结果

    maxType = 0 # 设置初始值
    maxCount = -1 # 设置初始值
    for key , value in classCount.items(): # items() 遍历字典
        if value > maxCount: 
            maxType = key
            maxCount = value
    print('output:' , maxType)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    三、封装KNN程序

    import numpy as np
    def knn(inX,dataSet,labels,k):
        dist = (((dataSet-inX)**2).sum(1))**0.5
        sortedDist = dist.argsort()
        classCount = {}
        for i in range(k):
            voteLabel = labels[sortedDist[i]] # 利用排序索引映射到y矩阵中,获得索引对应的电影类型
            classCount[voteLabel] = classCount.get(voteLabel,0) + 1 # 利用get函数取键值 并在基础上加1达到计数效果
        maxType = 0 # 设置初始值
        maxCount = -1 # 设置初始值
        for key , value in classCount.items(): # items() 遍历字典
            if value > maxCount: 
                maxType = key
                maxCount = value
        return maxType
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    import numpy as np
    import matplotlib.pyplot as plt
    import knn as K
    fight = [3,2,1,101,99,98]
    kiss = [104,100,81,10,5,2]
    filmtype = [1,1,1,2,2,2]
    x = np.array([fight,kiss])
    x = x.T
    y = np.array(filmtype)
    xx = np.array([18,90]) # 将测试数据转换为array
    result = k.knn(xx,x,y,4)
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    Roreg复现
    记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案
    FPGA从入门到精通(二十)SignalTapII
    VUE页面导出PDF方案
    前端项目使用钉钉字体
    【学习笔记】pip安装pyinstaller报错问题
    Java集合框架之ArrayList源码分析
    Docker容器化技术(使用Dockerfile制作Nginx镜像)
    使用libswresample库实现音频重采样
    Windows Server 系统各版本及授权说明(附下载地址
  • 原文地址:https://blog.csdn.net/qq_45556665/article/details/126917294