本文主要内容:
1.认识什么是knn算法
2.算法原理
3.实战应用
1.认识什么是knn算法:
2.算法原理:
(1)通用步骤:
a.计算距离(常用欧几里得距离或着马氏距离)
欧几里得公式:
b.升序排列
c.取前k个数
k的选取:
k太大会导致分类模糊
k太小会受个例影响,波动较大
如何选取k:
可以依靠经验
均方根误差
找到准确性峰值的点作为k的取值
d.加权平均
3.实战应用
用一个癌症检测数据集为例(数据集较小)
(1)打开数据
import csv
import random
#读取数据
with open('Prostate_Cancer.csv','r') as file:
reader=csv.DictReader(file)
datas=[row for row in reader]
数据集链接:链接:https://pan.baidu.com/s/1w8cyvknAazrAYnAXdvtozw
提取码:zxmt
(2)分组(数据集的三分之二作为训练集,三分之一作为测试集)
random.shuffle(datas)
n = len(datas)//3
test_set=datas[0:n]
train_set= datas[n:]
(3)计算距离(测试数据与所有训练数据之间的距离)
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):
#1.距离
res=[
{"result" : train['diagnosis_result'],"distance":distance(data,train)}
for train in train_set
]
(4)升序排列
res = sorted(res,key=lambda item:item['distance'])
(5)取前k个数
res2 =res[0:K]
(6)加权平均(距离小的权重大,距离大的权重小),先测得总距离,利用1-(该测试数据的距离/总距离)作为该测试数据的权重
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'
(7)测试
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)))
(8)结果