《机器学习实战》读书笔记-1

#(本人开发工具为PyCharm,Python版本是3.5)

第二章 KNN

2.1 概述

k-紧邻算法的一般流程:

  1. 收集数据:可以使用任何方法
  2. 准备数据:距离计算所需要的数值,最好是结构化的数据格式
  3. 分子数据:可以使用任何方法
  4. 训练数据:此步骤不适应于k-紧邻算法
  5. 测试数据:计算错误率
  6. 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行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算法

对未知类别属性的数据集中的每个点依次执行以下操作:

  1. 计算已知类别数据集中的点与当前点之间的距离
  2. 按照距离递增次序排序
  3. 选取与当前点距离最小的k个点
  4. 确定前k个点所在类别的出现频率
  5. 返回前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