KNN聚类的原理和实现

1.什么是KNN算法

KNN(K-Nearest Neighbor)是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻近值来代表。算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。(物以类聚人以群分)

2.KNN算法的原理

KNN的原理就是当预测一个新的样本x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。换句话说就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类。
通用步骤:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

三、实战应用
1、下载数据集并导入包
数据集:使用的是一个癌症的检测数据 如下为下载链接

https://www.bilibili.com/video/BV1Nt411i7oD?from=search&seid=4603953531395093043

导入包:直接在终端下载即可,,即输入pip install csv

import csv
import random

2、读取数据

#读取
with open('Prostate_Cancer.csv','r')as file:
    reader=csv.DictReader(file)
    datas=[row for row in reader]

3、数据分块—test和train

# 分组
random.shuffle(datas)
n=len(datas)//3
 
test_set=datas[0:n]
train_set=datas[n:]

4、KNN算法

1)距离(使用欧几里得距离)

# 距离

def distance(d1,d2):
    res=0
 
    for key in("radius","texture","perimeter" , "area","smoothness","compactness","symmetry","fractal_dimension"):
        res+=pow((float(d1[key])-float(d2[key])),2)    #csv文件读取进来是字符串的形式
    return pow(res,0.5)
K = 4
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个值

# 取前K个值
    res2 = res[0:K]

4)加权平均

# 加权平均  0表示权重
    result = {'B':0,'M':0}

5)计算总距离

# 计算总距离
    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'

5、测试

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
KNN(k最近邻)聚类是一种无监督学习算法,主要基于数据点之间的距离来进行聚类。其原理是根据每个数据点与其最近邻数据点的距离来决定该数据点所属的聚类。 首先,KNN聚类算法需要确定聚类的个数K,即将数据划分为K个不同的类别。然后,算法根据每个数据点与其最近邻数据点的距离进行划分。具体步骤如下: 1. 初始化聚类中心:随机选择K个数据点作为初始聚类中心。 2. 计算距离:对于每个数据点,计算其与聚类中心之间的距离,通常使用欧氏距离或曼哈顿距离。 3. 分配数据点:将每个数据点分配给与其距离最近的聚类中心所在的类别。即将数据点所属的聚类标签设为与其距离最近的聚类中心的标签。 4. 更新聚类中心:对于每个聚类,根据其所包含的数据点,重新计算其聚类中心的位置。通常是将该聚类所包含数据点的均值作为新的聚类中心。 5. 重复步骤3和4,直到聚类中心不再变化或达到预定的迭代次数。 KNN聚类的优点是简单易懂,易于实现,并且可以适应不同形状和大小的聚类。然而,它也存在一些缺点,如对初始聚类中心的选择较为敏感,聚类个数K需要事先确定,且算法的效率较低。 总而言之,KNN聚类是一种基于距离的算法,通过度量数据点之间的距离来划分聚类。它被广泛用于数据挖掘、模式识别等领域,对于简单的聚类问题具有一定的有效性和实用性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值