利用numpy编写的一个分类代码——KNN

这段代码实现了一个简单的K最近邻(K-Nearest Neighbors,简称KNN)分类算法。KNN是一种基本的分类算法,其思想是:通过测量不同特征值之间的距离来进行分类。它的工作原理是:通过计算待分类样本与已知分类样本之间的距离,取距离最小的K个样本,看这K个样本中哪个类别最多,就把待分类样本分为这个类别。

下面是代码的逐行解释:

  1. 首先,导入了numpyoperator模块。numpy用于数组操作,operator模块提供了一个itemgetter函数,用于获取项的索引。

  2. 定义了两个NumPy数组xy,分别代表输入数据的特征和对应的真实类别标签。

  3. 定义了一个函数KNN_classify,它接受以下参数:

    • x:输入数据的特征数组。
    • y:对应的真实类别标签数组。
    • k:选择最近的K个邻居。
    • test_sample:待分类的样本。
  4. 在函数内部,首先计算了测试样本与所有输入数据之间的欧氏距离,并存储在distance数组中。

  5. 使用np.argsort对距离进行排序,得到从小到大的索引,存储在sortedIndex数组中。

  6. 创建一个字典labelCount,用于统计每个类别在最近K个邻居中的出现次数。

  7. 遍历排序后的索引数组sortedIndex的前K个元素,将对应的类别标签添加到labelCount字典中,并统计每个类别的出现次数。

  8. 打印出labelCount字典,显示每个类别的出现次数。

  9. 使用sorted函数对labelCount.items()进行排序,得到按出现次数降序排列的列表,并返回出现次数最多的类别及其计数。

  10. __main__部分,调用KNN_classify函数,传入输入数据、标签、邻居个数k=3,以及待分类的样本np.array([3,4])

  11. 打印出分类结果,即出现次数最多的类别及其计数。

  12. 打印出分类结果中类别的标签,即result[0][0],这表示最可能的类别标签。

在这个例子中,如果待分类样本是[3,4],并且k=3,那么算法会找到与[3,4]距离最近的3个样本,统计这3个样本中每个类别的出现次数,然后返回出现次数最多的类别作为分类结果。在给定的数据中,[3,4][4,4]的距离最近,其次是[4,3][2,2],因此,根据这3个样本,算法会将[3,4]分类为类别B

import numpy as np
import operator

x = np.array([[1, 1], [1, 1.5], [2, 2], [4, 3], [4, 4]])
y = np.array(['A', 'A', 'A', 'B', 'B'])

def KNN_classify(x, y, k, test_sample):
    distance = np.sum((x - test_sample)**2,axis=1) ** 0.5
    sortedIndex=np.argsort(distance)
    labelCount={}
    for index in sortedIndex[:k]:
        label=y[index]
        labelCount[label]=labelCount.get(label,0)+1
    print(labelCount)
    return sorted(labelCount.items(),key=operator.itemgetter(1),reverse=True)[0]
    """
    X:输入数据
    y:真实值
    k:邻居个数
    test_sample:待测试样本
    return:待测试样本类别
    """
if  __name__=="__main__":
    result=KNN_classify(x,y,3,np.array([3,4]))
    print(result)
    print(result[0][0])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值