KNN-K最近邻算法+实例应用

本文介绍了KNN(K最近邻)算法的基本原理,包括计算距离、选择K值、加权平均等步骤,并通过实例展示了如何使用KNN算法预测癌症的良性与恶性。在实际操作中,首先对数据进行预处理和划分,然后运用欧几里得公式计算样本间距离,选取K值为5,通过对训练集的加权平均进行预测,最后评估了预测的准确率。
摘要由CSDN通过智能技术生成

KNN-K最近邻算法

什么是KNN算法

KNN算法是寻找最近的K个数据,推测新数据的分类

数据样本

算法原理

通用步骤

  1. 计算距离(常用有欧几里得距离、马氏距离)
  2. 升序排序
  3. 取前K个
  4. 加权平均

K的选取

  • K太大:会导致分类模糊
  • K太小:容易受个例影响,波动较大
  • 选取:均方根误差(找到峰值

实例:预测癌症良性 OR 恶性

完整数据:免费下载
数据样本

数据分析与预处理

M:恶性

B:良性

其他数据为判断良性 、 恶性的依据

划分数据集

取数据的1/3作为测试集,2/3作为训练集

import random
import csv

# 癌症预测数据文件读取
with open("Prostate_Cancer.csv", "r") as file:
    reader = csv.DictReader(file)
    datas = [row for row in reader]

# 分组 -训练集2/3  -测试集1/3
# 将数据打乱,每次得到不同的分组
random.shuffle(datas)
n = len(datas) // 3

test_set = datas[0:n]
train_set = 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

选取K值

先尝试K取5

将运算后的数据按距离升序排列

选取距离最小的k个样点

加权平均

分类计算加权平均距离,多数表决预测

源码

import random
import csv

# 癌症预测数据文件读取
with open("Prostate_Cancer.csv", "r") as file:
    reader = csv.DictReader(file)
    datas = [row for row in reader]

# 分组 -训练集2/3  -测试集1/3
# 将数据打乱,每次得到不同的分组
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"])

    # 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

    # 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("准确个数:", correct)
print("测试总数:", len(test_set))

print("准确率:{:.2f}%".format(100 * correct / len(test_set)))

完整训练数据免费下载

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鳄鱼儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值