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,操作更方便哦