KNN的理论和实践(带一个小的数据集)

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))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值