千家信息网

怎么实现一个KNN算法

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,怎么实现一个KNN算法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。教你如何自己实现KNN算法KNN算法,也称为K邻近算
千家信息网最后更新 2024年11月27日怎么实现一个KNN算法

怎么实现一个KNN算法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

教你如何自己实现KNN算法

KNN算法,也称为K邻近算法,可以解决回归和分类问题,但解决分类问题才是它的优势。

KNN算法的本质就是寻找与我们提供的数据相似的k个样本,然后判断这k个样本的标签,最后统计每个标签出现的次数,次数最多的标签,就会被当作我们提供的数据的标签。

先说说工作流程:

  1. 机器学习是基于数据的,所以要先将实物转换为向量、矩阵或张量的形式

  2. 通过欧式距离计算出测试样本与其他样本之间的距离

  3. 将距离按照小到大排序,并取前K个值

  4. 判断前K个值相应的标签,并进行统计

  5. 统计最多的标签即为预测结果

现在我们来动手实现一下

先导入所有需要导入的库或模块

# 导入sklearn自带的数据集from sklearn import datasets# 导入计数器,用于统计标签出现的次数from collections import Counter# 用于分割数据集from sklearn.model_selection import train_test_split# 用于计算欧式距离import numpy as np

其次,导入iris数据集,存储样本特征和标签

data = datasets.load_iris()# 将样本特征存储到XX = data['data']# 将样本标签存储到YY = data['target']

然后为了后期评估模型,这里将数据集分为训练集和测试集

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,random_state=2000)

设置random_state为固定值,这样每次的运行结果就会一样,帮助我们判断过程出现的bug

再次,写一个计算距离的函数eus_dis

def eus_dis(instance1, instance2):    '''计算两个样本之间的距离      instance1:array型      instance2:array型    '''    distance = np.sqrt(sum((instance1-instance2)**2))    return distance

接着,真正的开始实现KNN算法

def KnnClassify(X,Y,test,k):    '''实现KNN算法        X:特征训练集-->array型        Y:标签训练集-->array型        test:特征测试集-->array型        k:邻近值-->int    '''    # 计算样本之间的距离    distances = [eus_dis(x, test) for x in X]    # 按照从小到大排序,并取前K个值,返回下标    kneighbors = np.argsort(distances)[:k]    # 统计每个标签出现的次数    count = Counter(Y[kneighbors])    # 返回出现次数最多的标签    return count.most_common()[0][0]

最后我们来进行测试,观察其准确率

# 存储模型对特征测试集的预测结果predirect = [KnnClassify(X_train,Y_train,test,5) for test in X_test]# 计算预测结果与实际结果相等的个数count = np.count_nonzero((predirect==Y_test)==True)print("该模型的预测准确率为:%.3f" % (count/len(X_test)))

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0