概述
k近邻算法采用测量不同特征值之间的距离方法进行分类。
特点
- 优点:精度高、对异常值不敏感、无数据输入假定。
- 缺点:计算复杂度高、空间复杂度高。 适用数据范围:数值型和标称型。
原理:
Python程序解析
准备工作
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
group, labels = createDataSet()
print(group)
print(labels)
算法内容
#
# 用于分类的输入向量是inX,
# 输入的训练样本集为dataSet,
# 标签向量为labels ,
# 最后的参数k 表示用于选择最近邻居的数目,
# 其中标签向量的元素数目和矩阵dataSet 的行数相同。
#
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # 求数组的长度
# ❶(以下三行)距离计算
# 第二个参数的意思就是把inX补成有datasetsize行数的矩阵,
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
print("====================================")
print(diffMat)
sqDiffMat = diffMat **2 #diffMat相乘
print("====================================")
print(sqDiffMat)
sqDistances = sqDiffMat.sum(axis=1) # axis=1按照列求和,0是按照行求和
distances = sqDistances ** 0.5 # 开方,结果为[1.48660687 1.41421356 0.0 0.1 ]
print("====================================")
print(distances)
sortedDistIndicies = distances.argsort() # argsort把想向量中的每个元素进行排序 [2 3 1 0]
print("====================================")
print(sortedDistIndicies)
classCount = {}
# ❷ (以下两行)选择距离最小的k个点
#循环执行的过程,大概是分别对照,然后给AB计数
#dict_items([('B', 1)])
#dict_items([('B', 2)])
#dict_items([('B', 2), ('A', 1)])
#
for i in range(k):
# sortedDistIndicies=[2 3 1 0],sortedDistIndicies[i]取出的是第几个,labels取出的是对应的AB值
voteIlabel = labels[sortedDistIndicies[i]]
# classCount.get可以理解赋值默认值0,然后得到一个就加一,累加
classCount[voteIlabel]= classCount.get(voteIlabel, 0) + 1
# 根据元素的第二个排序,返回的结果[('B', 2), ('A', 1)]
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]#返回B
print(classify0([0,0], group, labels, 3))
pynum函数记录:
- shape shape属性:属性记录的是数组每一维的长度,a.shap得到的应该是一个tuple。
- numpy.tile(A,B)函数:将数组[1,2],在列重复3次,行重复2次
# 函数形式: tile(A,rep)
# 功能:重复A的各个维度
# 参数类型:
# - A: Array类的都可以
# - rep:A沿着各个维度重复的次数
print(numpy.tile([1,2],(3,2)))
#结果如下
[[1 2 1 2]
[1 2 1 2]
[1 2 1 2]]
- sum(axis=1)
group = array([[1, 2], [4, 5]])
print(group)
print(group.sum(axis=1))
# [[1 2]
# [4 5]]
# 0将数组的列相加[5 7],
# 1将数组的行相加[3 9]
print("====================================")
group = array([[1, 2], [3, 4], [5, 6]])
print(group)
print(group.sum(axis=0))
# [[1 2 ]
# [3 4 ]
# [5 6]]
# 0将数组的列相加[9,12],
# 1将数组的行相加[3,7,11]
- sorted(iterable, cmp=None, key=None, reverse=False)
http://www.cnblogs.com/65702708/archive/2010/09/14/1826362.html
#iterable:是可迭代类型;
#cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
#key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
#reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
#返回值:是一个经过排序的可迭代类型,与iterable一样
数学知识记录
向量:
矩阵相乘
百度吧。。。