学习笔记-机器学习KNN算法实践

1,KNN是什么

KNN(k-nearest neighbor classification)K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。
该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
举例:如果张三的行为举止,言谈,家庭背景等和村里面的K个人都很相似,恰好这K个人又都是属于某种特征的人,比如说都是好人,那么我们就可以推测张三也是一个好人。

2,算法原理

2.1,通用步骤

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

2.2,K的选取

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

2.3,如何选取K值

  • 靠经验
  • 均方根误差

3,实践应用

以一份医学数据为例,数据集来源:https://pan.baidu.com/s/1w8cyvknAazrAYnAXdvtozw
提取码:zxmt
代码及必要注释:

# 读取数据
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

# 取前1/3作为测试集,余下做训练集
test_set = datas[0:n]
train_set = datas[n:]
# 关键就在于K的选取,K值过大或者过小都不适合
K = 5


# 计算测试和训练数据之间的距离
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具体实现
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'])
    # print(res)
    # 3取前k个
    res2 = res[0:K]
    # print(res2)
    # 4加权平均
    result = {"B": 0, "M": 0}

    # 总距离
    total_distance = 0
    for r in res2:
        total_distance += r['distance']

    for r in res2:
        result[r['result']] += 1 - r['distance'] / total_distance

    if result['B'] > result['M']:
        return 'B'
    else:
        return 'M'


# 测试阶段
correct = 0
for test in test_set:
    result_real = test['diagnosis_result']
    result_predict = knn(test)

    if result_real == result_predict:
        correct += 1

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

本文内容来源:https://www.bilibili.com/video/BV1Nt411i7oD?spm_id_from=333.999.0.0

我是dyson不只是吹风机,若是对大数据-数据仓库技术感兴趣的可以加我沟通交流,一起进步。VX:daijun1211

ps:若文章侵权、触犯隐私请联系作者删除,谢谢~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值