《机器学习实战》读书笔记-1
#(本人开发工具为PyCharm,Python版本是3.5)
第二章 KNN
2.1 概述
k-紧邻算法的一般流程:
- 收集数据:可以使用任何方法
- 准备数据:距离计算所需要的数值,最好是结构化的数据格式
- 分子数据:可以使用任何方法
- 训练数据:此步骤不适应于k-紧邻算法
- 测试数据:计算错误率
- 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-紧邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理
2.1.1 准备数据
创建名为kNN.py的Python模块
import numpy as np import operator def createDataSet(): group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] return group,labels
在文件夹中创建另外一个.py文件
import kNN group,labels = kNN.createDataSet() print('group = ',group,'\n','labels = ',labels)
运行结果:
group = [[ 1. 1.1] [ 1. 1. ] [ 0. 0. ] [ 0. 0.1]] labels = ['A', 'A', 'B', 'B']
group中有四组数据,每组数据有两个属性或者特征值,labels包含了数据点的标签信息
2.1.2 实施kNN算法
对未知类别属性的数据集中的每个点依次执行以下操作:
- 计算已知类别数据集中的点与当前点之间的距离
- 按照距离递增次序排序
- 选取与当前点距离最小的k个点
- 确定前k个点所在类别的出现频率
- 返回前k个点出现频率最高的类别作为当前点的预测分类
程序清单2-1 k-紧邻算法
def classify0(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0] #取出dataSet的shape diffMat = np.tile(inX,(dataSetSize,1)) - dataSet #将inX转换成与dataSet相同形状的数组 sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 sortedDistIndicies = distances.argsort() #argsort()函数用法:从小到大排序,取其索引值index输出 #print(sortedDistIndicies) classCount = {} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #print(classCount) sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse=True) #key=operator.itemgetter(1)意思是使用字典的第二个元素排序 return sortedClassCount[0][0]
classify0()函数的四个输入参数:inX是待分类的输入向量,dataSet是已知属性的样本集,labels是标签向量,k是选择最近邻居的数目。
import kNN group,labels = kNN.createDataSet() print('group = ',group,'\n','labels = ',labels) print(kNN.classify0([0,0],group,labels,3))
输出结果:
group = [[ 1. 1.1] [ 1. 1. ] [ 0. 0. ] [ 0. 0.1]] labels = ['A', 'A', 'B', 'B'] B
相关推荐
PeterHuang0 2019-12-11