1.什么是KNN算法
KNN(K-Nearest Neighbor)是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻近值来代表。算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。(物以类聚人以群分)
2.KNN算法的原理
KNN的原理就是当预测一个新的样本x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。换句话说就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类。
通用步骤:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
三、实战应用
1、下载数据集并导入包
数据集:使用的是一个癌症的检测数据 如下为下载链接
https://www.bilibili.com/video/BV1Nt411i7oD?from=search&seid=4603953531395093043
导入包:直接在终端下载即可,,即输入pip install csv
import csv
import random
2、读取数据
#读取
with open('Prostate_Cancer.csv','r')as file:
reader=csv.DictReader(file)
datas=[row for row in reader]
3、数据分块—test和train
# 分组
random.shuffle(datas)
n=len(datas)//3
test_set=datas[0:n]
train_set=datas[n:]
4、KNN算法
1)距离(使用欧几里得距离)
# 距离
def distance(d1,d2):
res=0
for key in("radius","texture","perimeter" , "area","smoothness","compactness","symmetry","fractal_dimension"):
res+=pow((float(d1[key])-float(d2[key])),2) #csv文件读取进来是字符串的形式
return pow(res,0.5)
K = 4
def knn(data):
# 1、距离
# 这里的形式是,病情分析的结果与目标数据之间的距离组成
res=[
{
"result": train ['diagnosis_result'],"distance":distance(data,train)
}
for train in train_set
]
2)升序
# 升序排列
res=sorted(res,key=lambda item:item['distance'])
3)取前K个值
# 取前K个值
res2 = res[0:K]
4)加权平均
# 加权平均 0表示权重
result = {'B':0,'M':0}
5)计算总距离
# 计算总距离
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'
5、测试
# 测试
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)))