深度学习算法第一课——KNN聚类的原理和实现

目录

1.什么是KNN算法

2.算法原理

通用步骤

注意事项 

3.实战应用 


1.什么是KNN算法

    寻找最近的K个数据,推测新数据的分类(物理类聚,人与群分)

 

    如图,推测处于圆心的图形是什么形状,其距离两个红色三角相近,推测其可能是红色三角。

2.算法原理

通用步骤

  • 计算距离:欧几里得距离或马氏距离

  • 升序排列:距离最近的排前边,距离最远的排后边

  • 取前K个

  • 加权平均:距离近的权重较大,反之权重较小

注意事项

  • K的选取

    • K太大:导致分类模糊

    • K太小:受个例影响,波动较大

  • 如何选取K

    • 依据经验(如果之前处理过之类的问题,依据感觉经验,或者依据经验挨个试一试)

    • 均方根误差

3.实战应用 

数据集:癌症检测数据-- 提取码: wa63

#为了避免数据内部的巧合让算法看起来很合理,让数据进行随机的打乱处理
import random
import csv
#读取
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  #整除

test_set = datas[0:n]   #0到n为测试集
train_set = datas[n:]   #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#csv文件里为字符串,要先转化为数字
        return res**0.5

K=5
def knn(data):
    #1.距离
    res=[
        {"result":train['diagnosis_result'],"distance":distance(data,train)}      #找到数据data和训练项train的距离
        for train in train_set      #把所有训练项遍历一边
    ]
    #2.排序--升序
    res = sorted(res, key=lambda 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)))

运行结果:

准确率:63.64%

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值