KNN:给出一个点,通过各属性与各点的距离值找出距离最近的k个点,用这k个点类别的出现频率来预测该点的类别。
对未知类别属性的数据集中的每个点依次执行以下操作:
- 计算已知类别数据集中的点与当前点之间的距离;
- 按照距离递增次序排序;
- 选取与当前点距离最小的k个点;
- 确定前k个点所在类别的出现频率;
- 返回前k个点出现频率最高的类别作为当前点的预测分类。
knn的缺陷:
- k-近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。
- 由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时。
- 无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。
以下为基础算法:
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # number of dataSet
diffMat = np.tile(inX, (dataSetSize,1)).astype('float64') - dataSet # tile(把inX重复number of dataSet次)
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort() # argsort函数返回的是数组值从小到大的索引值
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # get函数返回key对应value,如果值不在字典中返回默认值(0)
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]