笔记|【深度学习】KNN算法学习

一.定义
KNN(K-Nearest Neighbor)算法,意思是K个最近的邻居。K个最近邻居,毫无疑问,K的取值肯定是至关重要的。
其实,IKNN的原理就是当预测一个新的值x的时候,需要根据它距离最近的K个点是什么类别来判断x属于哪个类别。
笔记|【深度学习】KNN算法学习
文章图片

图中绿色的点就是我们要预测的那个点,假设K=3。
那么KNN算法就会找到与它距离最近的三个点(这里用圆圈把它圈起),看看哪种类别多一些。
上图范围内,绿色方块对应的就是蓝三角。
二.KNN计算
1.计算距离(欧几里得距离或者马氏距离)
笔记|【深度学习】KNN算法学习
文章图片

2.升序排列
对所有点的距离进行一个升序排列。
3.取前K个
K的取值是十分重要的,应该合理科学结合有关数据去取K的值。
K太大:导致分类模糊
K太小:受个例影响,波动较大
4.加权平均去看那个点距离更近
三.KNN算法实战
病人的数据分析
【笔记|【深度学习】KNN算法学习】笔记|【深度学习】KNN算法学习
文章图片

1.读取数据

import csv import random #读取数据 with open(".\Prostate_Cancer.csv","r") as f: render = csv.DictReader(f) datas = [row for row in render]

2.分组,打乱数据 (减小数据的偶然性,增加数据的随机性)
random.shuffle(datas) n = len(datas)//3 test_data = https://www.it610.com/article/datas[0:n] train_data = datas[n:] # print(train_data[e]) # print (train_data[e]["id"])

3.计算对应距离
def distance(x, y): res = 0 for k in ("radius","texture","perimeter","area", "smoothness","compactness","symmetry","fractal_dimension") : res +=(float(x[k])-float(y[k]))**2 return res ** 0.5#K=6 def knn(data,K):#1.计算距离 res = [ {"result":train["diagnosis_result"], "distance":distance(data,train)} for train in train_data ]#2.排序 sorted(res,key=lambda x:x["distance"]) # print(res)#3.取前K个 result = res[0:K]#4.加权平均 result = {"B":0,"M":0}#4.1总距离 sum = 0 for r in res2: sum += r["distance"]#4.2计算权重 for r in res2: result[r['result']] += 1-r["distance"]/sum #4.3得出结果 if result['B'] > result['M']: return "B" else: return "M"

4.预测结果和真实结果对比,计算准确率
for k in range(I,10): correct = 0 for test in test_data: result = test["diagnosis_result"] result2 = knn(test,k) if result == result2: correct += 1 print("k="+str(k)+"时,准确率{:.2f}%".format(100*correct/ len(test_data)))

四.总结
KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN方法思路简单,易于理解,易于实现,无需估计参数。

    推荐阅读