概述
本文讲述K-NN算法的概念、工作原理以及例子。
一、概念
k-近邻算法,采用测量不同特征值之间的距离方法进行分类。
优点:精度高,对异常值不敏感,元数据输入假定。
缺点:计算发杂度高,空间复杂度高。
二、工作原理
存在一个样本数据集合,也称作训练样本集。并且样本集中每一数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应特征进行比较,然后提取样本集中特征最相似的数据(最近邻)的分类标签。一般我们只选择样本集中最相近的前K个数据。最后,选择k个最相似的数据中出现按次数最多的分类,作为新数据的分类。
三、例子
电影分类
假定k=3,则按照k-NN算法,判定电影是爱情片。
四、代码实现
1.创建kNN.py文件
from numpy import *
import operator
defclassify0(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.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group, labels
2.代码注释
1.numpy
NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。据说NumPy将Python相当于变成一种免费的更强大的MatLab系统。
2.operator库
本模块主要包括一些Python内部操作符对应的函数。比如operator.add(x,y)对应表达式:x+y。在这些函数里,一般是带前缀和后缀的下划线,在这里不带这些下划线的函数,也是合法的。这些函数主要分为几类:对象比较、逻辑比较、算术运算和序列操作。
3.numpy函数:shape用法
shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度
它可以作为单独的函数来使用,此时它的输入参数可以使一个整数表示维度,也可以是一个矩阵。
也可以作为矩阵的属性来使用,如arrayName.shape[0]表示矩阵的第一维长度(行数),arrayName.shaoe[1]表示矩阵的第二维长度(列数)。
3.numpy函数:tile()
格式:tile(A,reps)
* A: 输入的array
* reps: A沿各个维度重复的次数
举例:A=[1,2]
1. tile(A,2)
结果:[1,2,1,2]
2. tile(A,(2,3))
结果:[[1,2,1,2,1,2], [1,2,1,2,1,2]]
3. tile(A,(2,2,3))
结果:[[[1,2,1,2,1,2], [1,2,1,2,1,2]],
[[1,2,1,2,1,2], [1,2,1,2,1,2]]]
4.diffMat**2
矩阵中所有元素平方
5.numpy函数:sum()
两种用法,分别是作为单独的函数和作为矩阵的方法。
作为方法时:arrayName.sum(axis=0)或arrayName.sum(axis=1)
axis=0表示将矩阵的列元素全部相加,组成新的矩阵;axis=1表示将矩阵的行元素全部相加,组成新的矩阵
例如:>>>group = array([[1,2,3],[1,2,3]])
>>> group.sum(axis=0)
array([2, 4, 6])
>>> group.sum(axis=1)
array([6, 6])
6.numpy函数:argsort()
argsort函数返回的是数组值从小到大的索引值
Examples
>>> import numpy
--------
One dimensional array:一维数组
>>> x = np.array([3, 1, 2])
>>> np.argsort(x)
array([1, 2, 0])
Two-dimensional array:二维数组
>>> x = np.array([[0, 3], [2, 2]])
>>> x
array([[0, 3],
[2, 2]])
>>> np.argsort(x, axis=0) #按列排序
array([[0, 1],
[1, 0]])
>>> np.argsort(x, axis=1) #按行排序
array([[0, 1],
[0, 1]])
7.classCount.get(voteIlabel,0)
不存在相对应key值的value则返回0
8.python函数:sorted()
我们需要对List进行排序,Python提供了两个方法:对给定的List L进行排序,方法1.用List的成员函数sort进行排序,方法2.用built-in函数sorted进行排序
>>> help(sorted)
Help on built-in function sorted in module __builtin__:
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
返回值:是一个经过排序的可迭代类型,与iterable一样。