KNN的学习
Knn是什么:
寻找周围数据,来判断该数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fzRqOu2Z-1629888088594)(C:\Users\86188\AppData\Roaming\Typora\typora-user-images\image-20210825151830310.png)]
算法原理,要注意K值得大小,注意K值得选取方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FeypeWlG-1629888088601)(C:\Users\86188\AppData\Roaming\Typora\typora-user-images\image-20210825152049756.png)]
理论总结:KNN算法是解决由周围相似数据推断该数据得方法,一个数据未知,但是我们可以通过它周围得数据进行对该数据得推断,主要用到升序排列,取前K个(但要注意K值大小),加权平均。
实战演练
进行癌症数据集得处理:
读取csv数据,进行数据得随机处理和分割,进行距离得初步测算
import csv
import random
#读取数据
with open('prostate_Cancer.csv','r') as file:
reader =csv.DictReader(file)
datas=[row for row in reader]
# for row in reader:
# print(row) 比较喽得遍历,数据读取
#分组,三分之一,三分之二
random.shuffle(datas)
n = len(datas)//3 #进行整除
#进行数据得分割,测试数据test_set和训练数据train_set
test_set=datas[0:n]
train_set=datas[n:]
#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 # 注意书写,float得作用域
return res**0.5
进行knn得核心部分,升序排列,取前K个(但要注意K值大小),加权平均
K=5
def knn(data):
#算距离
res=[
{"result":train['diagnosis_result'],"distance":distance(data,train)}
for train in train_set
]
# 排序
res =sorted(res, key=lambda item:item['distance'])
# 取前n个
res2=res[0:K]
# 加权
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'
测试代码,转化为百分比
#测试阶段
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)))
correct+=1
print(“准确率:{:.2f}%”.format(100*correct/len(test_set)))