• KNN学习代码理解尝试


    KNN介绍

    KNN(K-Nearest Neighbor)算法,意思是K个最近的邻居,从这个名字我们就能看 出一些KNN算法的蛛丝马迹了。K个最近邻居,毫无疑问,K的取值肯定是至关重要 的。那么最近的邻居又是怎么回事呢?其实啊,KNN的原理就是当预测一个新的 值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。

     

     图中绿色的点就是我们要预测的那个点,假设K=3。那么KNN算法就会找到与它距离 最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中 是蓝色三角形多一些,新来的绿色点就归类到蓝三角了

     

     但是,当K=5的时候,判定就变成不一样了。这次变成红圆多一些,所以新来的绿 点被归类成红圆。从这个例子中,我们就能看得出K的取值是很重要的。

     KNN实现步骤

    计算距离(欧几里得距离或者马氏距离)

    升序排列

    取前K个

    K的取值

            K太大:导致分类模糊

            K太小:受个例影响,波动较大

     加权平均

    经验

    KNN代码实战应用 

    KNN算法求病人癌症检测的正确率

    数据

     代码及注释

    1. import csv
    2. #Python提供了一个标准的类库CSV文件。这个类库中的reader()函数用来导入CSV文件。当CSV文件被读入后,可以利用这些数据生成一个NumPy数组,用来训练算法模型。:
    3. import random
    4. #导入随机函数模块
    5. # 读取数据
    6. with open("D:\Prostate_Cancer.csv", "r") as f:
    7. render = csv.DictReader(f)
    8. #csv.DictReader()读到的第一行数据就是键
    9. print(render)
    10. #<csv.DictReader object at 0x000002404794B910>
    11. datas = [row for row in render]
    12. #一行一行读取render里的数据放入列表,#使得每一个字典数据为列表中的元素
    13. # print(datas)
    14. #列表里放字典数据
    15. # 分组,打乱数据
    16. random.shuffle(datas)
    17. #random.shuffle()用于将一个列表中的元素打乱顺序,值得注意的是使用这个方法不会生成新的列表,只是将原列表的次序打乱。
    18. n = len(datas) // 3
    19. #获取数据1/3长度用于下面数据分开为测试类和训练类
    20. test_data = datas[0:n]
    21. #选取一部分数据用于测试
    22. train_data = datas[n:]
    23. #选取一部分数据用于训练
    24. # print (test_data)
    25. # print (train_data)
    26. print (train_data[0])
    27. # #输出训练列表第一个
    28. # print (train_data[0]["id"])
    29. # #输出训练列表第一个字典的id键对应的值
    30. # 计算对应的距离
    31. #"distance": distance(data, train)
    32. def distance(x, y):
    33. #函数传入两个参数后,我们定义一个元组,定义一个变量k依次遍历,元组中的值,
    34. # 而传入的x和y都是我们列表中的字典,这样我们可以求得字典所对应键值的value值,
    35. # 同时我们又发现value值为字符串模式,且存在大量小数,采用转型变成float型进行运算,并返回开方值
    36. res = 0
    37. for k in ("radius", "texture", "perimeter", "area", "smoothness", "compactness", "symmetry", "fractal_dimension"):
    38. res += (float(x[k]) - float(y[k])) ** 2
    39. return res ** 0.5
    40. def knn(data, K):
    41. # 1. 计算距离
    42. res = [
    43. {"result": train["diagnosis_result"], "distance": distance(data, train)}
    44. for train in train_data
    45. ]
    46. # 2. 排序
    47. sorted(res, key=lambda x: x["distance"])
    48. #输入是传入到参数列表X的值,输出是根据表达式distance(data, train)计算得到的值
    49. # print(res)
    50. # 3. 取前K个
    51. res2 = res[0:K]
    52. # 4. 加权平均
    53. result = {"B": 0, "M": 0}
    54. # 4.1 总距离
    55. sum = 0
    56. for r in res2:
    57. sum += r["distance"]
    58. #前K个的总距离
    59. # 4.2 计算权重
    60. for r in res2:
    61. # print(r)
    62. # print(r['result'])
    63. # print(result[r['result']])
    64. result[r['result']] += 1 - r["distance"] / sum
    65. #给权重赋值
    66. # 4.3 得出结果
    67. if result['B'] > result['M']:
    68. #输出概率大的结果
    69. return "B"
    70. else:
    71. return "M"
    72. # print(distance(train_data[0],train_data[1]))
    73. # 预测结果和真实结果对比,计算准确率
    74. #计算k取1-10的情况
    75. for k in range(1, 11):
    76. correct = 0
    77. #记录正确的个数
    78. for test in test_data:
    79. result = test["diagnosis_result"]
    80. #测试类的结果,良性肿瘤用“B”,恶性肿瘤用“M”表示
    81. result2 = knn(test, k)
    82. if result == result2:
    83. #相等时正确,正确数加1
    84. correct += 1
    85. print("k=" + str(k) + "时,准确率{:.2f}%".format(100 * correct / len(test_data)))
    86. #100 * correct / len(test_data,正确个数占测试个数的比例

    运行结果

     

  • 相关阅读:
    30 位学者合力发表 Nature 综述,10 年回顾解构 AI 如何重塑科研范式
    【Linux】学习记录_17_网络编程
    Qt编写物联网管理平台50-超强跨平台
    k8s的部署管理以及prometheus相关监控
    (C++)string类及其函数
    面对陕西省2022年职称评审政策调整有没有好的对策
    快速上手几个Linux命令
    合并不同年度收入数据-外连接
    文件流和文件描述符互相转换
    深度学习------pytorch实现猫狗数据集
  • 原文地址:https://blog.csdn.net/qq_63202674/article/details/127720797