import numpy as np import operator """ Parameters: 无 returns: group -数据集 labels -分类标签 """ #函数说明:创建数据集 def createDataSet(): #6组二维特征 group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]]) #6组特征的标签 labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片'] return group,labels """ Parameters: inX -用于分类的数据(测试集) dataSet - 用于训练的数据(训练集) labels -分类标签 k - KNN算法参数,选择距离最小的k个点 Returns: sortedClassCount[0][0] -分类结果 """ #函数说明:KNN算法,分类器 def classfy0(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0]#np函数shape[0]返回dataSet的行数,读取的是矩阵第一维度的长度 #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向) diffMat = np.tile(inX,(dataSetSize,1)) - dataSet sqDiffMat = diffMat ** 2#二维特征相减后平方 sqDistances = sqDiffMat.sum(axis=1)#sum()所有元素相加,sum(0)列相加,sum(1)行相加 distances = sqDistances ** 0.5#开方,计算出距离 #返回distances中元素从小到大排序后的索引值 sortedDistIndices = distances.argsort() classCount = {}#定一个记录类别次数的字典 #选择k个最近邻 for i in range(k): voteIlabel = labels[sortedDistIndices[i]]#取出前k个元素的类别 #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #python3中用items()替换python2中的iteritems() #key=operator.itemgetter(1)根据字典的值进行排序 #key=operator.itemgetter(0)根据字典的键进行排序 #reverse降序排序字典 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #返回次数最多的类别,即所要分类的类别 return sortedClassCount[0][0] if __name__ == '__main__': #创建数据集 group,labels = createDataSet() test = [101,20]#测试集 #KNN分类 test_class = classfy0(test,group,labels,3) #打印分类结果 print(test_class)
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序
(3)选取与当前点距离最小的k个点
(4)确定前k个点所在类别的出现频率
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
"""
tile 的用法
b = [1,3,5]
import numpy as np
np.tile(b,[2,3])
#>>>array([[1, 3, 5, 1, 3, 5, 1, 3, 5],
[1, 3, 5, 1, 3, 5, 1, 3, 5]])
argsort返回的是数组值从小到大的索引值
x = np.array([3,1,2])
np.argsort(x)
#>>>array([1, 2, 0], dtype=int64)
"""