22行代码(python)快速实现KNN及可视化(附数据下载链接)

本文使用简单的例子,使用22行代码(刨除注释),快速实现knn。为了更加方便理解,没有使用knn的函数,只是用了简单的矩阵操作和计数操作,希望对初学者有帮助。

先来看看数据的格式:
在这里插入图片描述
在这里插入图片描述
(下载地址:链接:https://pan.baidu.com/s/1j3JsTJUZtV0sgQEVl0UQJg 提取码:7idx )

每一个动物对应17个特征,包括有没有羽毛、下不下蛋等。其中最后一个特征(第二幅图的最后一列)表示动物的类别。我们的目的是使用前面的16个特征利用knn预测动物的类别。所以没有使用到动物的名字信息。

话不多说,直接上代码,改一下读取数据的路径,可以直接跑通:

#使用属性预测动物的7种类别
import pandas as pd
import numpy as np
from collections import Counter
#读数据,别忘了改路径
ZooData = pd.read_csv('/your_path/zoo.csv')
#将dataframe转换为数组,方便计算,同时舍弃了动物的名字的信息,因为对于这个程序没有用
X = np.array(ZooData.iloc[0:101,1:17])
Y = np.array(ZooData.iloc[0:101,17])
#超参数k取4
k = 4
#总共101个数据,将每一个数据分别拿出来进行预测,预测对的数量为predict_true
predict_true = 0
for i in range(0,101):
    #取出要预测的样本
    x_p = X[i]
    y_p = Y[i]
    #从数据中删除要预测的样本
    X_p = np.delete(X,i,axis=0)
    Y_p = np.delete(Y,i,axis=0)
    #计算待预测样本与数据中其它样本的距离
    distances=[np.sqrt(np.sum((x_p-x)**2)) for x in X_p]
    #排序
    d = np.sort(distances)
    #排序的索引号
    nearest = np.argsort(distances)
    #取出最接近的k个
    topk_y = [Y_p[j] for j in nearest[:k]]
    #接近最多的作为预测标签
    votes = Counter(topk_y)
    predict_y=votes.most_common(1)[0][0]
    #预测对了,predict_true增加1
    if(predict_y==y_p): predict_true += 1
#计算正确率    
precision = predict_true/101        
#雷达图可视化
pd.plotting.radviz(ZooData.iloc[0:100,1:18], 'class_type')

代码的注释写的很清晰了,不再赘述。最后看一下可视化的雷达图。

在这里插入图片描述
可以发现还是有一定的分布规律的,当超参数k=4的时候,准确率可以达到94%。

欢迎讨论 欢迎吐槽

发布了38 篇原创文章 · 获赞 142 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39417323/article/details/89336396
今日推荐