KNN算法实例讲解

KNN算法是什么?

寻找最近的k个数据,推测新数据的分类

算法原理

通用步骤

1.计算距离
2.升序排序
3.取前K个
4.加权平均

K的选取

太小:受个例影响较大,波动很大
大大:导致分类模糊

K选取注意:

(1)自己需要尝试不同的K,以求达到最好的效果
(2)均方根误差

实践题目

KNN算法预测病人是否患癌症,并输出预测的正确率!
检验结果:
B(良性)
M(恶性)
检验数据类型判断患癌症的依据判断患癌症的依据

数据集(展示一部分,下载链接在最后)

在这里插入图片描述

代码实现思路:

1.加载数据
2.设置训练集和测试集 或者分别加载训练集和测试集
3.计算距离(欧式距离计算公式)在这里插入图片描述
4.从小到大的排序
5.取前K个
6.加权平均(离得越近,权重越高)

代码实现
'''
KNN算法求病人癌症检测的正确率
检验结果:
B(良性)
M(恶性)
'''
import csv     #读取功能包
import random
#数据读取
with open(r"C:\Users\七夜\Desktop\Prostate_Cancer.csv") as file:
    render=csv.DictReader(file)   #读取数据返回一个字典
    datas=[row for row in render]
#分组
random.shuffle(datas)  #打乱datas的顺序
n=len(datas)//3
test_set=datas[0:n] #测试集
train_set=datas[n:] #训练集
#print(test_set)
#KNN
#1.距离
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 输出的形式 diagnosis_result检测结果和距离
    res=[
        {"result":train['diagnosis_result'],"distance":distance(data,train)}
        for train in train_set
    ]
    #2排序
    sorted(res,key=lambda item:item['distance'])
    print(res)
    #3取前K个
    res2=res[0:K]
    #4加权平均
    result={'B':0,'M':0}
    #总距离
    sum=0
    for r in res2:
        sum+=r['distance']
    #计算B或M权重
    for r in res2:
         result[r['result']]+=1-r['distance']/sum

    #根据权重大小得出结果
    if result['B']>result['M']:
         return 'B'
    else:
         return 'M'
    #预测结果和真实结果得出准确度
correct=0
for test in test_set:
    result=test['diagnosis_result']
    result2=knn(test)
    if result==result2:
        correct+=1
print("{:.2f}%".format(100*correct/len(test_set)))
代码截图:

在这里插入图片描述

数据集下载链接:

链接:https://pan.baidu.com/s/1P2c9kLWs03VRNv20Q20PzA 提取码:n73p 复制这段内容后打开百度网盘手机App,操作更方便哦

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页