K-近邻算法
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型
解释:
标称型:标称型目标变量的结果只在有限目标集中取值,比如真与假(标称型目标变量主要用于分类)
数值型(连续型):数值型目标变量则可以从无限的数值集合中取值
工作原理
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。
K-近邻算法的一般流程
- 收集数据:可以使用任何方法
- 准备数据:距离计算所需要的数值,最好是结构化的数据格式
- 分析数据:可以使用任何方法
- 训练算法:此步骤不适用于k-近邻算法
- 测试算法:计算错误
- 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理
1、准备:使用Python导入数据
2、实施KNN分类算法
k-近邻算法将每组数据划分到某个类中,主要操作如下:
(1)计算已知类别数据集中的点与当前点之间的距离
(2)按照距离递增次序排序
(3)选取与当前点距离最小的k个点
(4)确定k个点所在类别出现的频率
(5)返回前k个点出现的频率最高的类别作为当前的预测分类
3、如何测试分类器
我们可以使用已知答案的数据,检验分类器给出的结构是否符合预期。
错误率是分析器给出错误的结果的次数除以测试执行的总数。
完美的分类器的错误率为0,最差的分类器的错误率是1.0
4、KNN示例代码:
from numpy import *
import operator
import numpy
def createDataSet():
group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
def classify0(inx, dataSet, labels, k):
dataSetsize = dataSet.shape[0]
# 获得dataSet的数据大小
diffMat = tile(inx, (dataSetsize, 1)) - dataSet
# tile函数是一种扩展矩阵函数,对于给定的值进行加行或加列
sqDiffMat = diffMat**2
# 计算所有的矩阵元素的平方
sqDistances = sqDiffMat.sum(axis=1)
# axis=1将一个矩阵的每一行向量相加,axis=0表示按列相加
distances = sqDistances ** 0.5
# 将矩阵上的每一个元素都开根号
sortedDistIndices = distances.argsort()
# argsort函数返回的是数组值从小到大的索引值,本数据为[2 3 1 0]即表示最小的是下表为2的数据,最大的为小标为0的数据
# 以上6行是用来计算距离的
classCount = {
}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]]
# 获取当前的标签
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
print(classCount[voteIlabel], classCount)
# get(voteilabel,0):原型为get(key,默认值),作用是获取key对应的值,如果不存在key,则新增key,值为默认值
sortedClassCount = sorted(
classCount.items(), key=operator.itemgetter(1), reverse=True)
# sorted(对象,排序值,reverse=True/False),reverse默认值为False,表示正序,reverse=True表示倒序。
# 按照每个key的值对每对keyvalue进行降序排序,operator.itemgetter(1):得到item中的第二个位置的值
return sortedClassCount[0][0]
group, labels = createDataSet()
print(group, "\n", labels)
test = classify0([0, 0], group, labels, 3)
print(test)
提示: 可以在不懂的地方将结果打印出来,看看每一个变量是怎么样的
示例:使用K-近邻算法改进约会网站的配对效果
使用K-近邻算法的具体流程
- 收集数据:提供文本文件
- 准备数据:使用Python解析文本文件
- 分析数据:使用Matplotlib画二维扩展图
- 训练算法:此步骤不适用于k-近邻算法
- 测试算法:使用提供的部分数据作为测试样本
测试样本与非测式样本的区别在于:测试样本是已经完成分类的数据,如果测试分类与实际类别不同,则标记为一个错误 - 使用算法:产生简单的命令行数据,然后输入一些特征数据以判断是否为想要的结果
1、准备数据:从文本文件中解析数据
在将特征数据输入到分类器之前,必须将数据的格式转变为分类器可以接受的格式。
2、分析数据:使用Matplotlib创建散点图
可以使用不同的颜色或标记来区分不同的样本,以便更好的理解数据信息。可以多试几组相关的信息