KNN邻近算法(K-NearestNeighbor)的小例子

分类的算法KNN:物以类聚,人以群分

KNN是通过测量不同特征值之间的距离进行分类。
思路是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。

即:从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。
在这里插入图片描述

import csv
import random
# 读取
with open('./data/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        #算法结果的准确性跟K值和距离的计算方式有很大关系,实际中需要不断调整来获取更高的准确率
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    # 1-r['distance']/sum 就是权重  r['result']表明是给B加权,还是给M加权

    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('测试集的总条数有%d个' % len(test_set))
print('预测正确的结果有%d个' % correct)
print('准确率:{:.2f}%'.format(100*correct/len(test_set)))

代码来源:
【智源学院】30分钟KNN算法-有意思专题系列(K-Nearest Neighbor, KNN)
https://www.bilibili.com/video/av38115160?t=2210

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值