Knn算法实战

本文深入探讨了KNN算法的基本原理,包括算法的通用步骤、距离计算方法、k值选择的重要性及其对分类效果的影响。通过一个实际案例,演示了如何使用Python进行数据读取、距离计算、排序、k值选取及最终的加权平均预测,同时提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


数据集可以在下方留言找我要
或者
在这里插入图片描述

一、认识knn算法

寻找最近的k个数据,推测新数据的分类。

二、算法原理

通用步骤

  • 计算距离(常用欧几里得距离或者马氏距离)
  • 升序排序
  • 取前k个
  • 加权平均

k的选取

  • k太大:导致分类模糊
  • k太小:受个例影响,波动较大

如何选取k

  • 经验
  • 均方根误差

读取数据

import csv
with open('E:\资资\python练习\knn\Prostate_Cancer.csv','r') as file:
    #DictReader把数据读成字典
    reader = csv.DictReader(file)
    datas=[row for row in reader]
print(datas)

在这里插入图片描述

算距离

K=5
def knn(data):
    #1距离
    res = [
        {"result":train['diagnosis_result'],"distance":distance(data,train)}
        for train in train_set
    ]
    print(res)
knn(test_set[0])

在这里插入图片描述

#2排序
    res = sorted(res,key=lambda item:item['distance'])
    print(res)

在这里插入图片描述

knn

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'])
    #取前k个
    res2=res[0:K]
    #加权平均
    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
    #输出预测的结果
    print(result)
    #输出本身结果
    print(data['diagnosis_result'])

在这里插入图片描述
在这里插入图片描述

测试

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

在这里插入图片描述

三、完整代码

import random
import csv
#数据读取
with open('E:\资资\python练习\knn\Prostate_Cancer.csv','r') as file:
    #DictReader把数据读成字典
    reader = csv.DictReader(file)
    datas=[row for row in reader]
#分组
#分成训练集和测试集
#打乱顺序,防止偶然性
random.shuffle(datas)
n = len(datas)//3
test_set = datas[0:n]
train_set = datas[n:]
#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'])
    #取前k个
    res2=res[0:K]
    #加权平均
    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
    #输出预测的结果
    #print(result)
    #输出本身结果
    #print(data['diagnosis_result'])
    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)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值