knn算法基础理解

本文介绍了k近邻(kNN)算法的基本原理和步骤,包括数据预处理、距离计算、选择合适的k值等关键环节。通过一个癌症检测的实例展示了kNN算法在实际中的应用,使用Python实现了算法并评估了其准确率。kNN算法具有精度高、对异常值不敏感的优点,但也存在计算复杂度高的问题。文章还探讨了k值选择的影响,指出k值的适当选取对算法性能至关重要。
摘要由CSDN通过智能技术生成

1  什么是knn算法

                首先要认识knn算法,什么是knn算法?简单一句话就是寻找最近的k个数据,来推测新数据的分类,确定新数据的大概类型。简而言之,就可以理解为“看一个人怎么样,看看他身边的朋友什么样就知道了”,有点人以类聚,物以群分的意思,以总体情况推测某一个个体怎么样。多应用于数据分析,如医院的某检测系统,初步判断是否确诊。下面将会给出一个简单的医院示例。

2  算法原理

                     * 通用步骤

                                 1计算距离(常用欧几里得距离或马氏距离)

                                 2升序排列

                                 3取前k个

                                 4 加权平均

                      *K的选取(核心)

                                1  k太大:导致分类模糊

                                2  k太小:受个例影响,波动较大

                             K取值大致有两种通用方法:

                                        1 靠经验,比如经常处理相关问题,知晓什么值合适

                                        2 不断试,比如第一遍取8,准确性达到了70%,则说明可以,然后换一个6,准确性下降了,则需要取靠近8的数

                        *如何选取k

                                    1 经验(上面说过)

                                    2 均方根误差

                                                比如概率统计中的峰值高的部分

3  实战应用

        从数据表中分析(由于实验部分,所以数据集较小)

以上是癌症检测数据 M,B则说明是否有病,比如True和False,其他的都是一些化验数据

数据集链接:https://pan.baidu.com/s/1w8cyvknAazrAYnAXdvtozw
提取码:zxmt

import csv
import random
#读取
with open("Prostate_Cancer.csv","r") as file:#读入文件并写入
    reader = csv.DictReader(file)#以字典形式读取
    datas = [row for row in reader]#推导

#分组
random.shuffle(datas)#打乱数据
n = len(datas)//3#整除
#2/3训练集
train_set = datas[n:]
#1/3测试集
test_set = datas[0:n]
# print(test_set)
#KNN
#距离
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
    ]
    #2.排序--升序
    res=sorted(res,key=lambda item:item['distance'])

    #3.取前K个
    res2=res[0:K]
    #4.加权平均
    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'

#测试阶段
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)))

得到结果

说明准确性达到78%,有一些误差,数据不够,训练集少了,但是78%的准确性已经可以反映出大致情况了,当然具体检测结果还得医院仪器检测,此数据只能起统计意义,可以用在炒股方面。 

4   knn k近邻算法原理

        由于小编在家没事做,所以在网上查看了诸多内容后对这个k值的选择又有了更深理解。

k近邻算法:简单地说,k近邻算法采用测量不同特征值之间的距离方法进行分类。

优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。 适用数据范围:数值型和标称型。
      k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

具体代码展示小编还没有实现,后续有机会会继续更新,喜欢就关注一下吧!
 

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值