1算法简介:
机器学习算法中最简单的基本分类与回归算法。工作原理:训练样本集的每一个数据都有对应的标签。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。而提取时,会选择距离排序,选择最相近的前k个数据中出现最多的标签,这个标签,就是新数据的标签。
算法步骤:
- 计算已知类别数据集中的点与当前点之间的距离;
- 按照距离递增次序排序;
- 选取与当前点距离最小的k个点;
- 确定前k个点所在类别的出现频率;
- 返回前k个点所出现频率最高的类别作为当前点的预测分类
2代码实现:
2.1.准备数据集--数据处理(使用python导入数据,这里需要用到numpy,安装遇坑参见numpy填坑日记)
为了更直观验证,选取简单数据坐标轴上的位置极易判断:
import numpy as np
import operator
def createDataSet():
#四组二维特征
group = np.array([[0,1],[0.3,3],[3.1,0],[3.2,1]])
#四组特征的标签
labels = ['a','a','b','b']
return group, labels
2.2 K-临近算法(分类器)
--计算待测点与每一个样本点的距离,根据距离从小到大进行排序,选出距离最近的k个点中出现次数最多的标签,作为待测点的标签:
Parameters:
inX - 待分类的数据
dataSet - 训练集
labes - 分类标签
k - kNN算法参数,选择距离最小的k个点
Returns:
sortedClassCount[0][0] - 分类结果
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
#在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat**2
#sum(1)行相加
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
#返回distances中元素从小到大排序后的索引值
sortedDistIndices = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]]
#计算类别次数
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#reverse降序排序字典
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#返回次数最多的类别,即所要分类的类别
return sortedClassCount[0][0]
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#测试集
test = [4,0]
test_class = classify0(test, group, labels, 3)
print(test_class)
运行结果如下: