K近邻算法介绍
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。
本文介绍
本文利用python3+sklearn库自带的鸢尾花数据集,进行简单的KNN算法实现。下图展示了sklearn库中一些自带的数据的调用方法。
代码
以下是本次实例的详细代码。
# -*- coding: utf-8 -*-
# @Time : 2019-12-09 15:49
# @Author : lpeng
# @File : test
# @Software : PyCharm Community Edition
"""
函数说明:KNN算法,分类器
parameters:
test_data - 测试数据
train_data - 训练数据
labels - 分类标签
k - KNN算法参数,选择距离最小的k个点
return:
return sortedclasscount[0][0] - 分类结果
author:
fuyunjidun
email:
fuyunjidun@sina.com
modify:
2019-12-10
"""
from sklearn import datasets
import numpy as np
import operator
def classfy0(test_data,train_data,labels,k):
#训练数据的行数
train_data_size = train_data.shape[0]
#在列向量上重复test_data共1次(横向)
#在行向量上重复test_data共train_data_size次(纵向)
#并与训练数据做差
diffmat = np.tile(test_data,(train_data_size,1)) - train_data
#计算测试数据预训练数据之间的差值的平方
sqdiffmat = diffmat**2
#计算测试数据各个特征向量与训练数据各个特征向量平方和,其中,sum(0)列相加,sum(1)行相加
sqdistances = sqdiffmat.sum(axis=1)
#计算距离
distances = sqdistances**0.5
#返回distances中元素从小到大排序后的索引值
sorteddistindex = distances.argsort()
#顶一个记录类别次数的字典
classcount = {}
for i in range(k):
#取出前k个元素的类别
voteilabel = labels[sorteddistindex[i]]
#计算类别次数
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
# key = operator.itemgetter(0) 根据字典的键进行排序
# key = operator.itemgetter(1) 根据字典的值进行排序
# reverse降序排序字典
sortedclasscount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)
#返回次数最多的类别,即所要分类的类别
return sortedclasscount[0][0]
if __name__ == '__main__':
iris = datasets.load_iris()
train_data = iris.data
labels = iris.target
flowernames = ['Setosa','Versicolour','Virginica']
test_data = np.array([4,3,2,2])
test_class = classfy0(test_data,train_data,labels,30)
print('The predicted flower is:'+ flowernames[test_class]+'!')