目录
1.什么是KNN算法
寻找最近的K个数据,推测新数据的分类(物理类聚,人与群分)。
如图,推测处于圆心的图形是什么形状,其距离两个红色三角相近,推测其可能是红色三角。
2.算法原理
通用步骤
-
计算距离:欧几里得距离或马氏距离
-
升序排列:距离最近的排前边,距离最远的排后边
-
取前K个
-
加权平均:距离近的权重较大,反之权重较小
注意事项
-
K的选取
-
K太大:导致分类模糊
-
K太小:受个例影响,波动较大
-
-
如何选取K
-
依据经验(如果之前处理过之类的问题,依据感觉经验,或者依据经验挨个试一试)
-
均方根误差
-
3.实战应用
#为了避免数据内部的巧合让算法看起来很合理,让数据进行随机的打乱处理
import random
import csv
#读取
with open('Prostate_Cancer.csv','r') as file:
reader = csv.DictReader(file)
datas = [row for row in reader]
#分组
random.shuffle(datas) #打乱数据顺序
n = len(datas)//3 #整除
test_set = datas[0:n] #0到n为测试集
train_set = datas[n:] #n之后为训练集
#距离(两点间距离公式)
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#csv文件里为字符串,要先转化为数字
return res**0.5
K=5
def knn(data):
#1.距离
res=[
{"result":train['diagnosis_result'],"distance":distance(data,train)} #找到数据data和训练项train的距离
for train in train_set #把所有训练项遍历一边
]
#2.排序--升序
res = sorted(res, key=lambda item:['distance'])
#3.取前K个
res2 = res[0:K]
#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'
#测试阶段
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)))
运行结果:
准确率:63.64%
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99506.html