KNN的理论和实践(带一个小的数据集)
KNN的理论和实践(带一个小的数据集)
KNN一个基础的python应用
1.KNN理论
KNN算法又称k近邻分类(k-nearest neighbor classification)算法。它是根据不同特征值之间的距离来进行分类的一种简单的机器学习方法,它是一种简单但是懒惰的算法。他的训练数据都是有标签的数据,即训练的数据都有自己的类别。KNN算法主要应用领域是对未知事物进行分类,即判断未知事物属于哪一类,判断思想是,基于欧几里得定理,判断未知事物的特征和哪一类已知事物的的特征最接近。它也可以用于回归,通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性)
2.1KNN的思想
1.找一个距离,例如最小的圆圈,圈内的训练样本数为3个,其中一个为矩形、两个三角形,待分类的数据从距离上看很可能是三角形。但是把虚线放大,放大到虚线的圆圈,其中有3个蓝色的矩形,2个红色的三角形,如果用这个距离绿色的圆很可能是蓝色矩形的分类。
2.2KNN算法的步骤
算法步骤如下:
1)算距离:给定未知对象,计算它与训练集中的每个对象的距离;
2)找近邻:圈定距离最近的k个训练对象,作为未知对象的近邻;
3)做分类:在这k个近邻中出线次数最多的类别就是测试对象的预测类别。
2.3KNN数据集
来自一个公众号,如有侵权自删。
链接:https://pan.baidu.com/s/1CjjA9mI7X5ynHus9JMNeeA
提取码:swl4
3.1本实例的简单思想
1.首先对数据进行分组,一组为训练集,一组为测试集。
2.定义欧式距离或者曼哈顿距离。(为了修改方便从KNN中拿出来自定义)
3.定义KNN算法,计算你要测试的数据和训练的数据之间的差值(求加权平均)
3.2代码实战
下面展示KNN 的代码代码
。
1.import csv
#读取
with open('Prostate_Cancer.csv', 'r') as file:
reader = csv.DictReader(file)
datas=[row for row in reader]
#分组分成两组数据(测试和训练)
n=len(datas)//3
test_set=datas[0:n]
train_ste=datas[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
return res**0.5
#knn的train
K=5
def knn(data):
#距离
res=[
{"result": train['diagnosis_result'], "distance": distance(data,train)}
for train in train_ste
]
#排序
res=sorted(res,key=lambda item:item['distance'])
#取前k个
res2=res[0:K]
#加权平均
result={'B': 0, 'M': 0}
#总距离
sum=0
for r in res2:
sum=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(correct)
print(len(test_set))