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%。
完
欢迎讨论 欢迎吐槽