KNN算法,也称为K邻近算法,可以解决回归和分类问题,但解决分类问题才是它的优势。
KNN算法的本质就是寻找与我们提供的数据相似的k个样本,然后判断这k个样本的标签,最后统计每个标签出现的次数,次数最多的标签,就会被当作我们提供的数据的标签。
先说说工作流程:
机器学习是基于数据的,所以要先将实物转换为向量、矩阵或张量的形式 通过欧式距离计算出测试样本与其他样本之间的距离 将距离按照小到大排序,并取前K个值 判断前K个值相应的标签,并进行统计 统计最多的标签即为预测结果现在我们来动手实现一下
先导入所有需要导入的库或模块
# 导入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()
# 将样本特征存储到X
X = data['data']
# 将样本标签存储到Y
Y = 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.921
结果还算是比较准确,圆满收工,你学会了吗?
LuLiangJun001 原创文章 8获赞 0访问量 203 关注 私信 展开阅读全文