第二章 k-近邻算法
【参考书籍】机器学习实战(Machine Learning in Action)
本章内容:
- k-近邻分类算法
对未知类别属性数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。 - 从文本文件中解析和导入数据
- 使用Matplotlib创建散点图
归一化数值
归一化数值:处理不同取值范围的特征值时,通常采用的方法是将数值归一化,入将取值范围处理为0到1或者-1到1之间。将取值范围的特征值转化为0到1区间内的值:
newValue = (oldValue - min) / (max - min)
其中min和max分别是数据集中最小、最大特征值。评估算法的正确率:通常使用提供的已有数据的90%作为训练样本来训练分类器,而使用余下的10%的数据去测试分类器,检测分类器的正确率。
使用的函数
函数名/属性 | 功能 |
---|---|
array() | 创建一个数组 |
shape | 数组或矩阵的各个维的大小 |
tile(A, reps) | 将数组A,根据数组reps沿各个维度重复多次,构成一个新的数组。reps的数字从后往前分别对应A的第N个维度的重复次数。 |
sum(arr,axis=1) | 根据行列(轴),求和 |
max(arr,axis=1) | 根据行列(轴),求最大值 |
min(arr,axis=1) | 根据行列(轴),求最小值 |
mean(arr,axis=1) | 根据行列(轴),求平均值 |
argsort() | 得到矩阵中每个元素的排序序号 |
dict.get(key,default) | 获取字典中,一个给定的key对应的值。若key不存在,则返回默认值default。 |
sorted(iterable[, key][, reverse]) | 第一个参数是一个iterable,返回值是一个对iterable中元素进行排序后的列表(list)。 |
open(filename) | 返回一个文件对象 |
fr.readlines() | 读取文件对象fr中的所有行,返回数组 |
fr.readline() | 读取文件对象fr的当前行,返回字符串 |
len(arr) | 返回数组的长度 |
zeros((n,m)) | 创建一个n*m的矩阵,用0填充 |
line.strip() | 删除文本行line后的回车符 |
str.spit(‘\t’) | 使用’\t’分割字符串str,返回一个列表 |
list[-1] | 获取列表的最后一个元素 |
vec.append(item) | 在向量、列表vec后追加元素item |
mat[index, :] | 获取矩阵/数组的第index行的所有元素 |
list[m:n] | 获取列表索引m到n的元素的值 |
plt.figure() | 创建画布? |
fig.add_subplot((m,n,x)) | 把画布分割成m*n的区块,在第x块上绘图 |
scatter() | 绘制散点 |
格式化输出 | |
raw_input(“prompt string”) | 显示提示字符串,将用户的输入转换成string |
input(“prompt string”) | 会根据用户输入变换相应的类型,而且如果要输入字符和字符串的时候必须要用引号包起来 |
range() | range(1,5) #代表从1到5(不包含5); range(1,5,2) #代表从1到5,间隔2(不包含5); range(5) #代表从0到5(不包含5) |
listdir(‘folder’) | from os import listdir,获取给定文件夹下的文件名列表,不含文件路径 |
程序代码:
# coding=utf-8
# "coding=utf-8" 中间不要有空格,代码中有中文注释,需要添加第一行代码
from numpy import *
import operator
# from os import listdir 用于手写数字识别系统的测试代码
from os import listdir
# 导入测试数据
def createDataSet() :
dataSet = array([[1.0,1.1]
,[1.0,1.0]
,[0,0]
,[0,0.1]])
labels = ['A','A','B','B']
return dataSet, labels
# kNN算法
# inX: 用于分类的输入向量
# dataSet: 输入的训练样本集
# labels: 标签向量
def classify0(inX, dataSet, labels, k) :
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k) :
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][