• KNN聚类算法


    1.算法原理
    (1)计算距离(欧式距离)
    (2)升序排列(从小到大)
    (3)取前K个
    (4)加权平均
    注意:K过大,分类结果模糊;K过小,受个别案例影响,波动大。
    2.代码实现demo(python)
    (1)以下代码实现找去前五个训练集,并按升序排列

    import random
    import csv
    
    
    #读取
    with open('Prostate_Cancer.csv','r') as file:
        reader=csv.DictReader(file)
        dataset=[row for row in reader]
    print(dataset)
    
    #分组
    random.shuffle(dataset) #shuffle洗牌,将数据打乱
    n=len(dataset)//3   #双斜杆是整除
    
    test_set=dataset[0:n]#测试集
    train_set=dataset[n:] #训练集  从数据的1/3到最后一个数据
    
    #KNN  先算距离,
    def distance(d1,d2):
        res=0
    
        for key in("radius","texture","perimeter","area","smoothness","compactness","symmetry","fractal_dimension"):
          res+=(float(d1[key])-float(d2[key]))**2
    
        return res**0.5
    
    K=5
    def knn(data):
        res=[
            {"result":train['diagnosis_result'],"distance":distance(data,train)}
            for train in train_set
        ]
        #print(res)
    
        #2.排序
        res=sorted(res,key=lambda item:item['distance'])
        #print(res)
    
        #3.取前k个
        res2=res[0:K]
        #print(res2)
    
        #4.取加权平均
        result={'B':0,'M':0}
        #离的近的权重高,离得远的权重低
    
        sum=0
        for r in res2:
            sum+=r['distance']
        for r in res2:
            result[r['result']]+=1-r['distance']/sum
            print(result)
            print(data['diagnosis_result'])
    knn(test_set[0])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在这里插入图片描述
    (2)测准确率

    import random
    import csv
    
    
    #读取
    with open('Prostate_Cancer.csv','r') as file:
        reader=csv.DictReader(file)
        dataset=[row for row in reader]
    #print(dataset)
    
    #分组
    random.shuffle(dataset) #shuffle洗牌,将数据打乱
    n=len(dataset)//3   #双斜杆是整除
    
    test_set=dataset[0:n]#测试集
    train_set=dataset[n:] #训练集  从数据的1/3到最后一个数据
    
    #KNN  先算距离,
    def distance(d1,d2):
        res=0
    
        for key in("radius","texture","perimeter","area","smoothness","compactness","symmetry","fractal_dimension"):
          res+=(float(d1[key])-float(d2[key]))**2
    
        return res**0.5
    
    K=5
    def knn(data):
        res=[
            {"result":train['diagnosis_result'],"distance":distance(data,train)}
            for train in train_set
        ]
        #print(res)
    
        #2.排序
        res=sorted(res,key=lambda item:item['distance'])
        #print(res)
    
        #3.取前k个
        res2=res[0:K]
        #print(res2)
    
        #4.取加权平均
        result={'B':0,'M':0}
        #离的近的权重高,离得远的权重低
    
        sum=0
        for r in res2:
            sum+=r['distance']
        for r in res2:
            result[r['result']]+=1-r['distance']/sum
        if result['B']>result['M']:
           return 'B'
        else:
           return 'M'
    knn(test_set[0])
    
    correct=0
    for test in test_set:
        result=test['diagnosis_result']
        result2=knn(test)
    
        if result==result2:
            correct+=1
    
    print(correct)
    print(len(test_set))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    3.CSV的数据集,有需要的私我!

  • 相关阅读:
    LeetCode刷题day23||669. 修剪二叉搜索树&&108.将有序数组转换为二叉搜索树&&538.把二叉搜索树转换为累加树--二叉树
    指针数组与数组指针的区别
    基于FPGA的ADS1256讲解
    Oracle和MySQL不同编码格式下varchar所能存储的中文数量
    Ubutun搭建集群遇到的一些问题
    MySQL 字符集与乱码与collation设置的问题?
    第2-3-2章 环境搭建-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss
    【LeetCode动态规划#08】完全背包问题实战与分析(零钱兑换II--求组合、组合总和IV--求排列)
    浮点数表示法(总结自CS61C和CMU CSAPP)
    图像数据通道格式:NCHW和NHWC的区别
  • 原文地址:https://blog.csdn.net/zsysingapore/article/details/126453892